Bon, vous faites cela pour économiser de la mémoire, je suppose, car il est clair que vous n'économisez pas les ressources du CPU en accédant à une carte au lieu d'un champ. Alors voyons comment cela fonctionne : (en supposant une JVM 64bit sans oops compressés - ce qui est irréaliste mais ne devrait pas trop changer les résultats, vous pouvez le calculer vous-même facilement)
En principe, un champ en Java ne prendra jamais plus de 8 octets (la taille d'un mot pour les références). Cela signifie que pour votre classe avec 10 champs, en supposant qu'ils sont tous inutilisés, le mieux que nous puissions faire est de 8*10 octets = 80 octets.
Maintenant, vous voulez remplacer cela par un HashMap à la place - ce qui signifie que nous utilisons déjà 8 octets supplémentaires pour cela. De plus, le HashMap est toujours initialisé, ce qui entraîne les surcharges suivantes : 2 mots d'en-tête + référence + 3 ints + float + 1 tableau (2 mots d'en-tête, taille de 4 octets, 16 références par défaut) qui occupe 182 bytes
de la mémoire.
Puis-je vous féliciter d'avoir économisé un énorme -110 bytes
!
PS : Je pense que la plus petite valeur par défaut possible pour le backing array du hashset est 2, donc vous pourriez l'utiliser et vous en sortir à peu près à égalité. Mais dès que vous stockez des objets dans l'ensemble, vous obtenez une surcharge supplémentaire à partir des objets Wrapper utilisés par la classe. C'est donc une mauvaise idée.