最小堆Java实现arraylist vs array



所以我正在为我的算法类项目工作,我目前正在采取。我在网上做了一些研究,看到有些人在用ArrayList<Integer>,有些人在用int array[]。我的问题是,最小堆用什么更好,为什么?这个项目需要我从一个非常大的数字列表中保留前10000个最大的数字

如果在编译时知道数组大小,使用裸int[]数组会更快。当然,性能差异可能是可以忽略不计的——但是这个想法是,ArrayList是作为Object[]数组在内部实现的,所以您节省了开销,加上处理Integerint的开销。

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字节。

最新更新