Come confrontare correttamente due numeri interi in Java?

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *