2013-05-08 4 views
12

मैं समझने की कोशिश कर रहा हूं कि जावा स्ट्रिंग्स कैसे अपरिवर्तनीय हैं। मुझे लगता है कि यह शायद एक आसान अवधारणा होनी चाहिए, लेकिन कई ऑनलाइन वेब पेज पढ़ने के बाद भी मुझे समझ में नहीं आता है।जावा तार कैसे काम करते हैं

मुझे समझ नहीं आता कैसे जावा स्ट्रिंग्स "अपरिवर्तनीय" कर रहे हैं।

Jacob Perkins 
Jacob Perkins! 

क्यों हो रहा है, तो एक स्ट्रिंग अपरिवर्तनीय माना जाता है है:

public static void main(String[] args) { 

    String name = "Jacob Perkins"; 

    System.out.println(name); 

    name = name + "!"; 

    System.out.println(name); 

} 

मेरे उत्पादन निम्नलिखित है: मैं वर्तमान में निम्नलिखित कोड है? मैं स्ट्रिंग को मान फिर से असाइन करने में सक्षम क्यों हूं?

+0

'स्ट्रिंग' * वेरिएबल्स * अपरिवर्तनीय नहीं हैं (क्योंकि वे भिन्न होते हैं!) आपने एक नई स्ट्रिंग बनाई है और इसके संदर्भ को 'name' के संदर्भ में असाइन किया है। – dlev

+0

मुझे अभी भी समझ में नहीं आता है। मैं जावा स्ट्रिंग्स के साथ 'अपरिवर्तनीय' शब्द क्यों देखूं? – user2301187

+0

@ user2301187: दो चर समान स्ट्रिंग ऑब्जेक्ट को इंगित कर सकते हैं। यदि तार विचलित होते हैं, तो स्ट्रिंग में एक चर के परिवर्तन अन्य चर के संदर्भ के माध्यम से देखे जा सकते हैं। चूंकि वे नहीं हैं, इसलिए प्रत्येक चर यह जानता है कि जिस स्ट्रिंग को इंगित करता है वह 'बदल नहीं रहा है' बदल नहीं सकता है। ऐसा इसलिए किया जाता है क्योंकि उत्परिवर्तनीय तार डरावना होगा और बहुत जटिलता जोड़ें, उदा।जब भी आप इसकी एक प्रतिलिपि चाहते थे, तो आपको स्ट्रिंग की प्रतिलिपि बनाना याद रखना होगा, जो बदलेगा नहीं, या अजीब चीजें बाद में होती हैं, संभावित रूप से असुरक्षित चीजें भी! – Patashu

उत्तर

34

एक छवि आप के लिए यह स्पष्ट करने दें:

String example

बाईं ओर, आप चर, जो वास्तव में एक संदर्भ है। यह करने के लिए

  1. String name = "Jacob Perkins;" स्ट्रिंग "याकूब पर्किन्स" बनाया जाता है, और name अंक।
  2. name = name + "!"; एक नया स्ट्रिंग "जैकोब पर्किन्स!" बनाया गया है, और संदर्भ अब नई स्ट्रिंग को इंगित करता है।हालांकि, पुराना एक अपरिवर्तित बनी हुई है, क्योंकि स्ट्रिंग अपरिवर्तनीय है।
+4

+1 :) तस्वीर के लिए – renz

+2

+1! – MadProgrammer

+0

ठीक है, धन्यवाद। मुझे लगता है कि दृश्य मदद की। – user2301187

1

स्ट्रिंग वस्तुओं अपरिवर्तनीय केवल चर संदर्भ परिवर्तन कर रहे हैं।

अपने उदाहरण में "याकूब पर्किन्स" वस्तु अभी भी मौजूद है और एक नई वस्तु "याकूब पर्किन्स!" बनाया जाता है।

नाम नए ऑब्जेक्ट पर परिवर्तनीय बिंदु।

0

वास्तव में क्या होता है 3 स्ट्रिंग ऑब्जेक्ट्स बनाए जाते हैं। "जैकब पर्किन्स", "!" और "जैकब पर्किन्स!"। आपने वास्तव में "जैकब पर्किन्स" उदाहरण को संशोधित नहीं किया था। आपने "जैकब पर्किन्स" उदाहरण से "जैकब पर्किन्स" से नाम परिवर्तनीय का संदर्भ बदल दिया है।

+0

मुझे समझ में नहीं आता कि "नाम परिवर्तनीय के संदर्भ को बदलकर" का क्या अर्थ है। – user2301187

+0

