2010-12-13 15 views
19

मेरे पास पूर्णांक हैं जो बराबर होने चाहिए (और मैं इसे आउटपुट द्वारा सत्यापित करता हूं)। लेकिन मेरे if स्थिति में जावा इन चरों को समान मान रखने के लिए नहीं देखता है।जावा क्यों नहीं देखता कि इंटीजर बराबर हैं?

मैं निम्नलिखित कोड है:

if (pay[0]==point[0] && pay[1]==point[1]) { 
    game.log.fine(">>>>>> the same"); 
} else { 
    game.log.fine(">>>>>> different"); 
} 
game.log.fine("Compare:" + pay[0] + "," + pay[1] + " -> " + point[0] + "," + point[1]); 

और यह निम्नलिखित उत्पादन का उत्पादन:

Integer[] point = new Integer[2]; 

:

FINE: >>>>>> different 
FINE: Compare:: 60,145 -> 60,145 

शायद मैं जोड़ने के लिए है कि point इस तरह परिभाषित किया गया है है और pay हमें लूप-कन्स्ट्रक्टर से लिया गया:

for (Integer[] pay : payoffs2exchanges.keySet()) 

तो, इन दो चर दोनों में पूर्णांक प्रकार है।

+3

यदि आपके पास खुले दिमाग हैं तो आपको मेरी स्पष्टीकरण पसंद हो सकती है ... ऐसा इसलिए है क्योंकि जब वे रैपर वर्ग बनाने का फैसला करते हैं तो जावा निर्माता रॉयली खराब हो जाते हैं, जिनमें वास्तव में दयनीय प्रदर्शन होता है (आपको कोई नहीं मिला है एक * इंटी * * के अंदर * int * लपेटकर उत्पन्न अपशिष्ट के बारे में विचार। उन्होंने इसे मुख्य रूप से किया क्योंकि वे कुछ साफ और कुशल डिजाइन करने में असमर्थ थे, जैसे, * ट्रोव * * * TLongIntHashMap *। निश्चित रूप से उन लोगों से स्नैकी घुटने टेकने की टिप्पणियों की अपेक्षा करें जिन्होंने जावा कूल-एक्ट को पी लिया है, यह बताते हुए कि मैं कैसे गलत हूं और कैसे रैपर वर्ग देवता हैं;) – SyntaxT3rr0r

+1

बीटीडब्ल्यू, कभी भी * नया इंटीजर [2] * कभी नहीं करें क्योंकि आप मजबूर करते हैं एक नई वस्तु का निर्माण। ** आईएफएफ ** आप * इंटेगर * जैसे रैपर वर्गों का उपयोग करते रहें (जो आपको वास्तव में नहीं करना चाहिए लेकिन यह एक और विषय है), आप एक * Integer.valueOf (2) * (बीटीडब्ल्यू जो बाद में ** ** गारंटी देता है ** जावा चश्मा के अनुसार -128 से 127 तक पहली 256 इंटीजर ऑब्जेक्ट्स का पुन: उपयोग करता है लेकिन यह एक बहुत ही ज्ञात जावा मस्तिष्क नहीं है)। – SyntaxT3rr0r

+0

स्पूनबेंडर: जावा निर्माता के निर्णय के बारे में * केवल * स्ट्रिंग के लिए ऑपरेटर ओवरलोडिंग की अनुमति देता है? इस तरह 'Integer.valueOf (127) == Integer.valueOf (127) 'लेकिन' Integer.valueOf (128)! = Integer.valueOf (128) '! – Gabe

उत्तर

49

ऑब्जेक्ट्स (जैसे Integer एस) की तुलना == के माध्यम से नहीं की जानी चाहिए, लेकिन .equals() के माध्यम से नहीं की जानी चाहिए।

समझना महत्वपूर्ण है कि कई अलग-अलग Integer ऑब्जेक्ट्स एक ही int मान का प्रतिनिधित्व कर सकते हैं। जब आपका प्रोग्राम >>> different प्रिंट करता है तो यह बस कहता है कि पहली वस्तु एक ही ऑब्जेक्ट दूसरी ऑब्जेक्ट के रूप में नहीं है। autoboxing पर official guide से

(आप शायद जो मूल्य वे प्रतिनिधित्व के आधार पर वस्तुओं की तुलना करना चाहते हैं।):

[...] == ऑपरेटर पूर्णांक भाव पर संदर्भ पहचान तुलना करता है और int अभिव्यक्तियों पर समानता तुलना मूल्य। [...]

यह ध्यान देने योग्य है कि autoboxing रेंज [-128, 127] में अभिन्न मान के लिए एक ही वस्तु लौटने के लिए गारंटी है, लेकिन लायक हो सकता है एक कार्यान्वयन अपने विवेक के आधार, कैश मूल्यों पर उस सीमा के बाहर।

