黑马程序员——equals方法和hashCode方法的问题
2011-12-20 18:23
288 查看
----------------------
android培训、java培训、期待与您交流! ----------------------
在没有看视频是之前自己是给hashCode和equals这两个方法搞的很晕,自己一直在想为什么重写hashCode的时候必须的重写equals方法,现在
看了视频终于真相大白了。
一般复写这两个方法的时候是在对象存进集合的时候。因为在存进集合的时候对象都会自己先生成一个hashCode的值,而在生成hashCode的
时候可能生成一样的hashCode的值(虽然这几机率非常的小但是还是会出现),当出现的hashCode的值一样时,就会在比较这两个对象的equals
方法,若这两个对象的equals也是一样的时候,后面的这个对象便不能放进集合,若是相同就可以放进集合,因为这两个对象不是同一对象
,而这个应该就是在集合中才会使用其他的地方基本很少用到。因为这样比较起来是比较耗时的。hashCode是底层调用的我们要想清楚的看
出就只能通过在hashCode中写输出语句。
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的
hashCode方法,所以通常要求hashCode方法和equals方法--并被同时覆盖。
通常来说一个类的两个实例对象用equals方法比较的结果相等时,他们的哈希吗也必须相等,但反之则不成立,即equals方法比较结果不想
等的对象可以有相同的哈希码或者说哈希码相同的两个对象的equals方法比较的结果可以不想等,例如,字符串"BB"和"Aa"的equals方法比
较的结果肯定是不想等的,但是它们的hashCode方法返回值却相等。
当一个对象被存储进HashSet集合中以后,就不能修改这个对象的那些参与计算哈希值的字段,否则对象修改后的哈希值与最初存储进
HashSet集合中的哈希值就不相等,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返
回找不到对象的结果,这也就回导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。
----------------------
android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
android培训、java培训、期待与您交流! ----------------------
在没有看视频是之前自己是给hashCode和equals这两个方法搞的很晕,自己一直在想为什么重写hashCode的时候必须的重写equals方法,现在
看了视频终于真相大白了。
一般复写这两个方法的时候是在对象存进集合的时候。因为在存进集合的时候对象都会自己先生成一个hashCode的值,而在生成hashCode的
时候可能生成一样的hashCode的值(虽然这几机率非常的小但是还是会出现),当出现的hashCode的值一样时,就会在比较这两个对象的equals
方法,若这两个对象的equals也是一样的时候,后面的这个对象便不能放进集合,若是相同就可以放进集合,因为这两个对象不是同一对象
,而这个应该就是在集合中才会使用其他的地方基本很少用到。因为这样比较起来是比较耗时的。hashCode是底层调用的我们要想清楚的看
出就只能通过在hashCode中写输出语句。
public int hashCode() { return name.hashCode()+age*37; 为什么这里的age要乘上一个三十七呢,这里的age其实乘以什么都没有关系,就是不要乘以1,因为怕当一个对象(name.hashCode ()+age)的值相加起来会和另外的对象的相等。 } public boolean equals(Object obj) { if(!(obj instanceof XXX)) return false; XXX xxx = (XXX)obj; return this.name.equals(xxx.name)&&& }补充:
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的
hashCode方法,所以通常要求hashCode方法和equals方法--并被同时覆盖。
通常来说一个类的两个实例对象用equals方法比较的结果相等时,他们的哈希吗也必须相等,但反之则不成立,即equals方法比较结果不想
等的对象可以有相同的哈希码或者说哈希码相同的两个对象的equals方法比较的结果可以不想等,例如,字符串"BB"和"Aa"的equals方法比
较的结果肯定是不想等的,但是它们的hashCode方法返回值却相等。
当一个对象被存储进HashSet集合中以后,就不能修改这个对象的那些参与计算哈希值的字段,否则对象修改后的哈希值与最初存储进
HashSet集合中的哈希值就不相等,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返
回找不到对象的结果,这也就回导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。
----------------------
android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
相关文章推荐
- hashcode和equals 简单的方法也可能引发问题
- Java 提高篇——equals() 与 hashCode() 方法详解 Java hashCode() 和 equals() 的若干问题解答
- 重写equals方法以及hashcode方法注意的问题
- HashMap和HashSet中hashCode()和equals()方法重写的问题
- hashset中equals和hashcode方法重写问题
- java基础之问题:请说出hashCode方法、equals方法、HashSet、HashMap之间的关系
- 黑马程序员-hashSet的存储、检索与hashCode和equals的问题
- hashCode和equals方法的问题
- "java.util.NoSuchElementException: No value present" 问题解决:重写hashCode 和 equals 方法
- Java提高篇——equals()与hashCode()方法详解
- 【Java基础】JAVA中重写equals()方法为什么要重写hashcode()方法?
- 基于jdk1.8的equals()与hashCode()方法详解
- java hashCode 和 equals 方法
- java对象通用方法之覆盖equals时请遵守通用约定、覆盖equals时总要覆盖hashCode、始终要覆盖toString、考虑实现Comparable接口
- Java 中正确使用 hashCode 和 equals 方法
- Java 中正确使用 hashCode 和 equals 方法
- hashCode和equals方法的理解
- JAVA中的equals()和hashCode()方法
- Java中的hashCode()方法与equals(Object)方法
- 使用commons-lang.jar包以及反射机制实现javabean的equals,hashCode和toString三个方法重写