我想知道一些事情。
就是这样:
List <String> list = new ArrayList<String>();
list.add("abc");
list.add(null);
等于此
List <String> list = new ArrayList<String>();
list.add("abc");
内存使用情况?
谢谢!
答案 0 :(得分:5)
ArrayList的initial capacity是十(引用)。也就是说,即使你的集合中只有一个条目,底层数组的大小也是十。这些引用将默认为null,因此将第二个引用设置为null既不会影响arraylist的内部状态(就基础数组而言)也不会影响其内存消耗。
如果您添加了第11个项(设置为null),ArrayList
将扩展其容量,因此您将消耗更多内存,而是因为ArrayList具有为String
引用创建了额外的存储桶。
从上面链接的文档:
每个ArrayList实例都有一个容量。容量是大小 用于存储列表中元素的数组。它总是在 至少与列表大小一样大。随着元素被添加到 ArrayList,其容量自动增长。增长的细节 除了添加元素之外,没有指定策略 持续摊销的时间成本。
答案 1 :(得分:0)
在这种情况下是,因为ArrayList默认分配一个包含10个位置的数组(在openjdk中)。
如果您使用的是LinkedList,那么答案就是否。
答案 2 :(得分:0)
也许,第一个列表有两个元素,第二个列表有一个元素,所以第一个列表更大。但是大多数列表默认为10个元素,两个列表的大小可能相同,但如果第二个添加需要扩展列表,则需要更多内存。
答案 3 :(得分:0)
嗯,“这取决于”。
使用你在那里的代码,在Sun JVM上运行,以及他们实现ArrayList的方式,答案是“是”,它们是相同的。
这是因为默认情况下,ArrayList以10个元素的数组开始。赔率是大多数实现做同样的事情。
但是如果你有一个包含10个元素的ArrayList,而另一个包含11个元素,那么元素是否为null,11元素会消耗更多RAM,因为用于跟踪元素的内部数组会扩展。
最后,如果您使用不同的List实现(例如LinkedList),那么这两个列表将消耗不同的内存量,因为LinkedList不预先分配任何内容并使用节点包装器作为其元素。
答案 4 :(得分:0)
在这种特定情况下,使用带有两个元素的ArrayList。
ArrayList的初始容量是10个元素,因此只要添加10个或更少的元素,ArrayList本身的大小就相同(内存大小,而不是 size())。添加第11个元素时,ArrayList必须增加内部存储空间,从而占用更多内存。
答案 5 :(得分:0)
编辑:改变了主意。 正如许多人所说,是的,他们首先会占用相同数量的内存,一旦你添加足够的空值到达初始容量的点,你将增加你的内存大小。
我最初认为,因为你可以访问第一个列表中的null,它会导致更多内存,但是在两种情况下都存在空值,并且访问它们的能力不会影响内存分配。
答案 6 :(得分:-2)
两者都不是等于。
list [abc,null]
存储了另一个列表
list [abc]
所以两者都不相等