【问题标题】:Arraylist and Arrays数组列表和数组
【发布时间】:2012-02-14 18:59:24
【问题描述】:

有什么区别

ArrayList<Object> al = new ArrayList<Object>(100);

Object[] ar = new Object[100];

内部实现(即内存分配)有什么不同吗? 两者都在内存中内部保留 100 个插槽吗?

【问题讨论】:

  • ArrayList 是一个动态数组,类似于c++向量。任何基础书籍都会解释这些差异。
  • 我知道两者之间的基本区别是什么我指的是内部实现..已相应地编辑了问题..
  • 你为什么不为两者分别写一些示例代码;然后使用调试器查看内部实际发生的情况?

标签: java arraylist


【解决方案1】:

ArrayList 是一个List 实现,它在内部使用普通数组来存储和检索添加到列表中的对象。后者(Object[])是一个普通数组。

【讨论】:

    【解决方案2】:

    ArrayList&lt;Object&gt; 拥有支持 Object[]。如果您可能会溢出大小并且可以添加,则支持数组将被“调整大小”(将创建一个新数组并复制旧数据)。

    列表实现还提供了额外的方法来处理它们。

    另一件事是您可以将泛型(1.5) 与列表一起使用。

    【讨论】:

    • 问题中没有直接问到的一件事是ArrayList&lt;SomeClassOtherThanObject&gt; 会发生什么。在这种情况下,内部数组仍然是 Object[],而不是 SomeClassOtherThanObject[],因为已擦除。
    • 后备数组将被调整大小:实际上,由于数组无法调整大小,因此将创建一个新数组并复制旧数据。
    • @Thilo 好点我添加了这个。在有人误解其含义之前。
    • 看起来我无法用这个问题表达我想要表达的意思。我真正想知道的是 new Arraylist(100) 和 new AnyArray[100] 都在内部保留 100 * 内存中的对象大小?
    • @hakish:是的,他们有。 “100*对象大小”有点不清楚。他们为对象保留了一个包含 100 个插槽的数组(每个 4 个字节或 8 个字节,与对象的类型无关)。实际的对象存储在堆上的其他位置,并且没有为此保留任何内容。
    【解决方案3】:

    不,两者并不相同 在ArrayList &lt; Object &gt; al = new ArrayList&lt; Object &gt;(100); 中只需定义initialCapacity 在稍后您可以添加n 个元素 但是在Object[] ar = new Object[100]; 中,您不能在 100 大小之后添加元素

    【讨论】:

      【解决方案4】:

      ArrayList 可以在运行时动态增长或收缩,而数组不能。 ArrayList 是使用数组实现的列表。它为您提供了数组不提供的各种功能(基本上是列表操作)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 2016-06-19
        • 2013-05-17
        相关资源
        最近更新 更多