【问题标题】:Declaring the capacity of a List in Java在 Java 中声明 List 的容量
【发布时间】:2011-05-25 18:13:15
【问题描述】:

我经常在我的 Android 应用程序中使用列表。现在我正在创建一个 Twitter 页面,其中列出了最多 50 条用户的“推文”。

我有一个这样定义的列表:

List<Tweet> tweets = new ArrayList<Tweet>(MAX_TWEETS);

Tweet 是一个自定义对象类型,其中包含 twitter 更新信息(文本、日期、用户名等),MAX_TWEETS 是一个常量整数值 (50)。

问题:

设置这个List的初始容量有什么好处?

当我知道我的列表会这么小时,我是否应该设置容量?我什么时候应该/不应该设置容量?

【问题讨论】:

    标签: java android capacity


    【解决方案1】:

    设置初始容量可以提高填充列表时的性能,并且如果您从不向列表中添加超过该数量的项目,它还可以减少列表的内存占用。

    可以通过调用 trimToSize() 来减少已增长的 List 的内存占用,并且可能具有大于存储项目数的后备数组

    【讨论】:

      【解决方案2】:

      默认情况下,在 Java 6 中,List 的大小为 10。即系统在底层 Array 中创建了 10 个内存槽。如果您尝试添加第 11 个元素,则只会创建 Array 副本。提供大小可以提高性能。

      【讨论】:

        【解决方案3】:

        ArrayList 的默认容量设置为 10(参见 jdk 1.6 源代码)。这意味着将在创建时分配大小为 10 的数组。如果您要添加元素编号 11,则容量将增加到 16。然后在达到 21 后再次增加。

        如果您不希望超过 50 个元素,则数组最多会调整大小 3 次。考虑到这个数字,这真的无关紧要。如果它让您考虑保存数组副本,请将其设置为 50。

        其实这是正确的增大尺寸公式:

        int newCapacity = (oldCapacity * 3)/2 + 1;
        

        【讨论】:

          【解决方案4】:

          设置这个List的初始容量有什么好处?

          它将在内部分配该大小的内存,当它超过该大小时,它将重新分配内存并将 .如果我们提供适当的初始容量,我们可以在重新调整溢出时节省一些 cpu 周期。

          【讨论】:

            【解决方案5】:

            设置列表的容量只会指定它有多大。这样做的唯一好处是,当您添加超过列表默认大小的项目时,它不必扩展列表。

            示例:您将列表设置为 25,默认为 10? (不是 100% 确定)如果您添加 24 个元素,则根本不需要增加列表。如果您将其保留为默认值,它将增长它。

            希望对你有帮助

            【讨论】:

              【解决方案6】:

              如果您知道您将确切需要该数量,则初始容量会有所帮助。它将创建一个能够引用MAX_TWEETS 项目的容器。如果超过了它,系统将创建一个包含两倍于原始列表的新列表(这在 Java 应用程序中很常见)。

              【讨论】:

                【解决方案7】:

                ArrayList,顾名思义,是作为数组实现的(与链表相反)。通过指定初始大小,您可以避免在添加元素时增大数组。这是一项昂贵的操作,必须创建一个新数组,然后复制现有元素。因此,如果您提前知道最大值,则永远不必这样做。

                实际上,如果您的列表大小为 50,并且该数组只有一个实例,则该数组只会扩展几次,因此在这种情况下可能无关紧要。不过,如果您稍后更改变量,您的方法还是不错的。

                【讨论】:

                  【解决方案8】:

                  它将在创建时分配内存,并且在您完成之前不必复制。

                  但老实说,只有 50 个对象,无论如何复制都不会花费太多精力,所以我非常怀疑您是否会看到任何性能提升。但是,指定大小没有缺点,所以您不妨这样做。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2023-03-24
                    • 2018-02-03
                    • 1970-01-01
                    • 2016-05-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-02-10
                    • 1970-01-01
                    相关资源
                    最近更新 更多