【问题标题】:Size of List changes when converted to Set转换为 Set 时 List 的大小发生变化
【发布时间】:2014-01-24 16:30:12
【问题描述】:

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

【问题讨论】:

  • 显示你的实际代码,数组列表中有什么?设置删除重复条目。因此,如果您有一个列表 {1,1,1},那么集合就是 {1}。
  • 看起来List&lt;MyClass&gt; xxx 中的MyClass 实例具有相同的哈希码,并且在其equals 方法的定义中也相同。
  • 我有十磅说你需要在MyClass 上实施equals()
  • 如果你实现equals,也要实现hashCode。

标签: java collections arraylist set


【解决方案1】:

来自HashSet的文档

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2017-06-18
      • 2012-05-21
      • 2022-11-05
      • 2016-09-28
      • 2013-01-11
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多