带有一个String的列表是否等于(在内存使用中)列出一个String和一个null对象?

时间:2012-01-03 14:40:59

标签: java list

我想知道一些事情。

就是这样:

    List <String> list = new ArrayList<String>();
    list.add("abc");
    list.add(null);

等于此

    List <String> list = new ArrayList<String>();
    list.add("abc");

内存使用情况?

谢谢!

7 个答案:

答案 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]

所以两者都不相等