पहले println() में, नाम चर "जैकब पर्किन्स" स्ट्रिंग ऑब्जेक्ट को इंगित कर रहा है। वह वस्तु वास्तव में परिवर्तित नहीं हुई थी, क्योंकि तार अपरिवर्तनीय हैं। इसके बजाए, दो अन्य नई स्ट्रिंग ऑब्जेक्ट्स बनाई गई हैं, "!" और "जैकब पर्किन्स!"। और फिर नाम चर "जैकब पर्किन्स" की ओर इशारा किया जाता है। आपने वास्तव में 3 स्ट्रिंग ऑब्जेक्ट्स बनाए हैं, जिनमें से कोई भी म्यूट नहीं किया गया था। दृश्य के लिए – renz

0
String name = "Jacob Perkins"; 

String name2 = name + "!"; 
name.substring(5); // or wather syntax is 

उन चर नाम

5

स्वयं स्ट्रिंग, एक बार बनाया, बदला कभी नहीं किया जा सकता है नहीं बदलते। क्या अपने कोड नमूना करता करने के लिए एक नई स्ट्रिंग कि नाम के पिछले सामग्री से निर्माण किया गया था, और विस्मयादिबोधक बिंदु के साथ नाम में स्ट्रिंग की जगह है। (नाम के मूल सामग्री, जो अब किसी भी चर द्वारा संदर्भित कर रहे हैं, अंत में कचरा कलेक्टर द्वारा काटा जाएगा।)

आप संकलित कोड की जांच (या एक डिबगर के साथ इसके माध्यम से कदम) करना हो तो आप पाएंगे कि आपकी name + "!" अभिव्यक्ति को स्ट्रिंगबिल्डर ऑब्जेक्ट के निर्माण और उस ऑब्जेक्ट पर कुछ संचालन के रूप में संकलित किया गया था।

है, तार अपरिवर्तनीय हैं, लेकिन चरनाम नहीं है। अलग-अलग तारों को इंगित करने के लिए इसका मूल्य बदल जाता है। तार खुद कभी नहीं बदलते हैं।

0

जावा में संदर्भ हैं और मूल्य हैं।

जब आप कहते हैं कि

String foo = "John Smith";

foo एक चर रहा है, एक संदर्भ पकड़े। संदर्भ "जॉन स्मिथ" युक्त ऑब्जेक्ट या मान को संदर्भित करता है।

परिवर्तनीय द्वारा आयोजित संदर्भ उत्परिवर्तनीय है। मैं यह कर सकता:

foo = "Jack Smith";

और मैं संदर्भ उत्परिवर्तित है। लेकिन अगर मैं इस तरह कोड लिखने:

String foo = "John Smith"; 
String bar = foo; //bar's reference is a copy of foo's reference - the same value 
foo = "Jack Smith"; 
System.out.println(bar); //prints John Smith 

हम देखते हैं कि भले ही हम foo बदल गया है, बार नहीं बदला है। क्यूं कर? बस, जब हमने foo = "Jack Smith"; लिखा था तो हमने एक नई स्ट्रिंग को फू पॉइंट बनाया था। हम foo के माध्यम से नहीं पहुंचे और स्ट्रिंग को संशोधित नहीं किया, क्योंकि जावा में कोई विधि म्यूटेट नहीं करती है, या स्ट्रिंग को म्यूटेट कर सकती है। इसके बजाए, एक नया स्ट्रिंग वापस कर दिया गया है, और चर को नए, अपरिवर्तनीय स्ट्रिंग को इंगित करने के लिए बनाया गया है। इस तरह, ऑब्जेक्ट एक स्ट्रिंग वेरिएबल 'पॉइंट' को किसी भी रूप में संशोधित नहीं किया जा सकता है लेकिन उस चर के माध्यम से। यह जावा भाषा की एक महत्वपूर्ण संपत्ति है जो इसकी गारंटी देता है।

1

शायद यह आपको समझने में मदद करेगा।

मान लें कि आपके पास क्लास प्वाइंट (java.awt.Point) है।

Point p = new Point(0,0); 

तो फिर तुम एक नया चर y एक ही वस्तु के रूप में पी संदर्भित बनाने बनाने:

Point y = p; 

आप पी के मूल्य बदलते हैं, तो आप भी y बदलने मान लीजिए कि आप एक उदाहरण पी करते हैं । क्योंकि क्लास प्वाइंट म्यूटेबल है।

p.setLocation(1,1); 

यह वाई स्थान को भी 1,1 संदर्भित करता है।

स्ट्रिंग क्लास का उपयोग करना ऐसा नहीं होता है।

String a = "123"; 
String b = a; 

यदि आप एक = एक + "4" बनाते हैं; एक इच्छा का नया मूल्य "1234" होगा लेकिन बी अभी भी "123" है;

जिस वस्तु का संदर्भ वे संदर्भित कर रहे थे वह नहीं बदला, यह सिर्फ एक अन्य वस्तु को इंगित कर रहा है।

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