hashcode && equals && ==

2019-08-08  本文已影响0人  做自己的Yang光

HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。

JDK对equals(Object obj)和hashcode()这两个方法的定义和规范: 在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法,因为他们是在Object类中定义的。equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。 hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。

两个最重要的重要规范(不止两个): 

规范1:若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。

规范2:如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。

根据这两个规范,可以得到如下推论: (充分不必要)

1)、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。

2)、如果两个对象不equals,他们的hashcode有可能相等。

3)、如果两个对象hashcode相等,他们不一定equals。

4)、如果两个对象hashcode不相等,他们一定不equals。 

java运行时环境是怎样判断HashSet和HastMap中的两个对象相同或不同了:先判断hashcode是否相等,再判断是否equals。 

参考:https://www.cnblogs.com/xiohao/p/4199446.html

Object类定义中对hashCode和equals要求如下:

1)如果两个对象的equals的结果是相等的,则两个对象的hashCode的返回结果也必须是相同的。

2)任何时候覆写equals,都必须同时覆写hashCode。

参考《码出高效》P177

1.equals和==

1)==用于比较引用和比较基本数据类型时具有不同的功能:

比较基本数据类型,如果两个值相同,则结果为true

比较引用时,如果引用指向内存中的同一对象,结果为true;

2)equals()作为方法,实现对象的比较。由于==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。因此我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。

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。

上一篇下一篇

猜你喜欢

热点阅读