从记忆的角度来看哪一个更好String[] / List<String>
。我需要存储5000
个或更多对象,我将从服务中获取该对象。
答案 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
集合更易于您的进一步操作。