一、关于hashCode()
hashCode()是 Java 中Object类的一个原生方法,每个 Java 对象都默认继承了这个方法。它的核心作用是返回一个int 类型的哈希值(也叫散列码),这个值是根据对象的内存地址或内容计算出来的整数。hashCode()的存在主要是用于快捷查找,如Hashtable,HashMap等,hashCode()用来在散列存储结构中确定对象的存储地址。如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同。如果对象的equals方法被重写,那么对象的hashCode()方法也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致。两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里“。
重写了equals(),为什么还要重写hashCode()呢?
想想,你要在一个桶里找东西,你必须先要找到这个桶,重写hashcode()就是用来找到桶,光重写equals()没啥用。
二、关于equals()
2.1、equals和==
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
比较引用时比较的是地址,如果引用指向内存中的同一对象,结果为true;
equals()方法实现对象的比较。由于==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。因此我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。
2.2、object类的equals()方法的比较规则
如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date, java.lang.string, 包装类(Integer,Double等)。
String s1=new String("abc"); String s2=new String("abc"); System.out.println(s1==s2); System.out.println(s1.equals(s2)); 运行结果为false true