我经常在Android应用程序中使用列表。现在我正在创建一个Twitter页面,其中列出了最多50个用户的“推文”。
我有一个像这样定义的List:
List<Tweet> tweets = new ArrayList<Tweet>(MAX_TWEETS);
其中Tweet
是包含Twitter更新信息(文本,日期,用户名等)的自定义对象类型,MAX_TWEETS
是一个常量整数值(50)。
问题:
设置此List
的初始容量有什么好处,如果有的话?
当我知道我的列表会这么小时,我是否应该费心设置容量?什么时候我应该不设置容量?
答案 0 :(得分:3)
设置初始容量可以在填充List时提高性能,如果您从未向列表添加超过该数量的项目,它还可以减少List的内存占用量。
可以通过调用trimToSize()
答案 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个对象,无论如何复制都不会花费太多精力,所以我非常怀疑你会看到任何性能提升。但是,指定大小并没有什么缺点,所以你不妨这样做。