java hashCode
来源:互联网 发布:ubuntu 卸载软件 编辑:程序博客网 时间:2024/05/31 05:28
" 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;}
0 0
- Java HashCode
- java hashCode
- Java hashCode
- Java HashCode
- Java HashCode
- Java hashCode
- JAVA HashCode
- Java HashCode
- 【Java】HashCode
- java hashcode()
- java hashCode
- java hashcode
- java hashcode
- Java hashCode
- java hashCode
- java hashcode
- Java hashcode
- 【java】hashCode
- HDU ACM 1007 Quoit Design 分治法求最近点对
- OpenDaylight Hydrogen版本应用SampleTap研究(一)
- 6个用于大数据分析的最好工具
- 【Java编程思想】(1)初始化与清理
- CVE-2015-3202 exploit demo
- java hashCode
- mysql存储过程循环语句简单例子
- 比较两个DataTable内容是否相等,先是比数量,数量相等就比内容
- zookeeper原理(转)
- 基于ORACLE数据库的循环建表及循环创建存储过程的SQL语句实现
- CGGeometry
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
- 黑马程序员---Java 装饰设计模式
- ajax