A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敏 中级黑马   /  2012-4-4 09:42  /  1816 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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的时候一个也不能添加成功?

4 个回复

倒序浏览
因为HashSet先判断两个对象的hashCode()值是否相等,
若相等则判断equals()方法,而你的c类中hashCode()值始终相同和equals()方法始终返回true,
也就是说HashSet会认为你的c类对象全部都是相同,所以添加不进去。
回复 使用道具 举报
本帖最后由 田啸 于 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类的对象全部是重复元素

回复 使用道具 举报
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

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

不能添加重复的,但是能添加一个吧,添加第二个才叫重复啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马