Java中的集合仅适用于对象。即Map<int, int>在Java中没有。相反,需要将原始值装箱到对象中,如中所示Map<Integer, Integer>。Java自动装箱将实现这些集合的透明使用:
Map<Integer, Integer> map = new HashMap<>(); map.put(1, 17); // 自动将int装箱为Integer对象 int a = map.get(1); // 自动拆箱。
不幸的是,这的开销很大。AHashMap<Integer, Integer>将需要每个条目大约72个字节(例如,在具有压缩指针的64位JVM上,并假设整数大于256,并假设映射的负载为50%)。由于实际数据只有8个字节,因此会产生大量开销。此外,它需要两个级别的间接(映射->入口->值),这是不必要的缓慢。
有几个库具有针对原始数据类型的优化集合(在50%的负载下每个条目仅需要约16个字节,即,内存减少4倍,间接访问的级别减少),当使用大型原始数据集时,可以产生实质性的性能优势Java中的值。