当前位置: 首页 > 面试题库 >

Java addAll(collection)与新的ArrayList(collection)

邵修诚
2023-03-14
问题内容

为什么我通过以下方式得到不同的行为:

  1. Collection col2 = new ArrayList(col);

  2. Collection col2 = new ArrayList();
    col2.addAll(col)

我正在与查看者一起工作,并且代码很复杂,并且我试图解释问题的“根源”。另一个有趣的事实是下一个…

//IF i use this code i have the correct behavior in my app:
public void updateCollection(Collection<Object> col) {
    this.objectCollection.clear();
    this.objectCollection.addAll(col);
}

//IF i use this code i have unexpected behavior in my app:
public void updateCollection(Collection<Object> col) {
    this.objectCollection=new ArrayList(col);
}

问题答案:

此代码有效:

public void updateCollection(Collection<Object> col) {
    this.objectCollection.clear();
    this.objectCollection.addAll(col);
}

但这会带来问题:

public void updateCollection(Collection<Object> col) {
    this.objectCollection=new ArrayList(col);
}

我怀疑您的第一种方法的这种变化会带来相同的问题:

public void updateCollection(Collection<Object> col) {
    this.objectCollection = new ArrayList();
    this.objectCollection.clear();
    this.objectCollection.addAll(col);
}

为什么?显然,您在某处使用了另一个对objectCollection的引用。在代码中的某个地方,另一个对象在说(例如):

myCopyOfObjectCollection = theOtherObject.objectCollection;

如果您使用的是吸气剂,那不会改变其基本行为-您仍在保留其他参考。

因此,如果在初次分配时,例如说集合包含{1、2、3},则应从以下内容开始:

  • this.objectCollection:{1,2,3}
  • that.copyOfObjectCollection:{1,2,3}

当您向this.objectCollection 分配一个 新的 ArrayList并使用{4,5,6}进行填充时,您将得到以下信息:

  • this.objectCollection:{4,5,6}
  • that.copyOfObjectCollection:{1,2,3}

“ that”仍指向原始ArrayList。



 类似资料:
  • 问题内容: 创建String 的最佳构造是什么?是(来自番石榴)还是? 只是个人喜好吗? 还是仅仅是Type泛型类型推断? 还是使用Lists.newArrayList()有任何理论或实践价值? 问题答案: 番石榴构建器保存多次键入type参数。比较: 但是在Java 7中,它已经过时了,因为您拥有菱形运算符:

  • 问题内容: 今天,当我获得一段已经使用了数百次的代码时,我很高兴地开始编码: 遍历一个Collection(这里是ArrayList) 由于某种原因,我实际上查看了Eclipse的自动完成选项,这让我感到奇怪: 在哪些情况下,以下循环比其他情况更好使用? 经典的数组索引循环: 迭代器具有next()/ next(): 我最喜欢的是因为它写起来很简单: 问题答案: 当您还需要元素的索引时,第一个很有

  • 问题内容: 我可能在这里找不到一个简单的单行代码,但这是我的问题: 如何检查ArrayList是否包含另一个ArrayList中的所有对象?我正在寻找(如果存在的话)类似的东西: 例如: 问题答案: 接口中有一个声明的方法。在您的设置中给出所需的答案。

  • 问题内容: 请帮助我了解下面写的两行之间的区别,我知道两者都是有效的,但是我想知道哪一个更好? 和 问题答案: 哪一个更好? 就个人而言,我喜欢使用第一个,因为我认为对我来说更清楚了,但这是您的个人喜好,其他人的确认为这是多余的。 有什么区别? 这两行之间没有什么区别,它们在Java 7中的含义相同(如果您的目标是Java 6,请使用第一个)。 [编辑]: 同样,正如Elliott Frisch指

  • 问题内容: 有一个ArrayList存储整数值。我需要在此列表中找到最大值。例如,假设arrayList存储的值为:,最大值为。 寻找最大值的有效方法是什么? @Edit:我只是找到一个不确定的解决方案 这将返回最大值。 比较每个值的另一种方法,例如 问题答案: 你可以使用轻松实现所需的内容- 高效阅读 -足够的 Javadoc for Collections.max 根据其元素的自然顺序返回给定

  • // 创建集合 collect([1, 2, 3]); // 返回该集合所代表的底层数组: $collection->all(); // 返回集合中所有项目的平均值: $collection->avg(); // 将集合拆成多个给定大小的较小集合: $collection->chunk(4); // 将多个数组组成的集合折成单一数组集合: $collection->collapse(); // 用