【发布时间】:2015-01-16 19:51:39
【问题描述】:
从记忆的角度来看,哪个更好String[] / List<String>。我有5000 或更多需要存储的对象,这些对象是我从服务中获得的响应。
【问题讨论】:
-
我认为这个问题与内存泄漏问题无关。
标签: java memory-leaks
从记忆的角度来看,哪个更好String[] / List<String>。我有5000 或更多需要存储的对象,这些对象是我从服务中获得的响应。
【问题讨论】:
标签: java memory-leaks
如果取决于您询问的 List 实现。如果您询问 String[] 与 ArrayList,它们使用相同的存储量,因为 ArrayList 由数组支持(差异取决于您初始化数组的长度与启动 ArrayList 的初始容量与)。
为了使用 String[],您必须知道需要存储的最大字符串数,因为数组的长度是固定的。 ArrayList 会在必要时自动将数据复制到更大的数组中。
【讨论】:
更简单的对象在内存中总是更好。它高度依赖于您使用的列表。 LinkedList 在内存中比 ArrayList 差得多。您应该问自己的问题是您将如何与该系列互动。 如果你想添加某事。在中间你应该使用 LinkedList。 如果只有一组固定的字符串,请使用 String[]。 如果您只是添加越来越多的字符串,请使用 ArrayList。 你不应该真的担心内存使用,因为有很多。
【讨论】:
也许你应该选择 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<?>我可以同时从多个线程读取和修改,列表不会变得太大或写入很少。
【讨论】:
String[] 和 List<String> 都在内存中占用相同的空间来存储数据。
String[] - 你需要知道有多少元素存储在你的内存中,并且它不应该是最小或不是最大空间然后是所需空间。
List<String> - 它有自己的调整大小的好处,为您的列表指定一定的大小,以防指定的大小变小,您无需更改代码。和List 收藏更便于您进一步操作。
【讨论】: