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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-8-2 19:01 编辑

改变HashSet集合中的元素的成员属性,是新建了一个对象吗?为什么引用的地址值会改变,而且remove()时返回的是false?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

3 个回复

倒序浏览
HashSet. 底层用的是哈希表. 而哈希表 是通过对属性方法的计算得来的.   ..  张老师说过.  如果我们用哈希表做底层的集合的时候 .  存进去的东西 最好不用去改变属性. 因为该了属性. 哈希值就变了. . 而且删都删不掉. 因为他哈希值变了而你又不到新的哈希值..SO..

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
HashSet按Hash算法来存储集合的元素,因此具有很好的存取和查找性能。

HashSet的特点:
(1)HashSet不是同步的,多个线程访问是需要通过代码保证同步
(2)集合元素值可以使null。

HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值也相等。

  • //类A的equals方法总是返回true,但没有重写其hashCode()方法
  • class A
  • {
  •     public boolean equals(Object obj)
  •     {
  •         return true;
  •     }
  • }
  • //类B的hashCode()方法总是返回1,但没有重写其equals()方法
  • class B
  • {
  •     public int hashCode()
  •     {
  •         return 1;
  •     }
  • }
  • //类C的hashCode()方法总是返回2,但没有重写其equals()方法
  • class C
  • {
  •     public int hashCode()
  •     {
  •         return 2;
  •     }
  •     public boolean equals(Object obj)
  •     {
  •         return true;
  •     }
  • }
  • public class TestHashSet
  • {
  •     public static void main(String[] args)
  •     {
  •         HashSet<Object> books = new HashSet<Object>();
  •         //分别向books集合中添加2个A对象,2个B对象,2个C对象
  •         books.add(new A());
  •         books.add(new A());
  •         books.add(new B());
  •         books.add(new B());
  •         books.add(new C());
  •         books.add(new C());
  •         System.out.println(books);
  •     }
  • }
程序运行结果:
  • [B@1, B@1, C@2, A@b5dac4, A@9945ce]

即使2个A对象通过equals比较返回true,但HashSet依然把它们当成2个对象;即使2个B对象的hashCode()返回相同值,但HashSet依然把它们当成2个对象。即如果把一个对象放入HashSet中时,如果重写该对象equals()方法,也应该重写其hashCode()方法。其规则是:如果2个对象通过equals方法比较返回true时,这两个对象的hashCode也应该相同。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
HashSet. 底层用的是哈希表. 而哈希表 是通过对属性方法的计算得来的。你把属性变了,相应的Hash值就变了,然后地址值肯定相应的变了。你用原来的引用去remove,当然就返回false了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马