转换为Set时,List的大小会发生变化

时间:2014-01-24 16:30:12

标签: java collections arraylist set

我有一个ArrayList:

List<MyClass> xxx = new ArrayList<MyClass>(functionThatGetsAList());

当我测试xxx.size()时,我得到3,这是对的。然后我尝试演员:

Set<MyClass> yyy = new HashSet<MyClass>(xxx);

或者:

Set<MyClass> yyy = new HashSet<MyClass>();
yyy.addAll(xxx);

在这两种情况下yyy.size()都是1,它只复制第一个对象。为什么呢?

2 个答案:

答案 0 :(得分:1)

来自HashSet

的文档
  

布尔加法(E e)   如果指定的元素尚不存在,则将其添加到此集合中。

尝试将这些元素从列表添加到循环中的集合中。

确实是set.add(l);每次迭代都返回true?如果不是,我认为可以安全地假设您尝试添加到集合中的内容与hashcode确定的内容相同。如果是这种情况,则需要覆盖hashcode()。

答案 1 :(得分:0)

HashSet依赖于hashCode()中的Object方法。如果需要哈希码,则需要覆盖此方法。覆盖hashCode()时,还必须覆盖equals()。见What issues should be considered when overriding equals and hashCode in Java?