在Java中声明List的容量

时间:2011-05-25 18:13:16

标签: java android capacity

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

我有一个像这样定义的List:

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

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

问题:

设置此List的初始容量有什么好处,如果有的话?

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

8 个答案:

答案 0 :(得分:3)

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

可以通过调用trimToSize()

来减少已增长的List的内存占用量,并且可能具有大于存储的项目数的后备数组

答案 1 :(得分:3)

默认情况下,在Java 6中,List的大小为10.也就是说,系统会在基础Array中创建10个内存插槽。如果尝试添加第11个元素,则仅创建阵列副本。提供尺寸可以提高性能。

答案 2 :(得分:2)

  

设置此列表的初始容量有什么好处?

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

答案 3 :(得分:2)

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

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

希望这会有所帮助

答案 4 :(得分:2)

如果您知道自己将需要这个数量,那么初始容量会有所帮助。它将创建一个能够引用MAX_TWEETS项的容器。如果超过它,系统将创建一个包含两倍项目的新列表,然后复制到原始列表中(这在Java应用程序中很常见)。

答案 5 :(得分:2)

ArrayList,顾名思义,是作为一个数组实现的(而不是链接列表)。通过指定初始大小,可以防止在添加元素时增大数组。这是一项昂贵的操作,必须创建一个新数组,然后复制现有元素。所以,如果你提前知道最大值,你就不应该这样做。

实际上,如果列表的大小为50且该阵列只有一个实例,则该阵列只会扩展几次,因此在这种情况下可能无关紧要。尽管如此,如果您稍后更改变量,您的方法仍然很好。

答案 6 :(得分:2)

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

如果您不希望超过50个元素,则阵列最多可调整大小3次。鉴于数量很少,它确实无关紧要。将它设置为50,如果它让您在阵列副本上保存一点心思。

实际上,这是大小增加的正确公式:

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

答案 7 :(得分:2)

它将在创建时分配内存,并且在您重新开始之前不必复制。

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