在OSChina 中看到了一篇文章<Java 中正确使用 hashCode 和 equals 方法>,看到 hashCode 的方法体内的31比较有意思. 在Stackoverflow上找到了解释,但没完全看明白,大概意思是说31这个值是一个奇素数,只是一个默认的传统.并不一定要用31.但是这个数可以通过位移的方式来处理乘法,获得一些性能上的优化,虚拟机会自动做这些优化. Stackoverflow 引用地址:http://stackoverflow.com/questions/299304/…
1.顺序表的问题 查找和去重效率较低 对于这样的顺序表来说,如果需要查找元素,就需要从第一个元素逐个检查,进行查找.对于需要去重的存储来说,每次存入一个元素之前,就得将列表中的每个元素都比对一遍,效率相当低. 1.1.解决思路 我们注意到在这里的顺序表中列表中的每个元素都有一个与之对应的索引,不过这里的索引只是与元素所在的位置有对应关系,也就是说: 索引与顺序表中的位置有一一对应关系,但是与位置中的元素没有必然的联系.如果有某种方式能够建立这样的一个关系: 如图中所示,也就是说每个元素与其在顺序…
为什么要重写hashCode() 和 equals() equals() 默认的Object类里面equals()方法是根据对象所在的内存来做判断的,如果两个对象引用指向的是同一个内存,则返回true,但是,在某些场景一下,我们不想这么苛刻,比如是String类的equals(),只是判断了String.value的值,String其它的属性是不参与判断的,所以我们比较字符串的时候只是比较其中的内容,下面是String的equals()方法和hashCode()方法. public boolea…
package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复 |---HashSet:底层数据结构是哈希表 | HashSet是如何保证元素唯一性呢? | 是通过两个方法来完成的 hashCode 和 equals来完成的 | 如果元素的hashCode值相同,才会判断 equals 是否为true | 如果hashCode值不相同,不会调用…
1. hashCode 1.1 基本概念 hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置. hashCode() 方法是超级类 Object类 提供的一个方法,所有类都可以对该方法进行重写. 1.2 为什么重写 equals()方法 要重写 hashCode()方法 hashCode() 相等是两个对象相等的必要非充分条件. equals() 相等是两个对象相等的充要条件. 重写 equals()方法 一定要重写 hash…
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 11. 重写equals方法时同时也要重写hashcode方法 在每个类中,在重写 equals 方法的时侯,一定要重写 hashcode 方法.如果不这样做,你的类违反了…
1 equals方法 Object类中默认的实现方式是  :   return this == obj  .那就是说,只有this 和 obj引用同一个对象,才会返回true. 而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯一性.这样我们在实现自己的类时,就要重写equals. 按照约定,equals要满足以下规则. 自反性:  x.equals(x) 一定是true 对null:  x.equals(null) 一定是false 对称性:  x.equals(y)  和…
 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals() hashcode()和equals()都继承于object,在Object类中的定义为: equals()方法在Object类中的定义: public boolean equals(Object obj){     return (this == obj); } equals()的定义为: public native int hashCode(); 是一个本地方法,返回的对象的地址值.  1.hash…
在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCode方法. 先让我们来看看Object类源码 /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided…
原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html 首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof Strin…