Java 列表的大小在转换为集合时发生更改

Java 列表的大小在转换为集合时发生更改,java,collections,arraylist,set,Java,Collections,Arraylist,Set,我有一个ArrayList: List<MyClass> xxx = new ArrayList<MyClass>(functionThatGetsAList()); 或者: Set<MyClass> yyy = new HashSet<MyClass>(); yyy.addAll(xxx); Set yyy=new HashSet(); yyy.addAll(xxx); 在这两种情况下,yyy.size()都是1,它只复制第一个对象。为什么

我有一个ArrayList:

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

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

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

来自

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

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


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

HashSet
依赖于
对象中的
hashcode()
方法。如果需要哈希代码,则需要重写此方法。重写
hashCode()
时,还必须重写
equals()
。请参见

显示实际代码,数组列表中有什么?让我们删除重复的条目。因此,如果你有一个列表{1,1,1},那么这个集合就是{1}。看起来你的
list xxx
中的
MyClass
的实例有相同的散列码,并且根据它的
equals
方法的定义是相同的。我有10英镑,说如果你实现equals,你需要在
MyClass
上实现
equals()
,还要实现hashCode。
Set<MyClass> yyy = new HashSet<MyClass>();
yyy.addAll(xxx);