Sei mot probabilmente ragione. Posso davvero rinunciare al mio uso delle capacità di accesso casuale (è così che lo chiamate?), E non mi interessa l'ordine degli oggetti. Devo solo essere in grado di aggiungere oggetti, quindi iterare su tutti loro. Inoltre, questo è davvero un set (non ho bisogno dello stesso oggetto più di una volta), ma non tenterò mai di aggiungerlo più di una volta ... Dovrei usare una lista invece (anche se non mi interessa l'ordine)? Qual è la struttura dati più efficiente per un set di questo tipo?
Un HashSet è implementato come un HashMap che mappa la chiave stessa, per cui il passaggio di un HashSet non farà molta differenza, prestazioni-saggio.
Le altre alternative sono una TreeSet, o (supponendo che l'applicazione non potrà mai provare ad inserire un duplicato) una delle classi List. Se la tua applicazione è tale da far funzionare un elenco, una ArrayList o LinkedList sarà più efficiente di un HashSet o TreeSet.
Tuttavia, c'è qualcosa di molto sospetto circa la vostra applicazione di spesa del 50% del suo tempo in hashCode
metodi. A meno che le tabelle hash non vengano ridimensionate, il metodo hashCode dovrebbe essere chiamato una sola volta per operazione set o map. Quindi, c'è un sacco di ridimensionamento della mappa/set in corso, o stai facendo un numero enorme di operazioni di add
impostate. (AFAIK, il metodo oggetto codice hash è a buon mercato, in modo che il costo di ogni chiamata non dovrebbe essere un problema.)
EDIT
Is nextInt() molto costoso? Qualche alternativa?
No, non è costoso. Dai un'occhiata al codice. La classe Random (e il metodo nextInt()) fa uso di un AtomicLong per renderlo thread-safe, e potresti salvare alcuni cicli se hai codificato una versione non thread-safe. Il codice sorgente è nella directory di installazione JDK ... dai un'occhiata.
fonte
2010-06-26 17:27:06
Sarebbe bello se dovessi spiegare perché questo è un problema in primo luogo. –