object本身的hashcode方法将对象内部地址转化为整数作为HashCode。
这主要是因为object的equals()方法比较的正是内存地址,为了保证当A.equals(B)时也有A.hashcode=B.hashcode(),故有这样的策略。
在不覆盖默认方法的前提下,同时创建两个相同对象时,hashcode是不一样的。这样在处理hashtable时用object作为key时就会很麻烦。
java自己包装的object比如string这些都重写了equals方法和hashcode方法,不再是用对象内部地址转化为整数,而是保证两个相同对象的hashcode是一致的。
string的hashcode方法为
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
Integer的hashcode方法为
public int hashCode() {
return value;
}
为了方便做hash时的便利,我们自己建立新对象时也建议重写equals方法和hashcode方法(个人倾向于同时改写,以符合当A.equals(B)时也有A.hashcode=B.hashcode()这个逻辑)。当然从效率出发,如何设计一个hashcode方法避免散列冲突就是另外一个难题,就不在本文的讨论范围内了。
分享到:
相关推荐
关于hashCode()和equals()的本质区别和联系.doc
1,如果两个对象相同,那么它们的hashCode值一定要相同; 2,如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 3,HashCode码不唯一
计算机后端-Java-Java核心基础-第24章 集合01 23. 关于hashCode()和equals()的重写.avi
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。 hashCode 的常规协定是: 在Java应用程序执行期间...
实际上,hashcode根本不能代表object的内存地址。
深入 HashCode 方法~~~~~
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 hashCode()和equals()定义在Object类中,这...
hashcode的作用.doc hashcode的作用.doc hashcode的作用.doc
重写equals和hashcode方法,学习和进步
1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 例如内存中有这样的位置 0 1 2 3 4 5 6 7 而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode...
hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有……
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的
java中Hashcode的作用
java中hashCode()的理解
深入HashCode 最近学习HashCode的小结与整理,希望对大家有帮助
利用反射绕过编译器和hashcode高级应用