java hashCode
2015-06-03 13:51
190 查看
" hashcode是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象。"
我的理解hashcode是对象的哈希值(简单来讲,hashcode相当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致)
转载地址:http://blog.csdn.net/fenglibing/article/details/8905007
看以下的运行错误代码:
import java.util.HashSet; import java.util.Set; public class HashTest { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } public int hashCode() { return i % 10; } public static void main(String[] args) { HashTest a = new HashTest(); HashTest b = new HashTest(); a.setI(1); b.setI(1); Set<HashTest> set = new HashSet<HashTest>(); set.add(a); set.add(b); System.out.println(a.hashCode() == b.hashCode()); System.out.println(a.equals(b)); System.out.println(set); } }
结果为:
true //本来不应该相等的?//不是 false [com.xinhua.HashTest@1, com.xinhua.HashTest@1] //本来只能添加到集合中一个元素的,现在a和b都加入了。这是不正确的
以上的代码
以上这个示例,我们只是重写了hashCode方法,从上面的结果可以看出,虽然两个对象的hashCode相等,但是实际上两个对象并不是相等;我们没有重写equals方法,那么就会调用object默认的equals方法,是比较两个对象的引用是不是相同,显示这是两个不同的对象,两个对象的引用肯定是不定的。
这里我们将生成的对象a和b放到了HashSet中,而HashSet中只能够存放唯一的对象,也就是相同的(适用于equals方法)的对象只会存放一个,但是这里实际上是两个对象a,b都被放到了HashSet中,这样HashSet就失去了他本身的意义了。
所以必须重写equals方法
即加上如下equals方法(重写Object类的equals方法)
public boolean equals(Object object) { if (object == null) { return false; } if (object == this) { return true; } if (!(object instanceof HashTest)) { return false; } HashTest other = (HashTest) object; if (other.getI() == this.getI()) { return true; } return false; }
相关文章推荐
- java 静态导入
- 【Java编程思想】(1)初始化与清理
- Java中23种经典设计模式详解
- Java 中 HashMap 初始化时赋值
- Java读取配置文件
- Java消息服务 JMS
- LeetCode_12---Integer to Roman
- Java虚拟机 运行时数据区解析及用途
- Java学习篇之---byte与十六进制字符串之间互转
- java基础(五)--- 集合collection
- 疯狂Java学习笔记(71)----------volatile
- java中的初始化块和静态块
- Java中十六进制转换 Integer.toHexString()
- SpringMvc 集成 shiro 实现权限角色管理-maven
- java基础(四)
- java常量池概念 详解及用途
- Java中多态的实例
- 疯狂Java学习笔记(70)-----------挚爱Java
- selenium登录脚本
- java个人学习笔记:类属性,类方法