TL; DR, la mia opinione è utilizzare un +
UNRIO per attivare lo svuotamento in uno degli operandi durante la verifica dei valori uguali e usa semplicemente gli operatori matematici altrimenti. Segue la logica:
È già stato detto che il confronto ==
per Integer
è il confronto dell’identità, che Generalmente non è ciò che vuole un programmatore e che l’obiettivo sia quello di confrontare i valori; Anche così, ho fatto una piccola scienza su come fare quel confronto nel modo più efficiente, sia in termini di compattezza, correzione e velocità in codice.
Ho usato i metodi usuali:
public boolean method1() { Integer i1 = 7, i2 = 5; return i1.equals( i2 );}public boolean method2() { Integer i1 = 7, i2 = 5; return i1.intValue() == i2.intValue();}public boolean method3() { Integer i1 = 7, i2 = 5; return i1.intValue() == i2;}public boolean method4() { Integer i1 = 7, i2 = 5; return i1 == +i2;}public boolean method5() { // obviously not what we want.. Integer i1 = 7, i2 = 5; return i1 == i2;}
e ottenuto questo codice dopo la compilazione e la decompilazione:
public boolean method1() { Integer var1 = Integer.valueOf( 7 ); Integer var2 = Integer.valueOf( 5 ); return var1.equals( var2 );}public boolean method2() { Integer var1 = Integer.valueOf( 7 ); Integer var2 = Integer.valueOf( 5 ); if ( var2.intValue() == var1.intValue() ) { return true; } else { return false; }}public boolean method3() { Integer var1 = Integer.valueOf( 7 ); Integer var2 = Integer.valueOf( 5 ); if ( var2.intValue() == var1.intValue() ) { return true; } else { return false; }}public boolean method4() { Integer var1 = Integer.valueOf( 7 ); Integer var2 = Integer.valueOf( 5 ); if ( var2.intValue() == var1.intValue() ) { return true; } else { return false; }}public boolean method5() { Integer var1 = Integer.valueOf( 7 ); Integer var2 = Integer.valueOf( 5 ); if ( var2 == var1 ) { return true; } else { return false; }}
Come puoi facilmente vedere, il metodo 1 Chiama Integer.equals()
(Ovviamente), i metodi 2-4 risultano esattamente allo stesso codice, sviluppare i valori tramite .intValue()
e Quindi confrontarli direttamente e il metodo 5 semplicemente attiva un confronto di identità, essendo la forma sbagliata di confrontare i valori.
Dato che (come già accennato, ad esempio, js) equals()
Informa un sovraccarico (deve fare instanceof
e una conversione non provata), i metodi 2-4 funzionerà esattamente con la stessa velocità, notevolmente meglio del metodo 1 quando. Usano loop stretti, poiché Hotspot non è probabile che hotspot ottimizzerà l’ID
.
è abbastanza simile con un altro confronto Operatori (ad esempio, <
/ >
): Attivare il disimballaggio, durante l’utilizzo Non lo farà, ma questa volta, l’operazione è altamente ottimizzata da HS poiché intValue()
è solo un metodo Gettter (candidato principale da ottimizzare all’esterno).
nel mio Parere, versione 4, che viene utilizzata raramente, è il modo più conciso: tutti gli esperti sviluppatori c / java sanno che il vantaggio dell’urry nella maggior parte dei casi è uguale alla conversione a int
/ .intValue()
– Sebbene possa essere un LittleWtfmomento per alcuni (principalmente quelli che non utilizzavano un anno più in vita), potrebbe dire che mostra la più chiaramente e leggermente intenzione: campioni A cui vogliamo un valore int
di uno degli operandi, costringendo anche l’altro valore a unbox. È anche indiscutibilmente più simile al confronto i1 == i2
utilizzato regolarmente per i valori primitivi int
.