Java中hashCode和equals方法的比较
2014-10-23 23:00
483 查看
一、equals
首先我们要明白equals和hashcode方法都是从object类中继承过来的。
equals()方法在object类中定义如下:
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们必需清楚,String 、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。
很明显,这是进行的内容比较,而已经不再是地址的比较,这也是我们程序设计者想要的。
二、hasdcode
其实是hasdCode方法,在object类中定义如下:
说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double等等这些类都是覆盖了hashcode()方法的。
例如在String类中定义的hashcode()方法如下:
三、equals和hashcode方法的区别
这里我们首先要明白一个问题:
equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。
反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。
四、总结
在java的集合中,判断两个对象是否相等的规则是:
1、判断两个对象的hashCode是否相等
①如果不相等,认为两个对象也不相等,完毕
②如果相等,转入2
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2、判断两个对象用equals运算是否相等
①如果不相等,认为两个对象也不相等
②如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,所以必须用第2条准则进行限制,才能保证加入的为非重复元素。
以上内容是结合网上资料加上本人理解所写的,希望对你有帮助!
首先我们要明白equals和hashcode方法都是从object类中继承过来的。
equals()方法在object类中定义如下:
public boolean equals(Object obj) { return (this == obj); }
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们必需清楚,String 、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
很明显,这是进行的内容比较,而已经不再是地址的比较,这也是我们程序设计者想要的。
二、hasdcode
其实是hasdCode方法,在object类中定义如下:
public native int hashCode();
说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double等等这些类都是覆盖了hashcode()方法的。
例如在String类中定义的hashcode()方法如下:
public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; }
三、equals和hashcode方法的区别
这里我们首先要明白一个问题:
equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。
反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。
四、总结
在java的集合中,判断两个对象是否相等的规则是:
1、判断两个对象的hashCode是否相等
①如果不相等,认为两个对象也不相等,完毕
②如果相等,转入2
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2、判断两个对象用equals运算是否相等
①如果不相等,认为两个对象也不相等
②如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,所以必须用第2条准则进行限制,才能保证加入的为非重复元素。
以上内容是结合网上资料加上本人理解所写的,希望对你有帮助!
相关文章推荐
- JAVA中自定义对象比较时重写equals()方法的同时要重写hashcode()方法
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- [Java]hashCode和equals方法的比较
- JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法
- java 中 == 和 equals()方法的 比较
- Java进阶:深入equals方法对象相等比较
- Java中“equals比较为true,那么hashcode就一定相等”这条真理探秘!
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
- Java中Object类的equals()和hashCode()方法深入解析
- java中equals方法和“==”的比较
- 深入java的equals方法,怎么比较两个对象的内容是否相等?对象的内容指的是什么?
- java 重写类的equals方法和hashcode方法
- java中equals方法和“==”的比较
- Java Collection框架在Collection的生命周期中需要基于不变字段的equals()和hashCode()方法
- Java软件低级错误(十 四):定义equals方法的同时也要定义hashCode方法
- toCharArray()方法 和 Java中比较两个字符串是否相等equals方法
- java中的比较:instanceof、equals(hashcode)、==
- java中重写Object类的equals方法和Hashcode方法的注意事项
- Java中equals()与hashCode()方法完全解惑
- Java Class 中hashCode()和equals方法