美文网首页
hashcode && equals && ==

hashcode && equals && ==

作者: 做自己的Yang光 | 来源:发表于2019-08-08 19:02 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:hashcode && equals && ==

          本文链接:https://www.haomeiwen.com/subject/dckfjctx.html