当前位置: 首页 > 知识库问答 >
问题:

数组列表的容量和数组大小之间的区别

督飞鸣
2023-03-14

我在核心Java一书中读到了下面的片段。

将数组列表分配为新的ArrayList<'Employee>(100)//容量为100

与分配新数组不同,因为new Employee[100]//大小为100

数组列表的容量和数组的大小之间有一个重要的区别。如果分配一个数组有100个条目,那么该数组就有100个插槽,可以使用。一个容量为100个元素的数组列表有可能容纳100个元素(事实上,以额外重新分配为代价,容纳超过100个元素);但在开始时,甚至在它的初始构造之后,数组列表根本不包含任何元素。

当我看到源代码数组列表时,构造函数创建了一个给定容量的对象数组,该对象数组可以容纳给定容量的元素(下面是代码片段)。

html" target="_blank">public ArrayList(int initialCapacity) {
     super();
     if (initialCapacity < 0)
         throw new IllegalArgumentException("Illegal Capacity: "+
                                            initialCapacity);
     this.elementData = new Object[initialCapacity];
 }

我无法弄清楚作者在上述文本中提到的实际区别。

共有2个答案

芮安顺
2023-03-14

ArrayList只是表示抽象列表的一种方法,ArrayList的容量是系统如何实现逻辑列表的实现细节。

ArrayList通过使用实际数组“隐藏”来存储列表的元素。数组在计算机内存中的实际实现在分配时有一定的大小;这个大小就是ArrayList的容量。ArrayList通过在固定长度数组之外存储列表的逻辑长度来模拟可变大小的列表。因此,如果您有一个容量为10的ArrayList包含4个逻辑元素,那么ArrayList可以表示为一个长度和一个数组

(4)e1 e2 e3 e4___________

其中(4)是列表的逻辑长度,“__”表示由于不是逻辑列表的一部分而被忽略的数据。如果您尝试访问这个ArrayList的第5个元素,它会抛出一个异常,因为它知道第5个元素还没有初始化。然后,如果我们在列表中附加一个额外的元素e5,则ArrayList变成

(5)e1 e2 e3 e4 e5_________

注意,容量没有改变,而逻辑长度改变了,因为基础数组仍然能够处理逻辑列表中的所有数据。

如果您设法将十个以上的元素添加到此列表中,ArrayList将不会中断。ArrayList是一个抽象,目的是兼容所有数组操作。相反,当ArrayList的逻辑长度超过其原始容量时,ArrayList会更改其容量。如果我们将元素(a1,a2,...,a7)添加到上面的列表中,那么得到的ArrayList可能如下所示

(12)e1 e2 e3 e4 e5 a1 a2 a3 a4 a5 a6 A7_______________

可容纳20人。

一旦创建了ArrayList,就可以忽略接下来所有编程中的容量;逻辑不受影响。但是,系统在某些种类的操作下的性能会受到影响。例如,增加容量可能涉及分配更大的数组,将第一个数组复制到第二个数组中,然后执行操作。与对链表的相同操作相比,这可能相当慢。因此,明智的做法是将ArrayList的容量选择为大于或至少与实际运行时环境中预期的元素的实际数量相当。

弘靖琪
2023-03-14

如果使用arr=new employee[100]分配新数组,则该数组的大小(arr.lengty)将为100。它有100个元素。所有元素最初都是空的(因为这是一个对象引用的数组),但仍然有100个元素。

如果执行类似list=new ArrayList (100) 的操作,并尝试检查list.size(),将得到0。列表中没有元素。

在内部,arraylist确实在需要扩展其容量之前分配了足够的位置来放置100个项目,但这是一个内部实现细节,列表将其内容显示为“没有项目存储”。只有在实际执行list.add(something)时,列表中才会有项目。

因此,尽管列表预先分配了存储,但它与程序通信的API告诉您其中没有项。其内部数组中的空项对您不可用-您无法检索或更改它们。

 类似资料:
  • 问题内容: Java中的List和Array有什么区别?或Array和Vector之间的区别! 问题答案: 通常(在Java中),数组是一种数据结构,通常由存储对象集合的顺序存储器组成。 是Java中的接口,这意味着它可能具有多种实现。这些实现之一是,这是一个使用数组作为数据结构来实现接口行为的类。 还有许多其他实现该接口的类。查看它们的一种简单方法是查看以下位置的Javadoc :http :

  • 可能重复: 原始数组与ArrayList 在java中,列表和数组有什么区别?或数组和矢量之间的区别!

  • 问题内容: 声明 Array 和 Dictionary的 更好方法,我都使用了: 对我来说,编码方面的速度非常快,但实际上两者在编译器和性能方面有何不同,我们应该遵循哪一个? 问题答案: 从Swift上的iOS开发者库… Swift数组的类型完整写为Array ,其中Element是允许数组存储的值的类型。您还可以将简写形式的数组类型写为[Element]。尽管 这两种形式在功能上是相同的 ,但

  • 本文向大家介绍数组和指针之间的区别,包括了数组和指针之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解数组和指针之间的区别。 数组 它存储具有同类数据类型的变量的值。 它可以生成一个指针数组。 它支持数组的概念。 可以生成一个指针数组。 它指的是由相同/相同数据类型的元素组成的集合。 它使用下标/'[]'(方括号)来访问元素。 它是指向集合的第一个元素的指针。 数组对象无法实

  • 本文向大家介绍数组和结构之间的区别,包括了数组和结构之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解数组和结构之间的区别。 数组 它指的是由相同/相同数据类型的元素组成的集合。 它使用下标/'[]'(方括号)来访问元素。 它是指向集合的第一个元素的指针。 数组对象无法实例化。 数组的大小基于数组中元素的数量是固定的。 此大小是元素数量与每个元素的大小的乘积。 数组中不能使用

  • 我正在尝试编写一个日历。我将我的约会保存在另一个ArrayList中的两个不同的ArrayList中。 字符串(Subject,Place,People)进入另一个ArrayList=arstr中的第一个ArrayList 整数(Date和Time)进入另一个ArrayList=arInt中的第二个ArrayList 当我创建约会时,我希望根据日期对其进行排序。所以如果我想添加一个新的约会,它应该