黑马程序员技术交流社区

标题: 一个HashSet问题 [打印本页]

作者: 李敏    时间: 2012-4-4 09:42
标题: 一个HashSet问题
import java.util.*;

class a{
        public int hashCode() {
                return 1;
        }
}
class b{
        public boolean equals(Object obj) {
                return true;
        }
}
class c{
        public int hashCode() {
                return 1;
        }
        public boolean equals(Object obj) {
                return true;
        }
}
public class hashSetDemo {
        public static void main(String[] args) {
                HashSet hs=new HashSet();
                hs.add(new a());
                hs.add(new a());
                hs.add(new b());
                hs.add(new b());
                       hs.add(new c());
                hs.add(new c());
                boolean b=hs.add(new c());
                boolean b1=hs.add(new c());
                System.out.println(b+"..."+b1);
                System.out.println(hs.size());
                Iterator it=hs.iterator();
                while(it.hasNext()){
                        System.out.println(it.next());
                }
        }
}
觉得c应该在哈希值为 1  的位置添加成功一个。为什么在添加c的时候一个也不能添加成功?
作者: 陈超    时间: 2012-4-4 09:57
因为HashSet先判断两个对象的hashCode()值是否相等,
若相等则判断equals()方法,而你的c类中hashCode()值始终相同和equals()方法始终返回true,
也就是说HashSet会认为你的c类对象全部都是相同,所以添加不进去。
作者: 田啸    时间: 2012-4-4 09:59
本帖最后由 田啸 于 2012-4-4 10:17 编辑

HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;
如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。

a类中hasCode相同,然后调用Object里的equals,判断两个 new a() 不是重复元素
b类中hasCode不同,因此两个 new b() 不是重复元素
c类中hasCode全部相同且为equals 永远为true,则 c类的对象全部是重复元素


作者: yangshang1    时间: 2012-4-4 10:24
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
作者: 李敏    时间: 2012-4-4 10:38
田啸 发表于 2012-4-4 09:59
HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是 ...

不能添加重复的,但是能添加一个吧,添加第二个才叫重复啊。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2