从内存的角度来看哪一个更好String [] / List <string> </string>

时间:2015-01-16 10:22:01

标签: java memory-leaks

从记忆的角度来看哪一个更好String[] / List<String>。我需要存储5000个或更多对象,我将从服务中获取该对象。

4 个答案:

答案 0 :(得分:2)

如果取决于您要询问的List实现。如果你问的是String []和ArrayList,它们使用相同数量的存储,因为ArrayList由数组支持(差异将取决于初始化数组的长度与启动ArrayList的初始容量的关系)用)。

为了使用String [],你必须知道你需要存储的最大字符串数,因为数组的legnth是固定的。无论何时,ArrayList都会自动将数据复制到更大的数组中。

答案 1 :(得分:1)

更简单的对象在内存中总是更好。它高度依赖于您使用的列表。 LinkedList在内存中比ArrayList更糟糕。你应该问自己的问题是你将如何与集合进行互动。 如果你想添加某事。在中间你应该使用LinkedList。 如果只有一组固定的字符串,请使用String []。 如果您只是添加越来越多的字符串,请使用ArrayList。 你不应该真的担心内存使用,因为有很多。

答案 2 :(得分:1)

您可能应该选择 ArrayList<String>

内存消耗取决于List的类型,坦率地说,只有5000个对象仍然不重要。

ArrayList<String>仅比String[]略微“差”。 ArrayList<String>简单地包装和管理Object[],为每个对象和每个增长阈值提供开销。 Object[]有多大并不重要。并且Object[]中的每个条目通常大小为4个字节,无论您是否使用它,因为Java是引用的。这就像20 kiB。在大多数使用Java的环境中,这几乎不重要。

如果使用LinkedList<String>,内存消耗将更多,对于每个条目,将有一个额外的Node对象。但这仍然无关紧要。假设每个Node对象的大小为20字节(hashCode,class,list,next,previous)。然后我们谈论100 kiB。

在手机上的1 GiB RAM环境中,对于手机上的大多数应用程序来说,这都无关紧要。在具有8 GiB或16 GiB的PC上,您真的不想介意。

我通常会选择ArrayList<?>,除非我经常移除并添加当前循环元素而不需要随机访问,然后我选择LinkedList<?>CopyOnWriteArrayList<?>如果我需要一个可以同时从多个线程读取和修改的列表,列表不会变得太大或写入很少。

答案 3 :(得分:0)

String[]List<String>在内存中占用相同的空间来存储数据。

String[] - 您需要获取有关内存中存储了多少元素的所有信息,并且它应该不是最小值或不是最大空间然后需要的空间。

List<String> - 它有自己的调整大小的好处,在列表中指定一定的大小,以防指定的大小在功能上变小,您无需更改代码。并且List集合更易于您的进一步操作。