hashcode理解
来源:互联网 发布:主播用什么软件直播 编辑:程序博客网 时间:2024/06/06 01:17
官方文档定义
hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。 hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) 当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
从定义来看,总结出几个要点
hashcode的作用
hashcode主要是应用在hashtable中的查找以及排序中的,根据我查阅资料猜想 使用hashcode进行和查找可以类比于在set集合中抽象为不同的桶。一个桶表示hashcode相同的对象。查找是先基于hashcode进行比较找到对应的桶。然后在进行equel(Object o)进行比较。hashcode()和equel(Object o)的区别
从面向对象的概念来说两个对象是否相同就是通过equel(Object o)方法进行判断。两个对象不相同那么equel(Object o)调用的结果就是false。但是hashcode()返回的值可能相同。
如果两个对象相同那么equel(Object o)调用的结果就是true,hashcode()返回的值一定相同。
所以就算重写equel和hashcode方法也需要满足这两个定义
以下贴出一个小例子
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 final 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); }}
输出结果
truefalse[com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]
在这个例子中,我们将唯一标识符进行一个%运算生成一个hashcode
看起来并不复杂,但是最基本就是要符合hashcode()方法的要求。
equel(Object o)没有重写,默认的是比较两个对象内存位置是否相同,所以两个对象在这里是不同的。set集合保存了这两个对象。
接下来我们来重写equel(Object o)方法 通过Id唯一标识符进行判断对象是否相同
public class HashTest { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } 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; } public int hashCode() { return i % 10; } public final 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); }}
输出结果
truetrue[com.ubs.sae.test.HashTest@1]
可以看出当Id相同时,两个对象被判定为相同且HashSet表中也只能储存一个。
当equel(Object o)认为两个对象相同时,hashcode也相同
http://blog.csdn.net/fenglibing/article/details/8905007
- 理解 hashCode()
- hashCode 理解
- 理解hashcode
- 理解hashcode
- hashcode理解
- 对hashCode的理解
- hashCode() 和 equals() 理解
- HashCode理解--3
- 深入理解HashCode(转)
- 理解 equals,hashcode
- equals,hashCode 方法理解
- 【ThinkingInJava】52、理解hashCode
- java HashCode()方法理解
- 对HashCode的理解
- hashCode的理解
- equals,hashCode 方法理解
- HashCode深入理解
- HashCode深入理解
- BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛
- java里那些依赖关联 组合聚合的关系
- 面向对象及组件开发(七)传统选项卡和面向对象选项卡编写
- 求知过程之spring-wind-版本号 验证码
- 一篇文章全面解析大数据批处理框架Spring Batch
- hashcode理解
- iOS开发关于oc运行时 isa指针详解
- Swift--01数据声明
- Foundations of Machine Learning 内容整理 —— Introduction
- 水流波动效果的进度条
- Android底部bottom的渐变实现
- Android背景渐变色(shape,gradient)
- python面试相关
- tomcat的热部署和热加载(无需重启tomcat自动重新生成class文件)