黑马程序员技术交流社区
标题:
改变HashSet集合中的元素的成员属性,是新建了一个对象吗?
[打印本页]
作者:
米中之玉
时间:
2013-8-1 16:10
标题:
改变HashSet集合中的元素的成员属性,是新建了一个对象吗?
本帖最后由 杨兴庭 于 2013-8-2 19:01 编辑
改变HashSet集合中的元素的成员属性,是新建了一个对象吗?为什么引用的地址值会改变,而且remove()时返回的是false?
作者:
王峰230321
时间:
2013-8-1 16:34
HashSet. 底层用的是哈希表. 而哈希表 是通过对属性方法的计算得来的. .. 张老师说过. 如果我们用哈希表做底层的集合的时候 . 存进去的东西 最好不用去改变属性. 因为该了属性. 哈希值就变了. . 而且删都删不掉. 因为他哈希值变了而你又不到新的哈希值..SO..
作者:
xuaner0719
时间:
2013-8-1 20:25
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也应该相同。
作者:
xwf4348
时间:
2013-8-1 21:46
HashSet. 底层用的是哈希表. 而哈希表 是通过对属性方法的计算得来的。你把属性变了,相应的Hash值就变了,然后地址值肯定相应的变了。你用原来的引用去remove,当然就返回false了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2