equals介绍:
equals方法在非空对象引用上实现相等关系
特点:
* 自反性:对于任何非空引用值x,x.equals(x)都返回true
* 对称性:对于任何非空引用值a、b,当且仅当a.equals(b)返回true时,b.equals(a)返回true
* 传递性:对于任何非空引用值x、y、z,当x.equals(y)返回true,并且y.equals(z)返回true时,则x.equals(z)返回true
* 一致性:对于任意非空引用值x、y,多次调用x.equals(y),其结果不变,前提是对象在上equals比较中用到的信息没有被修改
* 对于任意非空引用值x,x.equals(null)返回false
以上五点是重写equals方法时必须遵守的准则
equalsd的作用:
用来判断两个对象是否相等
equals()定义在JDK的Object.java中,通过判断两个对象的地址是否相等来区分它们是否相等
下面根据“类是否覆盖equals()方法”,将它分为2类。
(01) 若某个类没有覆盖equals()方法,当它的通过equals()比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。
(02) 我们可以覆盖类的equals()方法,来让equals()通过其它方式比较两个对象是否相等。通常的做法是:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。
由上边分类引出equals和==的区别:
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不试同一个对象。
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况
情况1:
类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象
情况2:
类覆盖了equals()方法。一般,我们都覆盖equals()方法来判断两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
hashCode的作用:
hashCode()的作用是获取哈希码,也成为散列码;它返回一个int整数,这个哈希码(散列码)的作用是确定该对象在哈希表中的索引位置
hashCode()定义在JDK的Object.java中,这就意味着java中的任何类都包含hashCode()函数,
虽然,每个Java类都包含hashCode() 函数。但是,仅仅当创建“类的散列表”时,该类的hashCode() 才有用,作用是:确定该类的每一个对象在散列表中的位置;
其它情况下(例如,创建类的单个对象,或者创建类的对象数组等等)类的hashCode() 没有作用。
散列表:
java集合中本质是散列表的类如:HashMap,HashTable,HashSet等
也就是说hashCode()在散列表中才有用,在其他情况下没用,在散列表中hashCode()的作用是获取对象的散列码,进而确定该对象在散列表中的位置
hashCode() 和 equals() 的关系:
* 此外,在这种情况下。若要判断两个对象是否相等,除了要使用equals()之外,也要使用hashCode()函数。否则,equals()无效。
例如,创建Person类的HashSet集合,必须同时覆盖Person类的equals() 和 hashCode()方法。