【问题标题】:which one is better from memory point of view String[] / List<String>从内存的角度来看,哪个更好 String[] / List<String>
【发布时间】:2015-01-16 19:51:39
【问题描述】:

从记忆的角度来看,哪个更好String[] / List&lt;String&gt;。我有5000 或更多需要存储的对象,这些对象是我从服务中获得的响应。

【问题讨论】:

标签: java memory-leaks


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      也许你应该选择 ArrayList&lt;String&gt;

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

      ArrayList&lt;String&gt; 只比String[] 稍微“差”一点。 ArrayList&lt;String&gt; 简单地包装和管理Object[],为每个对象和每个增长阈值提供开销。 Object[] 有多大并不重要。 Object[] 中的每个条目的大小通常为 4 字节,无论您是否使用它,因为 Java 是通过引用。所以这将是 20 kiB。在大多数使用 Java 的环境中,这并不重要。

      如果使用LinkedList&lt;String&gt;,内存消耗会更多,至于每一个入口,都会多出一个Node对象。但这仍然无关紧要。假设每个 Node 对象的大小为 20 字节(hashCode、class、list、next、previous)。然后我们说的是 100 kiB。

      在手机上 1 GiB RAM 的情况下,对于手机上的大多数应用程序来说已经无关紧要了。在具有 8 GiB 或 16 GiB 的 PC 上,您真的不想介意。

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

      【讨论】:

        【解决方案4】:

        String[]List&lt;String&gt; 都在内存中占用相同的空间来存储数据。

        String[] - 你需要知道有多少元素存储在你的内存中,并且它不应该是最小或不是最大空间然后是所需空间。

        List&lt;String&gt; - 它有自己的调整大小的好处,为您的列表指定一定的大小,以防指定的大小变小,您无需更改代码。和List 收藏更便于您进一步操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-18
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 1970-01-01
          • 2011-09-15
          • 2012-12-05
          • 1970-01-01
          相关资源
          最近更新 更多