Java Language Collections et valeurs primitives


Exemple

Les collections en Java ne fonctionnent que pour les objets. Ie il n'y a pas de Map<int, int> en Java. Au lieu de cela, les valeurs primitives doivent être placées dans des objets, comme dans Map<Integer, Integer> . L’auto-boxing Java permettra une utilisation transparente de ces collections:

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

Malheureusement, les frais généraux sont considérables . Un HashMap<Integer, Integer> nécessitera environ 72 octets par entrée (par exemple, sur une JVM 64 bits avec des pointeurs compressés et en supposant des entiers supérieurs à 256 et en supposant une charge de 50% de la map). Étant donné que les données réelles ne sont que de 8 octets, cela génère une surcharge considérable. De plus, il nécessite deux niveaux d’indirection (Map -> Entry -> Value) qui sont inutilement lents.

Il existe plusieurs bibliothèques avec des collections optimisées pour les types de données primitifs (qui nécessitent seulement ~ 16 octets par entrée à une charge de 50%, soit quatre fois moins de mémoire et un niveau d’indirection inférieur), valeurs en Java.