所以我正在为我正在考虑的算法类项目工作。我正在网上进行一些研究,发现有些人正在使用ArrayList<Integer>
而有些人正在使用int array[]
。我的问题是,什么是最好用于最小堆和为什么。该项目要求我从一个非常大的数字列表中保留列表中最大的10000个最大数字
答案 0 :(得分:2)
如果您在编译时知道数组大小,using a bare int[]
array is faster。当然,性能差异可能可以忽略不计 - 但我们的想法是ArrayList
在内部实现为Object[]
数组,因此您可以节省开销,加上处理{{的开销。 1}} vs Integer
。
答案 1 :(得分:1)
int[]
消耗的内存少于ArrayList<Integer>
。部分原因是从Integer
添加的开销,每个实例增加~16个字节。这个video经历了32位和64位jvms中各种对象和集合的内存影响。在大约9:30标记处,它讨论了与每个对象相关的内存。在大约11:15标记处,它讨论了各种类型(包括Object
引用)的内存量。
对于int[]
,您有1 Object
(int[]
),它实际上包含所有单独的int
值作为连续内存。
对于ArrayList<Integer>
,您拥有ArrayList
对象,Object[]
对象和所有Integer
个对象。此外,Object[]
实际上并不包含连续内存中的Integer
个对象,而是包含连续内存中的对象引用。 Integer
个对象本身位于堆上的其他位置。
因此,最终结果是ArrayList<Integer>
需要的内存量约为int[]
的6倍。支持Object[]
和int[]
占用相同的内存量(~40,000字节)。 10k Integer
个对象每个占用约20个字节,总共200,000个字节。因此,与ArrayList
相比,int[]
至少为240,000字节,大约为40,000字节。