2013-06-03 4 views
13

यह सरल जावा कोड long का एक सेट करने के लिए 2 कहते हैं, और बाद में प्रिंट कि क्या 2 सेट का एक सदस्य है:लंबे समय तक हैशसेट का उपयोग कर जावा कोड काम नहीं करता है?

import java.util.*; 

class A { 
    public static void main(String[] args) { 
     HashSet<Long> s = new HashSet<Long>(); 
     long x = 2; 
     s.add(x); 
     System.out.println(s.contains(2)); 
    } 
} 

यह true प्रिंट चाहिए, क्योंकि 2 सेट में है, लेकिन इसके बजाय यह false प्रिंट करता है। क्यूं कर?

$ javac A.java && java A 
false 
+0

'लंबे' आदिम के बजाय 'लांग' ऑब्जेक्ट का उपयोग करने का प्रयास करें। –

+0

@ लुइगी मैन्डोज़ा - ए 'लांग' आदिम ऑटोबॉक्सिंग के कारण ठीक काम करेगा। समस्या यह है कि यह एक 'int' primitive था। –

+0

क्षमा करें, आप सही हैं। शाब्दिक 2 को 'इंटेर' के रूप में 'int'' के रूप में माना जाता था। –

उत्तर

21

आपका सेट Long के उदाहरण में शामिल है और आप एक Integer (प्रकार है जो में एक int एक Object की आवश्यकता है जब बॉक्सिंग जाता है) देख रहे थे।

टेस्ट

System.out.println(s.contains(Long.valueOf(2))); 

या

System.out.println(s.contains(2L)); 
+11

मैं "2 एल" के बजाय "2 एल" ('एल' अपरकेस) टाइप करूंगा, क्योंकि 2 एल बीस की तरह दिख सकता है। –

+0

@ मार्लोन बर्नार्डिस संपादित: '2 एल' बदलकर' 2 एल' हो गया। –

1

आपका HashSet भंडार लांग की आपत्ति और नहीं int/पूर्णांक .. आप एक पूर्णांक जहां पूर्णांक जबकि एक वस्तु की आवश्यकता है बॉक्सिंग है प्राप्त करने की कोशिश कर रहे हैं।

+0

काफी सुधार हुआ। मेरा डाउनवोट अब हटा दिया गया है। –

6

जब आप कहते हैं कि s.contains(2), यह 2 जो डिफ़ॉल्ट रूप से एक int, जो Integer को बॉक्सिंग हो जाता है के लिए खोज करता है। लेकिन आपके द्वारा संग्रहीत वस्तु Long थी। इसलिए, यह false

इसके बजाय s.contains(Long.valueOf(2)) का उपयोग करने का प्रयास करें।

+0

दरअसल, संग्रहीत ऑब्जेक्ट 'लांग' था, न कि 'लंबा'। लेकिन इस मुद्दे का सार सही पाने के लिए +1। –

+0

ओह। बस एक टाइपो। अधिसूचना के लिए धन्यवाद। :) –

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