hashcode,一个不太好理解,也常被我们忽视的一个概念。然而,hashcode还有对我们有用的东西。
java给我们提供了两种判断对象对等的方式。如果我们判断两个对象是否相等,那么直接用“==”运算就可以了。然而,判断两个对象对等,就没有那么简单了。
在java中,我们常常通过equals()方法来判断两个对象的对等。其实,我么还可以通过hashCode()来判断两个对象的对等。
看下面的例子:
import java.util.List;
public class MyBag{
float money;
List books;
}
我们如何判断两个MyBag对象是对等的呢?也就是说,如果有两个MyBag的对象bag1和bag2,通过什么的办法能说明这个两个对象是相同的呢?
先声名两个概念:
两个对象相等,指的是,两个引用指向了同一个对象,也就是说,指向了内存中的同一个地址。
两个对象相同(对等),指得是两个对象的任何属性都相等,但是,不是一个对象。
所以,对于上面的MyBag的对象对等,那么,两个对象的money要一样,同时,books要对等。那么如何去判断呢?我们通常会自己去实现equals()方法去判断,方法如下:
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final MyBag other = (MyBag) obj;
if (books == null) {
if (other.books != null)
return false;
} else if (!books.equals(other.books))
return false;
if (Float.floatToIntBits(money) != Float.floatToIntBits(other.money))
return false;
return true;
}
我们也可以通过实现hashCode()来实现:
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((books == null) ? 0 : books.hashCode());
result = prime * result + Float.floatToIntBits(money);
return result;
}
那么我们判断两个对象对等时,就可以这样来实现了:
if(bag1.equals(bag2)){
// 对等
}
或者
if(bag1.haseCode()==bag2.hashCode()){
// 对等
}
为什么这种方式也能判断两个对象对等呢?
因为,任何一个对象的hashCode是唯一的,并且和气对象属性按照一定的规则相关的。
比如,一个Integer的hashCode值就是其整数值,因为Integer的haseCode()是这样实现的:
public int hashCode() {
return value;
}
public boolean equals(Object obj) {
if (obj instanceof Integer)
return value == ((Integer) obj).intValue();
else
return false;
}
由此可以看到,也对象的HashCode是和其属性有一定的联系,规则和属性的值有一定的联系,这个规则决定了有相同的hashcode,就有两个对象的属性对等。
http://www.blogjava.net/zhyiwww/archive/2008/04/22/194845.html
分享到:
相关推荐
实际上,hashcode根本不能代表object的内存地址。
PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的
深入 HashCode 方法~~~~~
hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有……
hashcode、equals、==总结1简单总结.txt,他们之间的区别
hashcode的作用.doc hashcode的作用.doc hashcode的作用.doc
1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 例如内存中有这样的位置 0 1 2 3 4 5 6 7 而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode...
重写equals和hashcode方法,学习和进步
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
深入HashCode 最近学习HashCode的小结与整理,希望对大家有帮助
java中hashCode()的理解
java中Hashcode的作用
1,如果两个对象相同,那么它们的hashCode值一定要相同; 2,如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 3,HashCode码不唯一
利用反射绕过编译器和hashcode高级应用
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
hashcode与eqault比较,详细讲解了hashcode和eqault的区别
解析Java对象的equals()和hashCode()的使用