【问题标题】:Why doesn't addAll() support the addition of a collection's copy to the collection?为什么 addAll() 不支持将集合的副本添加到集合中?
【发布时间】:2015-09-12 02:21:48
【问题描述】:

在一个方法中,我进行了两次调用。第一次调用从另一个方法构造并返回一个哈希集。第二次调用将这个新构造的集合添加到现有集合中,作为参数传入此方法。

public static void someMethod(java.util.HashSet<Coordinate> invalidPositions)
{
    java.util.HashSet<Coordinate> newSet = SomeClass.getInvalidPositions(x, y);
    invalidPositions.addAll(newSet);
}

很多时候,传入的集合,已经存在的集合,会添加另一个内容与自身相同的集合!即setOne.equals(setTwo) == true

然而,JavaDocs 没有添加另一组,而是使用addAll()

public boolean addAll(Collection c)

将指定集合中的所有元素添加到此集合(可选操作)。 如果在操作正在进行时修改了指定的集合,则此操作的行为是未定义的。 (这意味着如果指定的集合是这个集合,并且这个集合是非空的,那么这个调用的行为是未定义的。)

我是否理解正确?如果两个集合相等,java会不支持一个相加吗?如果这是真的,是否有任何理由以这种方式设计语言?

【问题讨论】:

  • 甲可以踩乙的肩膀爬得更高。但是A不能踩A的肩膀去爬得更高。假设 B 是静止的;该操作不会改变 B 的状态。

标签: java collections set


【解决方案1】:

a.equals(b)a == b 不同。

javadoc 的意思是,如果您执行a.addAll(a),则行为未定义。做a.addAll(b)没有问题,只要它们是不同的实例。

【讨论】:

  • 谢谢。你知道为什么a.addAll(a) 有问题吗?
  • @Muno 因为正如 javadoc 所说:“如果在操作进行时修改了指定的集合,则此操作的行为是未定义的”。如果您执行a.addAll(a),它会开始向a 添加元素,在这种情况下,这也是javadoc 提到的“指定集合”。换句话说,您将从当前正在更改的集合中添加元素。此外,将集合添加到自身可能会创建一个无限循环(取决于集合的类型)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2011-10-17
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多