我有一个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,它只复制第一个对象。为什么呢?
答案 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?