集合和原始值

Java 中的集合仅适用于对象。即 Java 中没有 Map<int, int>。取而代之的是,原始值需要装箱到对象中,如 Map<Integer, Integer>。Java 自动装箱将实现这些集合的透明使用:

Map<Integer, Integer> map = new HashMap<>();
map.put(1, 17); // Automatic boxing of int to Integer objects
int a = map.get(1); // Automatic unboxing.

不幸的是,这的开销很大HashMap<Integer, Integer> 每个条目需要大约 72 个字节(例如,在带有压缩指针的 64 位 JVM 上,假设整数大于 256,并假设地图的负载为 50%)。因为实际数据只有 8 个字节,所以会产生巨大的开销。此外,它需要两个级别的间接(Map - > Entry - > Value),这是不必要的慢。

存在多个具有针对原始数据类型的优化集合的库(在 50%负载时每个条目仅需要约 16 个字节,即内存减少 4 倍,并且间接减少一个级别),当使用大量原始集合时可以产生显着的性能优势 Java 中的值。