当前位置: 首页 > 知识库问答 >
问题:

List addAll(List)然后aList.clear():如果实现不是ArrayList也不是LinkedList,我会得到null吗?[副本]

郎聪
2023-03-14

List接口不强制复制Javadoc中添加的元素,但ArrayListLinkedList都复制它们(如果我正确理解源代码的话)。

那么,clear()在此代码中添加的列表安全吗?我想不是吧?

@Test
void test() {
    List<MyObject> original = new ArrayList<>();
    original.add(new MyObject("John", 1));
    original.add(new MyObject("David", 2));

    List<MyObject> newList = new LinkedList<>(); // or ArrayList, both can pass the test, but not sure about other impl.
    newList.addAll(original);
    original.clear();
    System.gc();
    for (MyObject o: newList) {
        assertThat(o, CoreMatchers.notNullValue());
    }
}

在代码检查中,看到这样的问题,添加的列表在addAll()之后被清除,不确定我是否可以让它通过。

共有1个答案

巫欣荣
2023-03-14

LinkedList.addAll()和ArrayList.addAll()都将元素复制到新列表中。AddAll()在内部调用Array(),而ArrayList.AddAll()调用arraycopy()。

因此,对original.clear()的调用应该只影响original而不影响newlist。

我可以想到一个行为略有不同的列表实现:copyonwritearraylist.addall()有一个异常,所以如果源是另一个copyonwritearraylist,它只接受源的数组。但是,所有的写操作,包括清除,都是从头开始的。所以最后,clear()上的行为应该仍然是相同的。

 类似资料: