tl; dr मेरी राय +
मूल्य समानता की जाँच करते समय किसी एक ऑपरेंड पर unboxing को ट्रिगर करने के लिए एक यूरीरी का उपयोग करना है, और बस मैथ्स ऑपरेटरों का अन्यथा उपयोग करें। औचित्य इस प्रकार है:
यह पहले से ही उल्लेख किया गया है कि पहचान की ==
तुलना के लिए Integer
तुलना है, जो आमतौर पर एक प्रोग्रामर नहीं चाहता है, और इसका उद्देश्य मूल्य तुलना करना है; फिर भी, मैंने कोड कॉम्पैक्टनेस, शुद्धता और गति दोनों की तुलना में उस कुशलता से तुलना करने के तरीके के बारे में थोड़ा सा विज्ञान किया है ।
मैंने तरीकों का सामान्य गुच्छा इस्तेमाल किया:
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;
}
और संकलन और विघटन के बाद यह कोड मिला:
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;
}
}
जैसा कि आप आसानी से देख सकते हैं, विधि 1 कॉल Integer.equals()
(स्पष्ट रूप से), विधियाँ 2-4 परिणाम एक ही कोड में होते हैं , मानों को बिना मतलब के अलिखित करते हैं .intValue()
और फिर उनकी तुलना सीधे करते हैं, और विधि 5 सिर्फ पहचान की तुलना को ट्रिगर करता है, गलत तरीके से मूल्यों की तुलना करें।
चूंकि (जैसा कि पहले से ही जेएस द्वारा उल्लेख किया गया है) equals()
एक ओवरहेड (यह instanceof
एक अनियंत्रित कलाकारों को करना पड़ता है ) को लागू करता है, 2-4 तरीके समान गति के साथ काम करेंगे, तंग छोरों में उपयोग किए जाने पर विधि 1 से बेहतर रूप से बेहतर, क्योंकि हॉटस्पॉट नहीं है जातियों के अनुकूलन की संभावना है instanceof
।
यह अन्य तुलना ऑपरेटरों (जैसे <
/ >
) के साथ काफी समान है - वे उपयोग compareTo()
नहीं करते हुए अनबॉक्सिंग को ट्रिगर करेंगे - लेकिन इस बार, एचएस द्वारा ऑपरेशन अत्यधिक अनुकूलन योग्य है, क्योंकि intValue()
बस एक गेटर विधि है (प्रधान उम्मीदवार को अनुकूलित किया जा रहा है)।
मेरी राय में, शायद ही कभी इस्तेमाल किया गया संस्करण 4 सबसे संक्षिप्त तरीका है - हर अनुभवी सी / जावा डेवलपर जानता है कि यूनियरी प्लस ज्यादातर मामलों में कास्ट के बराबर है int
/ .intValue()
- जबकि यह कुछ के लिए थोड़ा डब्ल्यूटीएफ पल हो सकता है (ज्यादातर वे जो करते थे 'अपने जीवनकाल में यूरी प्लस का उपयोग न करें), यह यकीनन सबसे स्पष्ट रूप से और सबसे अधिक स्पष्ट रूप से इरादे को दिखाता है - यह दर्शाता है कि हम एक int
ऑपरेंड का एक मूल्य चाहते हैं , दूसरे मूल्य को भी अनबॉक्स करने के लिए मजबूर करते हैं। यह भी i1 == i2
आदिम int
मूल्यों के लिए उपयोग की जाने वाली नियमित तुलना के समान ही है ।
मेरा वोट के लिए चला जाता है i1 == +i2
और i1 > i2
के लिए शैली Integer
, वस्तुओं दोनों प्रदर्शन और एकरूपता बनाए रखने के लिए। यह भी प्रकार की घोषणा के अलावा कुछ भी बदले बिना आदिम को पोर्टेबल पोर्टेबल बनाता है। नाम के तरीकों का उपयोग करना मेरे लिए अर्थ-संबंधी शोर का परिचय देने जैसा लगता है, जो कि बहुत ही आलोचनात्मक bigInt.add(10).multiply(-3)
शैली के समान है ।