为什么在ArrayList的括号中需要一个整数

8

我在某处看到过如下定义的java.util.List
List<String> myList = new ArrayList<String>(0);
有人能解释一下括号中的整数是干什么用的,以及怎样使用它吗?谢谢。


7
ArrayList是Java中的一个类,它可以动态地调整大小并存储对象。它实现了List接口,并且允许在列表中进行添加、删除和查找元素等操作。ArrayList使用数组来存储数据,并且可以根据需要自动增加容量以适应新元素的添加。在创建ArrayList对象时可以指定初始容量,以便更好地控制内存使用。 - Luiggi Mendoza
6个回答

6
参数决定了ArrayList的初始容量。ArrayList会在内部分配内存来容纳一定数量的对象,当你添加更多元素时,它必须分配更多的内存并将所有数据复制到新位置,这需要一些时间。因此,您可以猜测您将要放入ArrayList中的对象数量以帮助Java。
初始容量为0可能意味着程序员认为很少使用ArrayList,因此没有必要从一开始就为其分配内存。 [编辑]
为了澄清,在@LuiggiMendoza和@emory的讨论中指出,很难想象使用0作为初始容量会有什么意义。在大多数情况下,默认构造函数工作得很好。

1
一个初始大小为0可能意味着程序员认为ArrayList很少被使用。也许是这样,也许不是。这取决于具体实现。 - Luiggi Mendoza
1
一个可能有意义的边缘情况是 void print ( @ NotNullable List<Politician> allHonestPoliticians)。必须提供非空列表,但不预计会使用 add 方法。添加一个健全性检查 assert 0 == allHonestPoliticians . size ( ) : "BS" ; - emory
1
在你不知道初始容量是多少的情况下,只需使用默认构造函数,它的大小也将为0。 - Luiggi Mendoza
1
@LuiggiMendoza 我建议使用默认构造函数,但如果我正确阅读了OpenJDK的实现,那么默认构造函数的大小将为10。 - emory
1
@emory 如果你有一个真实的案例来证明用0容量初始化ArrayList比Java语言设计者提出的默认值10更好,我会接受我错了,你是正确的(不要告诉我10长度的数组比0长度的数组性能更差,当你有超过100MB的RAM可用时,这是无效的)。 - Luiggi Mendoza
显示剩余4条评论

2

定义ArrayList的初始容量。


1
我想这在我发布的文档中已经很清楚地定义了。也许OP的问题是:“为什么?” - Luiggi Mendoza

1

这是为了定义一个ArrayList的初始容量。

如果您不想传递大小参数,也没有问题,因为还有一个没有参数的构造函数。

每当您添加一个额外元素时,如果列表大小不允许添加,则List类将在Heap中创建另一个具有更大大小的List,并将旧的array的内容复制到其中,并删除旧的array

初始实例化中的容量可以创建List的精确大小,从而有助于在运行时不通过创建新的Lists、删除旧的Lists和复制内容来分配附加的内存块,从而提高性能。


0

它指定了列表的容量


0
不要混淆数组列表的大小容量
  • 大小是列表中元素的数量;
  • 容量是列表可以潜在地容纳多少元素,而无需重新分配其内部结构。

当您调用new ArrayList<String>(0)时,您正在设置列表的初始容量,而不是其大小。换句话说,以这种方式构造的数组列表在开始时为空。


1
另外,最好添加初始化ArrayList使用不同容量的优缺点。 - Luiggi Mendoza
1
我本可以做到,但问题不在于“使用不同容量初始化ArrayList的好处和陷阱”。 - Lion
嗯...我知道这可能是已经确立的术语,但是“size”不是有点误导吗?“满度”,“负载”,“空置”或“饱和度”不是更好吗? - asa9ohan

0

当用作时

List<String> strList = new ArrayList<String>(5);

它使用指定的初始容量构建一个空列表。

默认情况下,当没有指定时。

List<String> strList = new ArrayList<String>;

创建一个初始容量为十的空列表。

阅读此处

不要将其误解为ArrayList的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接