正如标题所说,我想知道add方法是否复制了元素并将副本添加到ArrayList中,或者出于明显的性能原因将引用复制到对象。谢谢!
答案 0 :(得分:1)
不,没有复制或克隆。引用本身被添加到列表中纯粹而简单:
442 public boolean add(E e) {
443 ensureCapacityInternal(size + 1); // Increments modCount!!
444 elementData[size++] = e; // **********
445 return true;
446 }
在第444行,您会看到实际引用被放置为ArrayLists的内部数据数组的项目。
否则该集合将不起作用,因为它不包含对感兴趣的实际对象的引用,而是包含副本。顺便说一下,所有这些都可以通过查看驱动程序src.zip或在线here上可用的源代码来解答。另外,您的帖子建议添加副本可以提高性能。如果是这样,你为什么这么认为?
修改强>
在评论中你说:
也许我被误解了,我的意思是复制对象的引用会更快。
与做什么相反?我不确定你想要的其他选项。对象由引用表示,因此没有其他方法可以传递它们。
答案 1 :(得分:1)
/**
* Appends the supplied element to the end of this list.
* The element, e, can be an object of any type or null.
*
* @param e the element to be appended to this list
* @return true, the add will always succeed
*/
public boolean add(E e)
{
modCount++;
if (size == data.length)
ensureCapacity(size + 1);
data[size++] = e;
return true;
}
来自Source for java.util.ArrayList。不完全是来自马的嘴但应该接近。