2011-12-30 3 views
27

के लिए नए कीवर्ड की आवश्यकता क्यों नहीं है मैं जावा में नया हूं।स्ट्रिंग

जावा में, String हम new कीवर्ड का उपयोग करने के वर्ग String जहां new के रूप में अन्य वर्गों के लिए वस्तुओं बनाने के लिए प्रयोग किया जाता है की एक वस्तु बनाने के लिए की जरूरत नहीं है एक class .लेकिन है।

मैंने Integer, Double जैसे रैपर वर्गों के बारे में सुना है जो इस तरह के हैं। लेकिन String रैपर नहीं है, है ना?

असल में जब मैं

 String message = "Hai"; 

का उपयोग क्या हो रहा है ?? कैसे इसे से

String message = new String("Hai"); 

यहाँ अलग है message एक संदर्भ चर या कुछ और ?? क्या अन्य कक्षाएं हैं जिन्हें ऑब्जेक्ट बनाने के लिए new की आवश्यकता नहीं है ??

+0

सोनू थॉमस :)! – jenuine

+0

@ जेन्यूइन हम्मम्म .... –

उत्तर

22

निम्न पंक्ति आप ढेर में एक नया String वस्तु नहीं बना रहे हैं बल्कि एक स्ट्रिंग शाब्दिक (यदि पहले से ही उपलब्ध है) पुन: उपयोग के साथ:

String message = "Hai"; 

"Hai" एक स्ट्रिंग शाब्दिक पूल स्ट्रिंग में शाब्दिक है। चूंकि तार अपरिवर्तनीय हैं, वे पुन: प्रयोज्य हैं इसलिए उन्हें JVM द्वारा स्ट्रिंग शाब्दिक पूल में पूल किया जाता है। और यह अनुशंसित तरीका है, क्योंकि आप इसका पुन: उपयोग कर रहे हैं।

लेकिन, निम्नलिखित आप वास्तव में एक नई वस्तु (ढेर) में पैदा कर रहे साथ:

String message = new String("Hai"); 

new String("Hai") एक नया String वस्तु है। इस मामले में, भले ही शाब्दिक "Hai" स्ट्रिंग शाब्दिक पूल में पहले से ही था, एक नई वस्तु बनाई गई है। इसकी अनुशंसा नहीं की जाती है क्योंकि संभावना है कि आप एक ही मूल्य के साथ एक से अधिक String ऑब्जेक्ट्स को समाप्त कर सकते हैं।

इसके अलावा इस पोस्ट देखें: Questions about Java's String pool

वहाँ अन्य वर्गों जो वस्तु बनाने के लिए नए की आवश्यकता नहीं है कर रहे हैं ??

वास्तव में, आप कीवर्ड new कीवर्ड का उपयोग किए बिना जावा में कोई ऑब्जेक्ट नहीं बना सकते हैं।

उदा।

Integer i = 1; 

करता है, इसका मतलब यह नहीं है कि Integer वस्तु new का उपयोग किए बिना बनाई गई है। हमारे लिए new कीवर्ड का स्पष्ट रूप से उपयोग करने की आवश्यकता नहीं है। लेकिन हुड के तहत, यदि Integer ऑब्जेक्ट 1 के साथ ऑब्जेक्ट कैश में पहले से मौजूद नहीं है (Integer ऑब्जेक्ट्स जेवीएम द्वारा कैश किए जाते हैं), new कीवर्ड का उपयोग इसे बनाने के लिए किया जाएगा।

+0

मुझे लगता है, 'इंटीगर' आदिम प्रकार 'int' के लिए एक रैपर वर्ग है। लेकिन स्ट्रिंग ** ** आदिम नहीं है, है ना? –

+1

हाँ आप सही हैं। –

6

स्ट्रिंग और इंटीजर निर्माण अलग हैं।

String s = "Test"; 

यहां '=' ​​ऑपरेटर स्ट्रिंग के लिए अधिभारित है। तो "कुछ" + "चीजें" में '+' ऑपरेटर है। कहाँ, के रूप में

Integer i = 2; 

जावा 5.0 तक इस समय त्रुटि संकलन है; आप अपने रैपर को आदिम असाइन नहीं कर सकते हैं। लेकिन जावा 5.0 से इसे ऑटो-मुक्केबाजी कहा जाता है जहां प्राइमेटिव्स को जहां भी आवश्यक हो, उनके रैपर में ऑटो को बढ़ावा दिया जाता है।

String h1 = "hi"; 

से

String h2 = new String("hi"); 

अलग होगा कि JVM सभी स्ट्रिंग शाब्दिक के लिए एक स्ट्रिंग की तालिका बनाता है। इसलिए "हाय" के लिए तालिका में एक प्रविष्टि होगी, इसका पता 1000 है।

लेकिन जब आप स्पष्ट रूप से स्ट्रिंग ऑब्जेक्ट बनाते हैं, तो नया ऑब्जेक्ट बनाया जाएगा, इसका पता 2000 है। अब नया ऑब्जेक्ट होगा स्ट्रिंग तालिका जो 1000

इसलिए जब आप कहते हैं में प्रवेश करने के लिए बिंदु

h1 == h2 

यह तुलना

1000 == 2000 

तो यह गलत है

+1

'=' ऑपरेटर * नहीं * अधिभारित है। जावा तारों के लिए कुछ वाक्य रचनात्मक चीनी प्रदान करता है, इसलिए जब आप "हैलो, वर्ल्ड" लिखते हैं, तो आपको एक 'स्ट्रिंग' ऑब्जेक्ट का संदर्भ मिलता है जो दिए गए वर्ण स्ट्रीम का प्रतिनिधित्व करता है। आप निश्चित रूप से वहां एक ऑब्जेक्ट (यदि आवश्यक हो) बना रहे हैं, लेकिन उसमें '=' ऑपरेटर के साथ कोई संबंध नहीं है। – Darkhogg

8

जावा भाषा विनिर्देश एक स्ट्रिंग के प्रतिनिधित्व के लिए शाब्दिक के रूप में अनुमति देता है। आप इसे एक स्ट्रिंग एक महत्वपूर्ण पक्ष प्रभाव है कि नई

स्ट्रिंग शाब्दिक के माध्यम से नियमित रूप से प्रारंभ से अलग है सभी प्रशिक्षु रहे हैं, जिसका मतलब है कि वे जावा द्वारा संग्रहीत निरंतर मूल्यों हैं कि के लिए एक शॉर्टकट प्रारंभ विचार कर सकते हैं रनटाइम और कई कक्षाओं में साझा किया जा सकता है।उदाहरण के लिए:

class MainClass (
    public String test = "hello"; 
} 

class OtherClass { 
    public String another = "hello"; 

    public OtherClass() { 
     MainClass main = new MainClass(); 
     System.out.println(main.test == another); 
    } 
} 

"सही" का प्रिंट आउट, क्योंकि दोनों स्ट्रिंग उदाहरणों वास्तव में एक ही वस्तु को इंगित करेंगे। यदि आप नए कीवर्ड के माध्यम से तारों को प्रारंभ करते हैं तो यह मामला नहीं होगा।

+1

+1। अच्छा और संक्षिप्त। हमें जावा भाषा विशिष्टता का उल्लेख http: //java.sun पर मुफ्त में उपलब्ध होना चाहिए।कॉम/डॉक्स/किताबें/जेएलएस/यदि ओपी वास्तव में इसमें प्रवेश करना चाहता है। –

1

जावा
में "==" के

new String("hai")==new String("hai")

यह गलत रिटर्न मामले में बाईं & दाहिने हाथ पक्षों मेमोरी स्थानों (और नहीं है कि स्मृति स्थान पर मूल्य) और इसलिए तुलना करती है।

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

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