【问题标题】:addAll to Set is not adding the values in javaaddAll to Set 没有在java中添加值
【发布时间】:2012-11-05 10:26:31
【问题描述】:

我在 Object(Obj1) 中有一个属性

Set<AssignedService> serviceList;
public Set<AssignedService> getServiceList();

在某些情况下我正在执行以下操作

Obj1.getServiceList().clear();
Obj1.getServiceList().addAll(services);

其中还设置了服务

但我看到的最终结果是服务集有 4 个对象/数据元素 但是 Obj1.getServiceList() 在 addAll 之后返回一个空集

这里有什么问题。 AssignedService 对象是否存在问题,因为它没有实现 IComparable

【问题讨论】:

  • 是的,实现 Comparable&lt;AssignedService&gt; 会很好(并且很高兴有正确的 equals 和 hashCode 方法)。您可以检查 services.size()。应该是 0。否则我会期望至少有一个元素。也许您在空捕获的某个地方忽略了异常。您没有使用只读的 Collections.emptySet() 进行初始化?
  • Collections.emptySet() 那是什么
  • Collections.emptySet()(和List,...)来创建一个类型安全的不可修改的零元素集。同样,一个元素有 Collections.singleton... 函数。
  • (1)serviceList的实现类是什么? (2) services 里有什么?调试应该会有所帮助。

标签: java collections set add


【解决方案1】:

你应该先在.equals()上阅读这个excellent piece

然后,正如其他人指出的那样,检查您在 AssignedService 类上对 equals() .hashcode() 的实现。最有可能在这里找到根本原因。

您还可以检查 .addAll(...) 调用的返回值 - false 表示底层 Set 未被方法调用修改。

干杯,

【讨论】:

  • 我猜这个问题可能是同一个问题。但是我的 Class 是 Hibernate 的 Entity 类。我担心如果我编写这些额外的方法,它可能会影响整个应用程序,因为我们在交付结束时。有没有办法通过编写匿名内部类来实现这种特定情况。使用 JDK 1.6
  • @Entity类中覆盖equals(...)hashCode()没有问题。
  • 在 hashCode 中,我可以在 hashCode() 方法中调用 return super.hashCode() 还是需要写一些东西。
  • 快速回答:不!更长的答案:这取决于您对具体班级的平等概念。在非常广泛的术语中,您应该根据您定义 equals() 的相同属性生成哈希码 - 请阅读我提到的链接,它非常简洁地解释了一切!
【解决方案2】:

检查 AssignedService 中 equals() 的实现。

Set:不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如其名称所暗示的那样,此接口对数学集抽象进行建模。

【讨论】:

  • 缺少equals() 并不能解释空结果集。
  • 如果 equals 总是返回 true,则不会将任何元素添加到集合中——可能除了第一个。
  • 显然有数百个错误会导致这种行为,包括 getServiceList() 在每次请求时返回一个新的空集。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2011-06-27
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多