Java equals() hashCode() 用法
来源:互联网 发布:淘宝上的彩妆正品店 铺 编辑:程序博客网 时间:2024/05/16 23:35
java的超类java.lang.Object 有两个非常重要的方法定义:
public boolean equals(Object obj)public int hashCode()
理解他们是及其重要的,特别是当用户自定义的objects添加到Maps的时候,但是有些高水平的开发者有时候也不明白怎么恰当的使用它们,在这篇文章中,我会首先给出一个常见的错误的例子,然后解释equals()和hashcode()是如何工作的。
一个常见的错误
在下边这个例子中体现:
import java.util.HashMap; public class Apple {private String color; public Apple(String color) {this.color = color;} public boolean equals(Object obj) {if (!(obj instanceof Apple))return false;if (obj == this)return true;return this.color.equals(((Apple) obj).color);} public static void main(String[] args) {Apple a1 = new Apple("green");Apple a2 = new Apple("red"); //hashMap stores apple type and its quantityHashMap<Apple, Integer> m = new HashMap<Apple, Integer>();m.put(a1, 10);m.put(a2, 20);System.out.println(m.get(new Apple("green")));}}
在这个例子中,绿苹果对象成功存储在HashMap中,但是当重新取出这个对象时,这个对象却找不到了,上边的程序打印的是null,但是我们可以肯定的是这个对象已经存储在hashmap中了。
由hashCode()导致的问题
这个问题是有没有重写hashCode()导致的,equals()和hashCode()之间的规则是:
1、如果两个对象是相等的,那么他们必须具有相同的 hash code。
2、如果两个对象有相同的hash code,他们或许并不相等。
Map的思想是查找对象要比线性查找更快,使用hashed keys 来定位需要查找的对象需要两步。Map的内部存贮以二维数组的形式类似的方式存储对象,第一个数组的索引是key的hashcode()之后的值。对第二个层数组的查找是利用equals()进行线性比较来确定对象是否存在。
对象中默认实现的hashcode()对不同的对象返回不同的整数。因此,在上边的例子中,不同的对象(即使是相同的类型)都有不同的hashCode()。
hash code 就像是一对需要存储的货物,不同的货物存储在不同的仓库中。与放在同一个仓库相比,不同的货物放在不同的仓库中显然更高效。所以平均的分配hashcode是很好的习惯。(虽然这不是主要的观点)
解决的方法是增加hashCode方法,这里我只增加了color的长度来作为一个演示
public int hashCode(){return this.color.length();}
原文链接:http://www.programcreek.com/2011/07/java-equals-and-hashcode-contract/
1 0
- Java equals() hashCode() 用法
- equals()和hashcode()用法
- Java Object equals() & hashCode()
- java--equals与hashcode
- java hashCode equals关系
- JAVA HashSet equals hashcode
- java hashCode() 和 equals()
- Java - hashCode() - equals()
- java 中的hashcode&equals
- java hashCode()和equals()
- java hashcode和equals
- 【java】equals()与hashCode()
- Java equals()和hashCode()
- java,hashcode,equals
- java hashcode equals
- Java object equals hashcode
- java hashmap equals() hashcode()
- java equals hashCode
- MySQL笔记
- 数组拷贝 Array.copyof()方法与 System.arraycopy()方法
- ewq
- Maven-配置链接到私服及设置本地仓库
- 【bzoj3398】【Usaco2009 Feb】【Bullcow 牡牛和牝牛】【组合数学】
- Java equals() hashCode() 用法
- YARN源码学习(七)-----Task级别GC相关指标的自定义counter添加
- 停车场管理系统主要方法代码
- iOS --- 使用AVFoundation的AVAudioPlayer来播放音频
- iOS真机调试(XCode 7)无需购买开发者计划
- JSON.stringify()JSON转字符串 和 JSON.parse()字符串转JSON对象
- 美团2016面试总结
- 教程分享:如何实现Android沉浸式状态栏——教你让你的状态栏变个色!
- Illegal modifier for the variable str; only final is permitted的错误的深入理解