3

我打开了 java.util.ArrayList 源代码,但我无法理解一件事:如果 ArrayList 参数化,为什么 elementData[] 数组是 Object 类型?

public class ArrayList<E> extends ... {
  .........
  private transient Object[] elementData;
  .........
  public boolean add(E e) {/*More code*/}
}

问题:为什么不将 elementData 定义为:

private transient E[] elementData

*有什么优点和缺点?

4

1 回答 1

1

每次创建原始类型的列表时,例如:

列表<MyObject>列表 = 新的 ArrayList <MyObject>();

构造函数将所有数据转换为必须是 Object[] 数组的数组,在:

public ArrayList(Collection <? extends E>c) { elementData = c.toArray(); ...

我认为这是因为 ArrayList 可以在没有原始类型的情况下进行初始化,例如:

列表列表 = 新的 ArrayList();

    list.add(new String("VALUE"));
    list.add(new Integer("1"));

    for (Object c : list) {
        System.out.println(c.toString());
    }

你可以在里面放不止一种类型的对象。

此外,ArrayList 使用

Arrays.copyOf(elementData, size);

管理一些操作,这将返回一个 Object[]。

你也可以像保罗所说的那样看看这里这里。

于 2013-04-16T20:56:09.633 回答