Está mot probablemente a la derecha. De hecho, puedo renunciar a mi uso de las capacidades de acceso aleatorio (¿así es como lo llamas?), Y no me importa el orden de los objetos. Solo necesito poder agregar objetos y luego iterar sobre todos ellos. Además, este es un conjunto (no necesito el mismo objeto más de una vez), pero tampoco intentaré agregarlo más de una vez ... ¿Debería usar una lista (aunque no me importa? el pedido)? ¿Cuál es la estructura de datos más eficiente para dicho conjunto?
Un HashSet se implementa como un HashMap que asigna la clave a sí mismo, por lo que cambiar a un HashSet no tendrá mucha importancia, en cuanto al rendimiento.
Las otras alternativas son un TreeSet, o (suponiendo que su aplicación nunca intente insertar un duplicado) una de las clases List. Si su aplicación es tal que una Lista funcionará, entonces ArrayList o LinkedList serán más eficientes que HashSet o TreeSet.
Sin embargo, hay algo muy desagradable en su aplicación que pasa el 50% de su tiempo en los métodos hashCode
. A menos que las tablas hash se redimensionen, el método hashCode solo se debe llamar una vez por conjunto o por operación de mapa. Entonces, o bien hay un montón de cambio de tamaño de mapa/conjunto, o está realizando un gran número de operaciones de conjunto add
. (Que yo sepa, el método de código hash del objeto es barato, por lo que el coste de cada llamada no debería ser un problema.)
EDITAR
Está nextInt() muy caro? Alguna alternativa?
No, no es caro. Eche un vistazo al código. La clase Random (y el método nextInt()) hace uso de un AtomicLong para que sea seguro para subprocesos, y puede guardar algunos ciclos si codificó una versión no segura para subprocesos. El código fuente está en su directorio de instalación JDK ... eche un vistazo.
Sería bueno si explicaras por qué esto es un problema en primer lugar. –