List接口不强制复制Javadoc中添加的元素,但ArrayList
和LinkedList
都复制它们(如果我正确理解源代码的话)。
那么,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()之后被清除,不确定我是否可以让它通过。
LinkedList.addAll()和ArrayList.addAll()都将元素复制到新列表中。AddAll()在内部调用Array(),而ArrayList.AddAll()调用arraycopy()。
因此,对original.clear()的调用应该只影响original而不影响newlist。
我可以想到一个行为略有不同的列表实现:copyonwritearraylist.addall()有一个异常,所以如果源是另一个copyonwritearraylist,它只接受源的数组。但是,所有的写操作,包括清除,都是从头开始的。所以最后,clear()上的行为应该仍然是相同的。
问题内容: 如果我有 然后,如果我创建 并执行 自行车的速度也会改变吗?如果没有,那有什么办法吗? 问题答案: 是的,它将改变。Java Assignment操作仅创建对该对象的新 引用 。换句话说写类似 会 不会 复制对象中的所有值。objectA和objectB都指向该类的相同 实例 。 如果要复制对象的所有值,则应查看克隆
我通常使用“IsNotNone”来测试对象是否为空。我看到的代码只是使用“if对象”。它们是一样的吗? 例如, VS
问题内容: 我发现自己同意返回接口而不是具体的类。 原因很简单,我要松散耦合。 但是还会有其他影响或权衡吗? 问题答案: 对于List或ArrayList之类的类型,不应进行任何编译,并且应将List提升Code返回到接口。 如果这是通过诸如CopyOnWriteArrayList之类的并发包进行的,并且您使用的是addIfAbsent之类的方法(未在List接口中定义),您将发现自己受到限制。
我发现自己同意返回一个接口,而不是一个具体的类。