所以我正在为我的算法类项目工作,我目前正在采取。我在网上做了一些研究,看到有些人在用ArrayList<Integer>
,有些人在用int array[]
。我的问题是,最小堆用什么更好,为什么?这个项目需要我从一个非常大的数字列表中保留前10000个最大的数字
如果在编译时知道数组大小,使用裸int[]
数组会更快。当然,性能差异可能是可以忽略不计的——但是这个想法是,ArrayList
是作为Object[]
数组在内部实现的,所以您节省了开销,加上处理Integer
和int
的开销。
int[]
将比ArrayList<Integer>
消耗更少的内存。部分原因是Integer
增加的开销,每个实例增加约16字节。本视频介绍了32位和64位jvm中各种对象和集合对内存的影响。在大约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
将至少为240,000字节,而int[]
大约为40,000字节。