मेरी सामान्य सिफारिश सभी स्थानीय/सदस्य चर के लिए Integer के बजाय int का उपयोग करना है। इस विशेष मामले में आप 2-तत्व सरणी में निर्देशांक संग्रहीत करते हैं। मैं सुझाव दूंगा कि आप Coordinates कक्षा या समान में इसे समाहित करें और यहां समकक्ष विधि (और हैशकोड) को ओवरराइड करें।

भी

9

देखें अगर वे सरल int प्रकार थे, यह काम करेगा।

Integer.intValue() या compareTo(Object other) या equals(Object other) का उपयोग अपनी तुलना में करें।

4

यहाँ भेद करने के लिए दो प्रकार हैं:

  • int, जो आप समय के सबसे अधिक उपयोग करने के आदिम पूर्णांक प्रकार है, लेकिन एक ऑब्जेक्ट प्रकार
  • Integer, एक int चारों ओर एक वस्तु आवरण नहीं है जो एपीआई कि आवश्यकता होती है में पूर्णांकों उपयोग करने के लिए इस्तेमाल किया जा सकता वस्तुओं
1

जब आप दो वस्तुओं की तुलना करने की कोशिश (और एक पूर्णांक एक वस्तु, न कि एक चर रहा है) परिणाम हमेशा कि टी हो जाएगा hey're बराबर नहीं,

अपने मामले में

आप (इस मामले intValue में) वस्तुओं के क्षेत्र की तुलना करनी चाहिए

पूर्णांक वस्तुओं के बजाय पूर्णांक चर घोषित करने का प्रयास करें, यह

2

में मदद मिलेगी जावा संख्यात्मक मान में 127 के लिए -128 की सीमा के भीतर कैश नहीं किया जाता तो यह काम करेगा अगर आप की तुलना करने के

Integer i=12 ; 
Integer j=12 ; // j is pointing to same object as i do. 
if(i==j) 
    print "true"; 

कोशिश, लेकिन वे मूल्य तुलना क्योंकि के लिए विधि के बराबर होती है के साथ तुलना में जाने की जरूरत है अगर आप उपरोक्त दे सीमा से बाहर की संख्या के साथ की कोशिश "==" दोनों जांच करेगा या नहीं एक ही वस्तु एक ही मूल्य नहीं है।

0

पर

pay[0]==point[0] 

अभिव्यक्ति हालत, समानता ऑपरेटर == का उपयोग करता है के लिए एक संदर्भ के साथ एक संदर्भ

Integer pay[0] 
समानता के लिए

तुलना करने के लिए

Integer point[0] 

आम तौर पर जब आदिम-प्रकार मान (जैसे int, ...) की तुलना == से की जाती है, परिणाम सही है यदि दोनों मान समान हैं। जब संदर्भ (जैसे इंटीजर, स्ट्रिंग, ...) की तुलना == के साथ की जाती है, तो परिणाम सही होता है यदि दोनों संदर्भ स्मृति में एक ही ऑब्जेक्ट को संदर्भित करते हैं। समानता के लिए वस्तुओं की वास्तविक सामग्री (या राज्य जानकारी) की तुलना करने के लिए, एक विधि लागू की जानी चाहिए। इस प्रकार, इस

Integer[] point = new Integer[2]; 

अभिव्यक्ति के साथ आप एक नया उद्देश्य यह है कि नए संदर्भ मिला है और चर बात करने के लिए असाइन करें है बनाएँ।

उदाहरण के लिए:

int a = 1; 
int b = 1; 
Integer c = 1; 
Integer d = 1; 
Integer e = new Integer(1); 

ख उपयोग के साथ एक तुलना करने के लिए:

a == b 

क्योंकि उन दोनों के आदिम प्रकार मान हैं। ऑटो मुक्केबाजी सुविधा के

a == c 

है क्योंकि:

ग उपयोग के साथ एक तुलना करने के लिए।ई चर में नए संदर्भ की वजह से

c.equals(e) 

:

ई उपयोग के साथ ग तुलना के लिए

c.equals(d) 

की वजह से:

तुलना घ के साथ ग इसका इस्तेमाल करने के लिए बेहतर और सुरक्षित है के लिए

आप जानते हैं, == ऑपरेटर, वस्तुओं, केवल परीक्षण है कि क्या आवरण के लिए आवेदन किया वस्तुओं में समान स्मृति स्थान होते हैं। निम्नलिखित तुलना इसलिए शायद विफल हो जाएगा:

Integer a = 1000; 
Integer b = 1000; 
if (a == b) . . . 

हालांकि, एक जावा कार्यान्वयन, अगर यह चुनता है, अधिक होने वाली मान समान वस्तुओं में लपेट कर सकते हैं, और इस तरह तुलना सफल होने के हो सकता है। यह अस्पष्टता वह नहीं है जो आप चाहते हैं। उपचार रैपर ऑब्जेक्ट की तुलना करते समय बराबर विधि को कॉल करना है।

संबंधित मुद्दे