(Java)ArrayList <obj> </obj>中add(obj o)方法的内部工作

时间:2014-08-24 01:10:03

标签: java performance arraylist copy add

正如标题所说,我想知道add方法是否复制了元素并将副本添加到ArrayList中,或者出于明显的性能原因将引用复制到对象。谢谢!

2 个答案:

答案 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。不完全是来自马的嘴但应该接近。