关于equals()、hashCode()、==问题 问题1:自己写的类怎样覆盖equals()、hashCode()?问题2:equals()、hashCode()、==它们三者的关系?前面5人10分/人,问题解决结贴 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。equals():它是用于进行两个对象的比较的,是对象内容的比较,当然也能用于进行对象参阅值的比较。什么是对象参阅值的比较?就是两个参阅变量的值得比较,我们都知道参阅变量的值其实就是一个数字,这个数字可以看成是鉴别不同对象的代号。两个对象参阅值的比较,就是两个数字的比较,两个代号的比较。这种比较是默认的对象比较方式,在Object这个对象中,这种方式就已经设计好了。所以你也不用自己来重写,浪费不必要的时间。对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间: * 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 * 反射性:x.equals(x)必须返回是“true”。 * 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 * 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 * 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。hashCode():这个函数返回的就是一个用来进行赫希操作的整型代号,请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。后者不仅仅是个代号还具有在内存中才查找对象的位置的功能。hashCode()所返回的值是用来分类对象在一些特定的收集对象中的位置。这些对象是HashMap, Hashtable, HashSet,等等。这个函数和上面的equals()函数必须自己设计,用来协助HashMap, Hashtable, HashSet,等等对自己所收集的大量对象进行搜寻和定位。这些收集对象究竟如何工作的,想象每个元对象hashCode是一个箱子的编码,按照编码,每个元对象就是根据hashCode()提供的代号归入相应的箱子里。所有的箱子加起来就是一个HashSet,HashMap,或 Hashtable对象,我们需要寻找一个元对象时,先看它的代码,就是hashCode()返回的整型值,这样我们找到它所在的箱子,然后在箱子里,每个元对象都拿出来一个个和我们要找的对象进行对比,如果两个对象的内容相等,我们的搜寻也就结束。这种操作需要两个重要的信息,一是对象的 hashCode(),还有一个是对象内容对比的结果。hashCode()的返回值和equals()的关系如下: * 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。 * 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。为什么这两个规则是这样的,原因其实很简单,拿HashSet来说吧,HashSet可以拥有一个或更多的箱子,在同一个箱子中可以有一个或更多的独特元对象(HashSet所容纳的必须是独特的元对象)。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。 设计这两个函数所要注意到的:如果你设计的对象类型并不使用于收集性对象,那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法,任何用户一时用不到的功能,就先不要设计,以免给日后功能扩展带来麻烦。如果你在设计时想别出心裁,不遵守以上的两套规则,那么劝你还是不要做这样想入非非的事。我还没有遇到过哪一个开发者和我说设计这两个函数要违背前面说的两个规则,我碰到这些违反规则的情况时,都是作为设计错误处理。当一个对象类型作为收集型对象的元对象时,这个对象应该拥有自己处理equals(),和/或处理hashCode()的设计,而且要遵守前面所说的两种原则。equals()先要查null和是否是同一类型。查同一类型是为了避免出现ClassCastException这样的异常给丢出来。查 null是为了避免出现NullPointerException这样的异常给丢出来。如果你的对象里面容纳的数据过多,那么这两个函数 equals()和hashCode()将会变得效率低。如果对象中拥有无法serialized的数据,equals()有可能在操作中出现错误。想象一个对象x,它的一个整型数据是transient型(不能被serialize成二进制数据流)。然而equals()和hashCode()都有依靠这个整型数据,那么,这个对象在serialization之前和之后,是否一样?答案是不一样。因为serialization之前的整型数据是有效的数据,在serialization之后,这个整型数据的值并没有存储下来,再重新由二进制数据流转换成对象后,两者(对象在serialization 之前和之后)的状态已经不同了。这也是要注意的。 我觉得简单一点就是: java约定: x.equals(y)返回true的时候,x.hashCode()与y.hashCode()就必须相等.== 就是两个引用指向的是同一个对象. 我觉得简单一点就是: java约定: x.equals(y)返回true的时候,x.hashCode()与y.hashCode()就必须相等.== 就是两个引用指向的是同一个对象. 我觉得简单一点就是: java约定: x.equals(y)返回true的时候,x.hashCode()与y.hashCode()就必须相等.== 就是两个引用指向的是同一个对象. ==,,,比较值是否相等,比如变量的值或是对象的值(对象的地址)equals,,,比较两个对象的内容是否相等(对象所引用的内容)hashCode,,,变量的值或对象内容的哈希码 故在更改了equals()方法后, 一定要记得修改hashCode()方法. 否则就会出问题啦. public class AlwaysA{ public int hashCode(){ return 10; }//新曙光 public static void main(String args[]){ Object k=new Object(); System.out.println(k); AlwaysA h=new AlwaysA(); System.out.println(h); AlwaysA g=new AlwaysA(); System.out.println(g); }}//www.xinshuguang.org更多内容,请看视频 hashcode 各equals 配合才使元素不重复 equals 对像比较== 是值比较 equals 比较内容hashcode 比较哈希马== 比较引用。当你重写equals方法时,最好也重写hashcode方法,因为当在比较对象的时候,只重写equals会无法比较。 在Object类中,equals和== 是一样的,都是判断是否同一个对象,只有一些类重写了equals后,才开始判断对象的值是否相等 1、equals 比较内容,可以人为定义 对于源代码中的注释什么symmetric,transitive,我认为有点扯淡,当然纯属个人意见。目前我发现的equals 可用于比较两条记录的主键是否相同。2、hashcode 比较哈希码,不同的对象可以有相同的hashcode 3、== 引用比较。两个引用完全指向相同的对象,等号成立。下面是我的测试代码: Object a = new Integer(3); Object b = new Integer(3); System.out.println(a.hashCode()+" "+b.hashCode()); System.out.println(a==b); System.out.println(a.equals(b));返回结果:3,3truefalse 晕,结果写反了返回结果: 3,3 falsetrue equals()用来比较字符串比较好==用来比较数值 基本类型用==,对象引用的话用equals(),多用于字符串的比较。 为什么15楼的System.out.println(a==b);这句返回的是false呀,,??? JSP、ASP高手进来救我!奉献全部分数!! 帮忙指点下两种对象初始化式的区别。。。 我英国的同学,需要大家帮忙写一个程序 系统托盘的C/S程序,高手请进....... 怎么我得程序一用到Array类就发生错误啊??? java代码如何实现画改变颜色的实体圆? java mina 服务器和 c++ 客户端通讯的问题 问一个数据库问题:怎么用sql语句来更改一张数据表的名字? 请问:线程安全什么意思? 米卢能再现神奇吗? N多文本文件,有什么好的办法把他们合并为一个文件吗? lucene索引为何无法删除,请各位大虾帮看看原因在哪里?
equals():它是用于进行两个对象的比较的,是对象内容的比较,当然也能用于进行对象参阅值的比较。什么是对象参阅值的比较?就是两个参阅变量的值得比较,我们都知道参阅变量的值其实就是一个数字,这个数字可以看成是鉴别不同对象的代号。两个对象参阅值的比较,就是两个数字的比较,两个代号的比较。这种比较是默认的对象比较方式,在Object这个对象中,这种方式就已经设计好了。所以你也不用自己来重写,浪费不必要的时间。
对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间: * 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
* 反射性:x.equals(x)必须返回是“true”。
* 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
* 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
* 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。hashCode():
这个函数返回的就是一个用来进行赫希操作的整型代号,请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。后者不仅仅是个代号还具有在内存中才查找对象的位置的功能。hashCode()所返回的值是用来分类对象在一些特定的收集对象中的位置。这些对象是HashMap, Hashtable, HashSet,等等。这个函数和上面的equals()函数必须自己设计,用来协助HashMap, Hashtable, HashSet,等等对自己所收集的大量对象进行搜寻和定位。这些收集对象究竟如何工作的,想象每个元对象hashCode是一个箱子的编码,按照编码,每个元对象就是根据hashCode()提供的代号归入相应的箱子里。所有的箱子加起来就是一个HashSet,HashMap,或 Hashtable对象,我们需要寻找一个元对象时,先看它的代码,就是hashCode()返回的整型值,这样我们找到它所在的箱子,然后在箱子里,每个元对象都拿出来一个个和我们要找的对象进行对比,如果两个对象的内容相等,我们的搜寻也就结束。这种操作需要两个重要的信息,一是对象的 hashCode(),还有一个是对象内容对比的结果。hashCode()的返回值和equals()的关系如下: * 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
* 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。
为什么这两个规则是这样的,原因其实很简单,拿HashSet来说吧,HashSet可以拥有一个或更多的箱子,在同一个箱子中可以有一个或更多的独特元对象(HashSet所容纳的必须是独特的元对象)。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。
如果你设计的对象类型并不使用于收集性对象,那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法,任何用户一时用不到的功能,就先不要设计,以免给日后功能扩展带来麻烦。如果你在设计时想别出心裁,不遵守以上的两套规则,那么劝你还是不要做这样想入非非的事。我还没有遇到过哪一个开发者和我说设计这两个函数要违背前面说的两个规则,我碰到这些违反规则的情况时,都是作为设计错误处理。当一个对象类型作为收集型对象的元对象时,这个对象应该拥有自己处理equals(),和/或处理hashCode()的设计,而且要遵守前面所说的两种原则。equals()先要查null和是否是同一类型。查同一类型是为了避免出现ClassCastException这样的异常给丢出来。查 null是为了避免出现NullPointerException这样的异常给丢出来。
如果你的对象里面容纳的数据过多,那么这两个函数 equals()和hashCode()将会变得效率低。如果对象中拥有无法serialized的数据,equals()有可能在操作中出现错误。想象一个对象x,它的一个整型数据是transient型(不能被serialize成二进制数据流)。然而equals()和hashCode()都有依靠这个整型数据,那么,这个对象在serialization之前和之后,是否一样?答案是不一样。因为serialization之前的整型数据是有效的数据,在serialization之后,这个整型数据的值并没有存储下来,再重新由二进制数据流转换成对象后,两者(对象在serialization 之前和之后)的状态已经不同了。这也是要注意的。
equals,,,比较两个对象的内容是否相等(对象所引用的内容)
hashCode,,,变量的值或对象内容的哈希码
故在更改了equals()方法后, 一定要记得修改hashCode()方法. 否则就会出问题啦.
public int hashCode(){
return 10;
}//新曙光
public static void main(String args[]){
Object k=new Object();
System.out.println(k);
AlwaysA h=new AlwaysA();
System.out.println(h);
AlwaysA g=new AlwaysA();
System.out.println(g);
}
}//www.xinshuguang.org
更多内容,请看视频
== 是值比较
hashcode 比较哈希马
== 比较引用。
当你重写equals方法时,最好也重写hashcode方法,因为当在比较对象的时候,只重写equals会无法比较。
对于源代码中的注释什么symmetric,transitive,我认为有点扯淡,当然纯属个人意见。
目前我发现的equals 可用于比较两条记录的主键是否相同。2、hashcode 比较哈希码,不同的对象可以有相同的hashcode 3、== 引用比较。两个引用完全指向相同的对象,等号成立。下面是我的测试代码: Object a = new Integer(3);
Object b = new Integer(3);
System.out.println(a.hashCode()+" "+b.hashCode());
System.out.println(a==b);
System.out.println(a.equals(b));返回结果:
3,3
true
false
返回结果:
3,3
false
true
==用来比较数值
System.out.println(a==b);
这句返回的是false呀,,???