TL; Dr. Opinia mea este de a folosi un +
Unario pentru a declanșa despachetarea într-unul din operanii atunci când verificați valori egale și pur și simplu utilizați operatorii matematici altfel. Logica urmează:
a fost deja menționată că comparația ==
pentru Integer
este compararea identității, care În general, nu dorește un programator și că scopul este de a face o comparație a valorilor; Chiar și așa, am făcut o mică știință despre cum să fac această comparație în modul cel mai eficient, atât în ceea ce privește compactul codului, corecția și viteza.
am folosit metodele obișnuite:
și obținut acest cod după compilare și decompilare:
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; }}
cum puteți vedea cu ușurință, metoda 1 Apelați Integer.equals()
(evident), metodele 2-4 au ca rezultat exact același cod, dezvoltați valorile prin intermediul .intValue()
și Apoi, comparați-le direct, iar metoda 5 acționează pur și simplu o comparație de identitate, fiind o formă greșită de comparare a valorilor.
Având în vedere că (după cum sa menționat deja, JS) equals()
suferă o supraîncărcare (trebuie să facă instanceof
și o conversie non-dovedită), metodele 2-4 vor funcționa exact cu aceeași viteză, mai bine decât metoda 1 când Ei folosesc bucle strânse, deoarece Hotspot nu este probabil să optimizeze & iv = „b6e8f3f310”
.
este destul de similar cu altă comparație Operatori (de exemplu, <
/ >
): Activați despachetarea, în timp ce utilizați nu va, dar de data aceasta, operația este extrem de optimizabilă de către HS Deoarece intValue()
este doar o metodă getter (candidat principal pentru a fi optimizat în afara).
în mine Opinia, versiunea 4, care este utilizată rar, este cea mai concisă mod: toți dezvoltatorii C / Java cu experiență știu că avantajul de desfacere în majoritatea cazurilor este egal cu conversia la int
DIV id = „9B9F6509B4″>
– Deși poate fi un micwtfmomento pentru unii (în principal cei care nu au folosit unuar plus în viața lor), ar putea spune că arată cea mai clar și ușor intenție: eșantioane La care dorim o valoare int
al unuia dintre operanți, forțând și cealaltă valoare la Caxi. Este, de asemenea, indiscutabil mai asemănător comparației i1 == i2
utilizat în mod regulat pentru valorile primitive int
.