2012-11-02 11 views
8

मैं जावा के लिए नया हूं और भाषा के आवश्यक और बुनियादी सिद्धांतों को समझने की कोशिश कर रहा हूं।जावा स्ट्रिंग ऑब्जेक्ट्स वर्णों का एक ऐरे हैं?

क्या यह कहना सही है कि जावा स्ट्रिंग ऑब्जेक्ट्स आंतरिक रूप से कक्षाओं की एक अपरिवर्तनीय सरणी के रूप में परिभाषित कक्षा है?

मैं इस पूछना के रूप में मैं थोड़ा की तुलना में कल्पना से उलझन में सरणियों और स्ट्रिंग वर्ग चार के लिए हूँ ...

JLS 10.9

10,9 वर्ण की एक सरणी एक नहीं है स्ट्रिंग जावा प्रोग्रामिंग भाषा में, सी के विपरीत, char की एक सरणी स्ट्रिंग नहीं है, और न तो स्ट्रिंग और न ही char की सरणी '\ u0000' (NUL वर्ण) द्वारा समाप्त की जाती है। ए स्ट्रिंग ऑब्जेक्ट अपरिवर्तनीय है, यानी, इसकी सामग्री कभी नहीं बदली जाती है, जबकि char की सरणी में परिवर्तनीय तत्व होते हैं। क्लास स्ट्रिंग मेंCharArray की विधि स्ट्रिंग के समान वर्ण अनुक्रम वाले वर्णों की एक सरणी देता है। वर्ग स्ट्रिंगबफर पात्रों के उत्परिवर्तनीय सरणी पर उपयोगी विधियों को लागू करता है।

JLS 4.3.3

4.3.3 वर्ग स्ट्रिंग की कक्षा स्ट्रिंग उदाहरण यूनिकोड कोड अंक के दृश्यों का प्रतिनिधित्व करते हैं।

+0

प्रश्न पोस्ट करने के लिए धन्यवाद। मैंने हमेशा खरीदा, तारों की एक सरणी के रूप में स्ट्रिंग। :) .. +1 – PermGenError

+0

@ चैतन्य 10: मेरे प्रश्न के बारे में अब मेरे हटाए गए उत्तर पर: एक वस्तु * कक्षा का एक उदाहरण * है। यह एक वर्ग नहीं है। एक वर्ग और एक वस्तु दो अलग-अलग चीजें हैं। –

+0

@ चैतन्य 10 टीवाई :-) –

उत्तर

17

यह राज्य के लिए है कि जावा स्ट्रिंग वस्तुओं आंतरिक रूप से एक वर्ग वर्ण का एक अपरिवर्तनीय सरणी के रूप में परिभाषित कर रहे हैं सही है?

नहीं, एक जावा स्ट्रिंग वस्तु है - एक वर्ग कुछ क्षेत्रों से युक्त (वर्तमान में यह एक कार्यान्वयन विस्तार जो मैं इकट्ठा बदलते जा सकता है):

  • एक char[] वास्तविक पात्रों
  • युक्त
  • सरणी में एक प्रारंभिक सूचकांक
  • एक लंबाई
  • एक कैश्ड हैश कोड, lazily
  • अभिकलन

सूचकांक और लंबाई का कारण यह है कि कई तारों में char[] के संदर्भ शामिल हो सकते हैं। इसका उपयोग कुछ परिचालनों जैसे substring (कई कार्यान्वयन में, वैसे भी) द्वारा किया जाता है।

महत्वपूर्ण बात यह है कि String के लिए एपीआई महत्वपूर्ण है - जो एक सरणी के लिए एपीआई से बहुत अलग है। यह एपीआई है जिसे आप जेएलएस परिभाषा को ध्यान में रखते समय सोचेंगे: String यूनिकोड कोड पॉइंट्स के अनुक्रम का प्रतिनिधित्व करता है। तो आप बाद में (Substring) ले सकते हैं, एक दिए गए अनुवर्ती (indexOf) को ढूंढें, इसे ऊपरी केस अनुक्रम आदि में परिवर्तित करें।

वास्तव में जेएलएस इसे यूटीएफ -16 कोड इकाइयों का अनुक्रम कहने के लिए थोड़ा और सटीक होगा; यह एक स्ट्रिंग बनाने के लिए पूरी तरह से संभव है जो मान्य यूनिकोड कोड बिंदुओं का अनुक्रम नहीं है, उदाहरण के लिए यूटीएफ -16 कोड इकाइयों की "सरोगेट जोड़ी" का एक आधा शामिल है लेकिन दूसरे नहीं। वहाँ एपीआई के कुछ हिस्सों जो कोड इकाइयों के संदर्भ में String साथ सौदा कर रहे हैं, लेकिन स्पष्ट रूप से सबसे डेवलपर्स के रूप में यदि गैर बीएमपी वर्ण मौजूद नहीं था तार का इलाज समय की सबसे खर्च करते हैं।

+0

अच्छा जवाब। क्या आप "यूनिकोड कोड पॉइंट्स के स्ट्रिंग प्रतिनिधित्व अनुक्रमों" पर कुछ प्रकाश डाल सकते हैं और यह वास्तविक चरित्र वाले char [] से अलग कैसे है? गैर मूल अंग्रेजी स्पीकर भ्रम हो सकता है? – kosa

+0

@ नंबारी: संपादित होगा, लेकिन यह उचित स्पष्ट लगता है ... –

+0

+1 स्वीकार किया गया - मुझे लगता है कि यह स्पष्ट रूप से मेरे प्रश्न का उत्तर देता है। संक्षिप्त उत्तर के लिए धन्यवाद। –

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