2015-04-27 10 views
9

Guardando l'implementazione dell'hashmap di java, non è in grado di comprendere il motivo dietro alcune linee. Nel codice qui sotto copiato da here, nella riga 365-367, non sono in grado di capire perché hanno fatto prima l'assegnazione di e.key a k e poi ho confrontato == con il tasto chiave [(k = e.key) == ]. Perché non farlo direttamente (e.key == chiave). Questo modello appare più volte nel codice.nella chiave di implementazione di hashmap java viene prima assegnato all'oggetto e quindi confrontato

359 
360  final Entry<K,V> getEntry(Object key) { 
361   int hash = (key == null) ? 0 : hash(key.hashCode()); 
362   for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
363    e != null; 
364    e = e.next) { 
365    Object k; 
366    if (e.hash == hash && 
367     ((k = e.key) == key || (key != null && key.equals(k)))) 
368     return e; 
369   } 
370   return null; 
371  } 
+0

Bene, usano il valore di k nell'altra parte della condizione, ma potrebbero aver scritto '(e.key == chiave || (chiave! = Null && key.equals (e.key))) 'invece ed elimina la variabile' k'. Non vedo quale sia il vantaggio di introdurre quella variabile locale. – Eran

+0

Esattamente, ma in molte situazioni simili in tutto il codice hanno seguito religiosamente la creazione di una nuova variabile locale. – Nitiraj

+4

Vedere http://stackoverflow.com/questions/10180656/why-is-lock-captured-to-a-alocal-variable, http://stackoverflow.com/questions/2785964/in-arrayblockingqueue-why-copy- final-member-field-in-local-final-variable, http://stackoverflow.com/questions/28975415/why-jdk-code-style-uses-a-variable-assignment-and-read-on-the- same-line-eg-i ... – Marco13

risposta

0

Penso che @ Marco13 abbia pubblicato i collegamenti corretti che rispondono a questa domanda. Pubblicando nuovamente i collegamenti. Why is lock captured to a local variable

In ArrayBlockingQueue, why copy final member field into local final variable?

Why jdk code style uses a variable assignment and read on the same line - eg. (i=2) < max

Risposta: Utilizzando la funzione di riferimento locale del membro variabile diminuisce la dimensione del codice byte generato.

2

Questa è probabilmente una questione di ottimizzazione. La chiamata a e.key aggiunge un livello di riferimento indiretto (poiché si utilizza il riferimento su e per ottenere un riferimento su key). La variabile k consente di avere una scorciatoia per e.key ed evita di utilizzare due volte l'indecisione indiretta non necessaria. L'implementazione utilizza anche direttamente il risultato dell'assegnazione k = e.key invece di assegnare il valore a k e quindi confrontare k a key.

Non so se l'impatto di tale ottimizzazione è significativo (assegnazione di una nuova variabile vs accesso indiretto). Probabilmente è difficile da valutare e può dipendere dalla JVM (poiché la JVM può eseguire diverse ottimizzazioni sul codice).

Dato che HashMap è ampiamente utilizzato in Java, immagino che l'implementazione abbia lo scopo di offrire le massime prestazioni senza aspettarsi alcuna ottimizzazione dall'ambiente di esecuzione; quindi, l'uso comune di questo modello.

Problemi correlati