জাভা স্ট্রিংস অপরিবর্তনীয়তা


218

নিম্নলিখিত উদাহরণ বিবেচনা করুন।

String str = new String();

str  = "Hello";
System.out.println(str);  //Prints Hello

str = "Help!";
System.out.println(str);  //Prints Help!

এখন জাভাতে স্ট্রিং অবজেক্টগুলি অপরিবর্তনীয়। তারপরে কীভাবে অবজেক্টটিকে str"সহায়তা!" মূল্য দেওয়া যেতে পারে। এটি কি জাভাতে স্ট্রিংগুলির অপরিবর্তনীয়তার বিরোধিতা করে না? কেউ দয়া করে আমাকে অপরিবর্তনীয়তার সঠিক ধারণাটি ব্যাখ্যা করতে পারেন?

সম্পাদনা:

ঠিক আছে. আমি এখন এটি পাচ্ছি, তবে কেবল একটি ফলো-আপ প্রশ্ন। নিম্নলিখিত কোড সম্পর্কে কি:

String str = "Mississippi"; 
System.out.println(str); // prints Mississippi 

str = str.replace("i", "!"); 
System.out.println(str); // prints M!ss!ss!pp! 

এর অর্থ কি এই যে দুটি জিনিস আবার তৈরি হয়েছে ("মিসিসিপি" এবং "এম! এসএস! এসপি! পিপি!") এবং পদ্ধতির strপরে রেফারেন্সটি কোনও ভিন্ন অবজেক্টের দিকে নির্দেশ করে replace()?



আমি আশা করি এটি পুস্কররাজপুজারি.com
article/

উত্তর:


316

strএটি কোনও বস্তু নয়, এটি কোনও বস্তুর রেফারেন্স। "Hello"এবং "Help!"দুটি স্বতন্ত্র Stringবস্তু। সুতরাং, একটি স্ট্রিং str পয়েন্ট । আপনি এটি পরিবর্তিত করতে পারেন যা এটি নির্দেশ করে তবে এটি যা এটি নির্দেশ করে তা নয় ।

এই কোডটি ধরুন, উদাহরণস্বরূপ:

String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"

এখন, 1 এর কিছুই নেই যা আমরা করতে পারলাম s1এর মানকে প্রভাবিত করবে s2। তারা একই বস্তুর উল্লেখ করে - স্ট্রিং "Hello"- তবে সেই বস্তুটি অপরিবর্তনীয় এবং এইভাবে পরিবর্তন করা যায় না।

আমরা যদি এরকম কিছু করি:

s1 = "Help!";
System.out.println(s2); // still prints "Hello"

এখানে আমরা কোনও বস্তুর রূপান্তরকরণ এবং একটি রেফারেন্স পরিবর্তনের মধ্যে পার্থক্য দেখতে পাই। s2আমরা প্রথমে s1যে বিষয়টিকে সূচিত করেছি সেটাকে একই পয়েন্টে নির্দেশ করে। সেট s1থেকে "Help!"শুধুমাত্র পরিবর্তন রেফারেন্স , যখন Stringবস্তুর এটা মূলত অপরিবর্তিত রয়ে পরিচিত।

যদি স্ট্রিং ছিল চপল, আমরা ভালো কিছু করতে পারে:

String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"

ওপির সম্পাদনায় সাড়া দেওয়ার জন্য সম্পাদনা করুন:

যদি আপনি স্ট্রিং.রেপ্লেস (চর, চর) এর জন্য সোর্স কোড (আপনার জেডি কে ইনস্টলেশন ডিরেক্টরিতে src.zip এ উপলব্ধ ) - যদি দেখেন যে কিছু সত্যই কীভাবে কাজ করে তবে আপনি কী দেখতে পাবেন তা এখানে একটি প্রো টিপ রয়েছে you এটি নিম্নলিখিত:

  • oldCharবর্তমান স্ট্রিংয়ে যদি এক বা একাধিক ঘটনা ঘটে থাকে তবে বর্তমান স্ট্রিংয়ের একটি অনুলিপি তৈরি করুন যেখানে সমস্ত উপস্থিতি oldCharপ্রতিস্থাপন করা হয়েছে newChar
  • তাহলে oldCharবর্তমান স্ট্রিং উপস্থিত নেই, বর্তমান স্ট্রিং ফিরে যান।

হ্যাঁ, "Mississippi".replace('i', '!')একটি নতুন Stringঅবজেক্ট তৈরি করে । আবার, নিম্নলিখিতগুলি ধারণ করে:

String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects

আপাতত আপনার বাড়ির কাজটি হল আপনি যদি পরিবর্তন করে থাকেন তবে উপরের কোডটি কী করে তা দেখতে s1 = s1.replace('i', '!');হবে s1 = s1.replace('Q', '!');:)


1 প্রকৃতপক্ষে, স্ট্রিংগুলি (এবং অন্যান্য অপরিবর্তনীয় বস্তু) কে রূপান্তর করা সম্ভব। এর প্রতিবিম্ব প্রয়োজন এবং এটি অত্যন্ত, অত্যন্ত বিপজ্জনক এবং যদি আপনি প্রোগ্রামটি ধ্বংস করতে আগ্রহী না হন তবে কখনও ব্যবহার করা উচিত নয়।


15
কাল্পনিক পদ্ধতির জন্য +1, এটি অপরিবর্তনীয় বস্তু এবং অন্যদের মধ্যে পার্থক্য দেখায়।
জাপ্পি

1
সঠিক উদাহরণ এবং সুস্পষ্ট ব্যাখ্যার জন্য গুস্টাফসি ধন্যবাদ .... তবে আপনি কি প্রশ্নটির সম্পাদিত অংশটির উত্তর দিতে পারবেন? এটি আমার বুঝতে পরিষ্কার করে দেবে clear
হালকা_হেলা

17
আমি এর আগে এর আগে কখনও উত্তর দেখিনি। প্রতিটি একক বিশদ আলোচনা।
মাইকেল 'মাইক' আরদান

+1 এখানে একটি ধারণা, জাভাতে অপরিবর্তনীয় জিনিসগুলি অনুলিপি-সহ-কপিরাইটের মতো, আপনার কাছে একটি স্ট্রিংয়ের 2 টি উল্লেখ থাকতে পারে তবে এগুলি অপরিবর্তনীয় বলে আপনার দুটি পৃথক স্ট্রিং বিবেচনা করা উচিত এবং এর মধ্যে একটির সাথে কাজ করা প্রভাবিত করবে না অন্যান্য
খালেদ.কে

1
জাভা-আপনি যত বেশি মনে করেন আপনি জানেন, আপনি আসলে কম জানেন।
জিশান

23

তথ্য যা strরেফারেন্স পরিবর্তন করতে পারে, কিন্তু প্রকৃত Stringবস্তু তারা নিজেরাই পারে না।

Stringস্ট্রিং সম্বলিত বস্তু "Hello"এবং "Help!"তাদের মান পরিবর্তন করতে পারবেন না, অত তারা অপরিবর্তনীয় হয়।

Stringঅবজেক্টের অপরিবর্তনীয়তার অর্থ এই নয় যে অবজেক্টের দিকে নির্দেশিত রেফারেন্সগুলি পরিবর্তন করতে পারে না।

যে কোনও একটির মাধ্যমে strরেফারেন্সটিকে পরিবর্তন থেকে রোধ করা যায় তা হ'ল এটিকে ঘোষণা করা final:

final String STR = "Hello";

এখন, অন্য দায়িত্ব অর্পণ করা চেষ্টা Stringকরতে STRএকটি কম্পাইল ত্রুটি হতে হবে।


তবে এই ক্ষেত্রে স্ট্রিং অবজেক্টটি হ'ল 'টিআর' যার মধ্যে প্রথমে 'হ্যালো' মান থাকে এবং তারপরে নতুন সহায়তা 'সহায়তা' দেওয়া হয়। "হ্যালো" এবং "সহায়তা!" স্ট্রিংযুক্ত স্ট্রিং অবজেক্টগুলি তাদের মানগুলি পরিবর্তন করতে পারে না, তাই এগুলি অপরিবর্তনীয়। "??? আমাকে ক্ষমা করুন যদি এই একটি নির্বোধ প্রশ্ন। তবে iv তা সাফ করতে
পেরেছিল

2
আপনি কি সি তে প্রতিটি প্রোগ্রাম করার চেষ্টা করেছেন? পয়েন্টারগুলিতে কেবল প্রাইমারটি পড়ুন এবং আপনি কুলবার্ডের উত্তরটি পুরোপুরি বুঝতে পারবেন।
রায়ান ফার্নান্দেস

দেখুন ... এটি আমি এড়াতে চাই ... আমি জানি আপনি দুর্দান্ত প্রোগ্রামার ... এবং আমি এখানে কেবল জাভা শেখার চেষ্টা করছি ... সুতরাং আপনি যদি আমার প্রশ্নের সঠিক উত্তর দিতে পারেন তবে দয়া করে উত্তর দিন .. ।
হালকা_হেলা

আপনি রেফারেন্স এবং অবজেক্টগুলিকে বিভ্রান্ত করছেন - strএটি "অবজেক্ট" নয় এটি বস্তুর কোনও রেফারেন্স। আপনি যদি String str = "Hello";অনুসরণ করেন তবে আপনার কাছে String anotherReference = str;দুটি স্ট্রিং অবজেক্ট নেই, আপনার কাছে একটি অবজেক্ট (আক্ষরিক "হ্যালো") এবং এর 2 টি রেফারেন্স রয়েছে ( strএবং anotherReference)।
নাট

আমার সম্পাদনা করার অধিকার নেই, তবে আমি যদি করতাম তবে আমি কুলবার্ডসকে প্রথম বাক্যে সম্পাদনা করব: "স্ট্রিং রেফারেন্সগুলি পরিবর্তন হতে পারে, তবে প্রকৃত স্ট্রিং অবজেক্টগুলি এগুলি পারে না।"
j3app

10

Light_handle আমি তোমাদের একটি পঠিত নিতে সুপারিশ ভেরিয়েবল সম্পর্কে একটি গল্প - কাপ আকার এবং পাস-মূল্য দ্বারা দয়া করে (কাপ আকার চালিয়ে যাচ্ছিল) । উপরের পোস্টগুলি পড়ার সময় এটি অনেক সাহায্য করবে।

তুমি কি ওগুলো পরেছ? হ্যাঁ. ভাল.

String str = new String();

এটি "" নামে একটি নতুন "রিমোট কন্ট্রোল তৈরি করে strএবং এটি মান new String()(বা "") এ সেট করে ।

যেমন মেমরি এটি তৈরি করে:

str --- > ""

str  = "Hello";

এরপরে এটি রিমোট কন্ট্রোলকে পরিবর্তন করে " str" তবে মূল স্ট্রিংটি পরিবর্তন করে না ""

যেমন মেমরি এটি তৈরি করে:

str -+   ""
     +-> "Hello"

str = "Help!";

এরপরে এটি রিমোট কন্ট্রোলকে পরিবর্তন করে " str" তবে ""রিমোট কন্ট্রোলটি বর্তমানে নির্দেশিত মূল স্ট্রিং বা অবজেক্টটি পরিবর্তন করে না ।

যেমন মেমরি এটি তৈরি করে:

str -+   ""
     |   "Hello"
     +-> "Help!"

"" এবং "হ্যালো" কি আবর্জনা সংগ্রহ করবেন?
প্রবিন টিমসিনা 21

@ প্রবিনটিমসিনা এটি সত্যই একটি নতুন প্রশ্ন হওয়া উচিত। এটির উত্তর দেওয়া হয়েছে: স্ট্যাকওভারফ্লো
মাইকেল লয়েড লি এমএলকে

9

এটি কিছু অংশে ভাঙতে দেয়

String s1 = "hello";

এই বিবৃতি স্ট্রিং সম্বলিত সৃষ্টি হ্যালো এবং অর্থাত মেমরি স্পেস ব্যাপৃত স্থায়ী স্ট্রিং পুল এবং এবং এটি রেফারেন্স বস্তু নির্ধারিত S1

String s2 = s1;

এই বিবৃতি একই স্ট্রিং নির্ধারণ হ্যালো নতুন রেফারেন্স করার S2

         __________
        |          |
s1 ---->|  hello   |<----- s2
        |__________| 

উভয় রেফারেন্স একই স্ট্রিংগুলিতে ইঙ্গিত করছে তাই নিম্নলিখিত মান হিসাবে একই মান আউটপুট করে।

out.println(s1);    // o/p: hello
out.println(s2);    // o/p: hello

যদিও স্ট্রিং হয় অপরিবর্তনীয় , নিয়োগ তাই সম্ভব S1 এখন নতুন মান পড়ুন হবে স্ট্যাকের

s1 = "stack";    
         __________
        |          |
s1 ---->|  stack   |
        |__________|

তবে এস 2 অবজেক্ট সম্পর্কে যা হ্যালোকে নির্দেশ করছে তা যেমন হবে তেমনই হবে।

         __________
        |          |
s2 ---->|  hello   |
        |__________|

out.println(s1);    // o/p: stack
out.println(s2);    // o/p: hello

স্ট্রিং যেহেতু অপরিবর্তনীয় জাভা ভার্চুয়াল মেশিন আমাদের তার পদ্ধতি দ্বারা স্ট্রিং এস 1 সংশোধন করতে দেয় না । এটি নীচে পুলে সমস্ত নতুন স্ট্রিং অবজেক্ট তৈরি করবে।

s1.concat(" overflow");

                 ___________________
                |                   |
s1.concat ----> |  stack overflow   |
                |___________________|

out.println(s1);    // o/p: stack
out.println(s2);    // o/p: hello
out.println(s1.concat); // o/p: stack overflow

দ্রষ্টব্য যদি স্ট্রিংটি পরিবর্তনযোগ্য হয় তবে আউটপুটটি হত

out.println(s1);    // o/p: stack overflow

এখন আপনি অবাক হতে পারেন কেন স্ট্রিংয়ের সংশোধন করার জন্য কনক্যাট () এর মতো পদ্ধতি রয়েছে । নিম্নলিখিত স্নিপেট আপনার বিভ্রান্তি পরিষ্কার করবে।

s1 = s1.concat(" overflow");

এখানে আমরা স্ট্রিংয়ের পরিবর্তিত মান এস 1 রেফারেন্সে ফিরিয়ে দিচ্ছি

         ___________________
        |                   |
s1 ---->|  stack overflow   |
        |___________________|


out.println(s1);    // o/p: stack overflow
out.println(s2);    // o/p: hello

এজন্য জাভা স্ট্রিংকে একটি চূড়ান্ত শ্রেণি হিসাবে নিয়ে যাওয়ার সিদ্ধান্ত নিয়েছে অন্যথায় যে কেউ স্ট্রিংয়ের মান পরিবর্তন করতে এবং পরিবর্তন করতে পারে। আশা করি এটি কিছুটা সাহায্য করবে।


6

স্ট্রিং অবজেক্টটি যা প্রথমে রেফারেন্স করেছিল strতা পরিবর্তিত হয়নি, আপনি যা কিছু করেছিলেন তা strএকটি নতুন স্ট্রিং অবজেক্টকে বোঝায়।


5

স্ট্রিং পরিবর্তন হবে না, এটির রেফারেন্সটি হবে। আপনি finalক্ষেত্রের ধারণার সাথে অপরিবর্তনীয়তা গুলিয়ে ফেলছেন । যদি কোনও ক্ষেত্র হিসাবে ঘোষিত হয় final, একবার এটি নির্ধারিত হয়ে গেলে, এটি পুনরায় নিয়োগ দেওয়া যাবে না।


5

আপনার প্রশ্নের প্রতিস্থাপন অংশ সম্পর্কে, এটি চেষ্টা করুন:

String str = "Mississippi"; 
System.out.println(str); //Prints Mississippi 

String other = str.replace("i", "!"); 
System.out.println(str); //still prints Mississippi 
System.out.println(other);  // prints M!ss!ss!pp!

4

যদিও জাভা এটিকে উপেক্ষা করার চেষ্টা করে তবে এটি strপয়েন্টার ছাড়া আর কিছু নয়। এর অর্থ হ'ল আপনি যখন প্রথম লিখবেন str = "Hello";, আপনি এমন একটি বিষয় তৈরি করবেন যা strনির্দেশ করে। আপনি যখন strলেখার মাধ্যমে পুনরায় নিয়োগ করবেন str = "Help!";, একটি নতুন অবজেক্ট তৈরি হবে এবং "Hello"জাভা যখনই মনে করবে তখন পুরানো বস্তু আবর্জনা সংগ্রহ করবে।


3

অপ্রচলতা ইঙ্গিত দেয় যে একটি তাত্ক্ষণিক বস্তুর মান পরিবর্তন করতে পারে না, আপনি কখনই "হ্যালো" "সহায়তা" "তে পরিণত করতে পারবেন না।

ভেরিয়েবল স্ট্রিং একটি অবজেক্টের একটি রেফারেন্স, যখন আপনি স্ট্রকে একটি নতুন মান নির্ধারণ করেন আপনি যে বস্তুর উল্লেখ করেছেন তার মান পরিবর্তন করছেন না, আপনি অন্য কোনও অবজেক্টকে উল্লেখ করছেন।


3

স্ট্রিং ক্লাস অপরিবর্তনীয়, এবং আপনি অপরিবর্তনীয় বস্তুর মান পরিবর্তন করতে পারবেন না। তবে স্ট্রিংয়ের ক্ষেত্রে, আপনি যদি স্ট্রিংয়ের মান পরিবর্তন করেন তবে এটি স্ট্রিং পুলে নতুন স্ট্রিং তৈরি করবে এবং সেই মানটির ক্ষেত্রে আপনার স্ট্রিং রেফারেন্সের চেয়ে পুরনো নয়। সুতরাং এইভাবে স্ট্রিং অপরিবর্তনীয়। আপনার উদাহরণ নিতে দিন,

String str = "Mississippi";  
System.out.println(str); // prints Mississippi 

এটি একটি স্ট্রিং "মিসিসিপি" তৈরি করবে এবং এটি স্ট্রিং পুলে যুক্ত করবে তাই এখন str মিসিসিপির দিকে নির্দেশ করছে।

str = str.replace("i", "!");  
System.out.println(str); // prints M!ss!ss!pp! 

তবে উপরের ক্রিয়াকলাপের পরে, অন্য একটি স্ট্রিং তৈরি হবে "এম! এসএস! এসএস! পিপি!" এবং এটি স্ট্রিং পুলে যুক্ত হবে। এবং এখন এমআরএস! এসএস! পিপি! মিসিসিপি নয়, নির্দেশ করছে।

সুতরাং আপনি যখন স্ট্রিং অবজেক্টের মান পরিবর্তন করবেন এটি আরও একটি অবজেক্ট তৈরি করবে এবং এটি স্ট্রিং পুলে যুক্ত করবে।

এর আরও একটি উদাহরণ দেওয়া যাক

String s1 = "Hello"; 
String s2 = "World"; 
String s = s1 + s2;

এই উপরের তিনটি লাইন স্ট্রিং পুলে স্ট্রিংয়ের তিনটি অবজেক্ট যুক্ত করবে।
1) হ্যালো
2) ওয়ার্ল্ড
3 ) হ্যালো ওয়ার্ল্ড


2

ব্যবহার করুন:

String s = new String("New String");
s.concat(" Added String");
System.out.println("String reference -----> "+s); // Output: String reference -----> New String

আপনি যদি এখানে দেখেন আমি concatমূল স্ট্রিংটি পরিবর্তনের জন্য এই পদ্ধতিটি ব্যবহার করি , এটি একটি "স্ট্রিং যুক্ত" নতুন স্ট্রিং "" যুক্ত স্ট্রিং ", তবে তবুও আমি আউটপুটটিকে আগের হিসাবে পেয়েছি, সুতরাং এটি প্রমাণ করে যে আপনি অবজেক্টের রেফারেন্স পরিবর্তন করতে পারবেন না স্ট্রিং ক্লাসের, তবে আপনি যদি স্ট্রিংবিল্ডার ক্লাস দ্বারা এই কাজটি করেন তবে এটি কার্যকর হবে। এটি নীচে তালিকাভুক্ত করা হয়েছে।

StringBuilder sb = new StringBuilder("New String");
sb.append(" Added String");
System.out.println("StringBuilder reference -----> "+sb);// Output: StringBuilder reference -----> New String Added String

2

লিনাস টলভার্ডস মত বলেছেন:

টক সস্তা। আমাকে কোডটি দেখান

এক নজর দেখে নাও:

public class Test{
    public static void main(String[] args){

        String a = "Mississippi";
        String b = "Mississippi";//String immutable property (same chars sequence), then same object

        String c = a.replace('i','I').replace('I','i');//This method creates a new String, then new object
        String d = b.replace('i','I').replace('I','i');//At this moment we have 3 String objects, a/b, c and d

        String e = a.replace('i','i');//If the arguments are the same, the object is not affected, then returns same object

        System.out.println( "a==b? " + (a==b) ); // Prints true, they are pointing to the same String object

        System.out.println( "a: " + a );
        System.out.println( "b: " + b );

        System.out.println( "c==d? " + (c==d) ); // Prints false, a new object was created on each one

        System.out.println( "c: " + c ); // Even the sequence of chars are the same, the object is different
        System.out.println( "d: " + d );

        System.out.println( "a==e? " + (a==e) ); // Same object, immutable property
    }
}

আউটপুট হয়

a==b? true
a: Mississippi
b: Mississippi
c==d? false
c: Mississippi
d: Mississippi
a==e? true

সুতরাং, দুটি জিনিস মনে রাখবেন:

  • স্ট্রিংগুলি অপরিবর্তনীয় যতক্ষণ না আপনি এমন কোনও পদ্ধতি প্রয়োগ করেন যা কোনও নতুন তৈরি করে এবং তৈরি করে না (সি & ডি ক্ষেত্রে)।
  • প্রতিস্থাপন পদ্ধতি উভয় প্যারামিটার একই হলে একই স্ট্রিং অবজেক্টটি প্রদান করে

0

যারা জাভাতে স্ট্রিং অপরিবর্তনীয়তা ভঙ্গ করবেন তা ভাবছেন তাদের জন্য ...

কোড

import java.lang.reflect.Field;

public class StringImmutability {
    public static void main(String[] args) {
        String str1 = "I am immutable";
        String str2 = str1;

        try {
            Class str1Class = str1.getClass();
            Field str1Field = str1Class.getDeclaredField("value");

            str1Field.setAccessible(true);
            char[] valueChars = (char[]) str1Field.get(str1);

            valueChars[5] = ' ';
            valueChars[6] = ' ';

            System.out.println(str1 == str2);
            System.out.println(str1);
            System.out.println(str2);           
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
}

আউটপুট

true
I am   mutable
I am   mutable

0

স্ট্রিং হয় অপরিবর্তনীয় । যার অর্থ আমরা কেবলমাত্র রেফারেন্স পরিবর্তন করতে পারি


String a = "a";
System.out.println("String a is referencing to "+a); // Output: a

a.concat("b");
System.out.println("String a is referencing to "+a); // Output: a

a = a.concat("b");
System.out.println("String a has created a new reference and is now referencing to "+a); // Output: ab

0

জাভাতে, অবজেক্টগুলি সাধারণত রেফারেন্স দ্বারা অ্যাক্সেস করা হয়। আপনার কোডের টুকরোটিতে একটি উল্লেখ রয়েছে যা প্রথমে "হ্যালো" (একটি স্বয়ংক্রিয়ভাবে তৈরি বস্তু বা ধ্রুবক পুল থেকে আনা হয়েছে ) এ নিয়োগ করা হয় এবং তারপরে আপনি অন্য একটি বিষয় "সহায়তা!" অর্পণ করেন! একই রেফারেন্স। একটি বিষয় লক্ষণীয় হ'ল রেফারেন্স একই এবং পরিবর্তিত, তবে বস্তুগুলি পৃথক। আপনার কোডে আরও একটি জিনিস আপনি তিনটি জিনিস ব্যবহার করেছেন,

  1. আপনি যখন নতুন স্ট্রিং () ডাকলেন।
  2. যখন আপনি "হ্যালো" অর্পণ করেন।
  3. যখন আপনি "সহায়তা!" নিযুক্ত করেন।

নতুন স্ট্রিং () কল করা একটি নতুন অবজেক্ট তৈরি করে এমনকি এটি স্ট্রিং পুলে উপস্থিত থাকলেও সাধারণত এটি ব্যবহার করা উচিত নয়। নতুন স্ট্রিং () থেকে তৈরি স্ট্রিংটিকে স্ট্রিং পুলে রাখার জন্য আপনি intern()পদ্ধতিটি চেষ্টা করতে পারেন ।

আশা করি এটা কাজে লাগবে.


0

অপরিচ্ছন্নতা আমি বলতে পারি যে আপনি নিজেই স্ট্রিং পরিবর্তন করতে পারবেন না। ধরা যাক আপনার কাছে স্ট্রিং এক্স রয়েছে যার মান "অ্যাবিসি"। এখন আপনি স্ট্রিং পরিবর্তন করতে পারবেন না, অর্থাত্ "abc" এ আপনি কোনও অক্ষর / গুলি পরিবর্তন করতে পারবেন না।

আপনার যদি স্ট্রিংয়ে কোনও চরিত্র / গুলি পরিবর্তন করতে হয় তবে আপনি একটি অক্ষর অ্যারে ব্যবহার করতে পারেন এবং এটিকে পরিবর্তন করতে পারেন বা স্ট্রিংবিল্ডার ব্যবহার করতে পারেন।

String x = "abc";
x = "pot";
x = x + "hj";
x = x.substring(3);
System.out.println(x);

char x1[] = x.toCharArray();
x1[0] = 's';
String y = new String(x1);
System.out.println(y);

আউটপুট:

hj
sj

0

অথবা আপনি চেষ্টা করতে পারেন:

public class Tester
{
public static void main(String[] args)
{
 String str = "Mississippi"; 
 System.out.println(str); // prints Mississippi 
 System.out.println(str.hashCode());

 str = str.replace("i", "!"); 
 System.out.println(str); // prints M!ss!ss!pp! 
 System.out.println(str.hashCode());
 }
 }

এটি হ্যাশকোডের পরিবর্তন কীভাবে তা দেখায়।


0

স্ট্রিং অপরিবর্তনীয় মানে হ'ল আপনি নিজেই বস্তুটি পরিবর্তন করতে পারবেন না তবে আপনি বস্তুর রেফারেন্সটি পরিবর্তন করতে পারবেন। যখন আপনি a = "ty" ডাকলেন, আপনি আসলে স্ট্রিং আক্ষরিক "ty" দ্বারা নির্মিত একটি নতুন অবজেক্টের জন্য a এর রেফারেন্সটি পরিবর্তন করছেন। কোনও বস্তু পরিবর্তন করার অর্থ এর ক্ষেত্রগুলির একটির পরিবর্তনের জন্য তার পদ্ধতিগুলি ব্যবহার করা (বা ক্ষেত্রগুলি সর্বজনীন এবং চূড়ান্ত নয়, যাতে পদ্ধতিগুলির মাধ্যমে অ্যাক্সেস না করেই বাইরে থেকে আপডেট করা যায়), উদাহরণস্বরূপ:

Foo x = new Foo("the field");
x.setField("a new field");
System.out.println(x.getField()); // prints "a new field"

অপরিবর্তনীয় শ্রেণিতে থাকাকালীন (চূড়ান্ত হিসাবে ঘোষিত, উত্তরাধিকারের মাধ্যমে পরিবর্তন রোধ করতে) (এর পদ্ধতিগুলি তার ক্ষেত্রগুলি পরিবর্তন করতে পারে না এবং ক্ষেত্রগুলি সর্বদা ব্যক্তিগত এবং চূড়ান্ত হওয়ার প্রস্তাব দেওয়া হয়), উদাহরণস্বরূপ স্ট্রিং, আপনি বর্তমান স্ট্রিং পরিবর্তন করতে পারবেন না তবে আপনি একটি নতুন স্ট্রিং ফিরে আসতে পারে, অর্থাত:

String s = "some text";
s.substring(0,4);
System.out.println(s); // still printing "some text"
String a = s.substring(0,4);
System.out.println(a); // prints "some"

0

এখানে অপরিবর্তনীয়তার অর্থ এই উদাহরণটি অন্য রেফারেন্সের দিকে নির্দেশ করতে পারে তবে স্ট্রিংয়ের মূল বিষয়বস্তু মূল রেফারেন্সে পরিবর্তিত হবে না। আপনার দেওয়া প্রথম উদাহরণ দিয়ে আমাকে ব্যাখ্যা করুন। প্রথম স্ট্রিং "হ্যালো" এর দিকে নির্দেশ করছে, এটি ঠিক আছে। দ্বিতীয়বার এটি "সহায়তা!" এর দিকে নির্দেশ করছে। এখানে str "সহায়তা!" এবং "হ্যালো" স্ট্রিংয়ের উল্লেখ হারিয়ে গেছে এবং আমরা এটি ফিরে পেতে পারি না।

আসলে যখন স্ট্রিং বিদ্যমান সামগ্রীটি পরিবর্তন করার চেষ্টা করবে, তখন অন্য একটি নতুন স্ট্রিং তৈরি হবে এবং স্ট্রিংটি সেই রেফারেন্সে নির্দেশ করতে শুরু করবে। সুতরাং আমরা দেখতে পাই যে মূল রেফারেন্সে স্ট্রিংটি সংশোধন করা হয়নি তবে এটি তার রেফারেন্সে নিরাপদ এবং অবজেক্টের উদাহরণটি বিভিন্ন রেফারেন্সের দিকে ইঙ্গিত করা শুরু করেছিল যাতে অপরিবর্তনশীলতা সংরক্ষণযোগ্য।


0

উত্তরে দেরি হয়ে গেলেও জাভাতে স্ট্রিং ক্লাসের লেখকের কাছ থেকে একটি সংক্ষিপ্ত বার্তা রাখতে চেয়েছিলেন

স্ট্রিংগুলি ধ্রুবক; তারা তৈরির পরে তাদের মানগুলি পরিবর্তন করা যায় না। স্ট্রিং বাফারগুলি পরিবর্তনীয় স্ট্রিং সমর্থন করে। স্ট্রিং অবজেক্টগুলি অপরিবর্তনীয় কারণ এগুলি ভাগ করা যায়।

স্ট্রিং, রিটার্ন পরিবর্তন করে এমন কিছু যা এই ডকুমেন্টেশন থেকে নেওয়া যেতে পারে পৃথক বস্তু দেয় (যা নতুন বা অভ্যন্তরীণ এবং পুরানো হতে পারে)। এটি সম্পর্কে এত সূক্ষ্ম ইঙ্গিতটি ফাংশনের স্বাক্ষর থেকে আসা উচিত। এটি সম্পর্কে চিন্তা করুন, 'তারা কেন কোনও বস্তুর কোনও ক্রিয়াকলাপ স্থিতির পরিবর্তে কোনও বস্তুকে ফিরিয়ে দিয়েছে?'

public String replace(char oldChar, char newChar) 

এছাড়াও আরও একটি উত্স যা এই আচরণকে সুস্পষ্ট করে তোলে (ফাংশন ডকুমেন্টেশনের প্রতিস্থাপন থেকে)

এই স্ট্রিংয়ে পুরানোচরের সমস্ত উপস্থিতিগুলিকে নতুনচর দিয়ে প্রতিস্থাপনের ফলে নতুন স্ট্রিং প্রদান করে।

সূত্র: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace(char,%20char)

  • লেখক লি বয়েনটন
  • লেখক আর্থার ভ্যান হফ
  • লেখক মার্টিন বুচহলজ
  • লেখক উলফ জিবিস

সূত্র: জাভাডক অফ স্ট্রিং।


0

অবজেক্ট স্ট্রিং - পদ্ধতিগুলি নিজেই "অপরিবর্তনীয়" হিসাবে তৈরি হয়। এই ক্রিয়াটি কোনও পরিবর্তন করে না: "বর্ণের.রেপ্লেস (" বিবিবি "," আআআ ");"

তবে ডেটা বরাদ্দকরণ স্ট্রিংস সামগ্রীতে পরিবর্তনের কারণ ঘটায়:

    letters = "aaa";
    letters=null;
    System.out.println(letters);
    System.out.println(oB.hashCode());
    System.out.println(letters);
    letters = "bbbaaa";
    System.out.println(oB.hashCode());
    System.out.println(letters);

// স্ট্রিং অবজেক্টের হ্যাশকোড পরিবর্তন হয় না।


0

যদি HELLOআপনার স্ট্রিং তারপর আপনি পরিবর্তন করতে পারবেন না HELLOকরার HILLO। এই সম্পত্তিটিকে অপরিবর্তনীয় সম্পত্তি বলে।

HELLO স্ট্রিংকে নির্দেশ করতে আপনার কাছে একাধিক পয়েন্টার স্ট্রিং ভেরিয়েবল থাকতে পারে।

তবে যদি হেল্লো চর অ্যারে হয় তবে আপনি হেল্লোকে হিল্লোতে পরিবর্তন করতে পারেন। যেমন,

char[] charArr = 'HELLO';
char[1] = 'I'; //you can do this

প্রোগ্রামিং ভাষাগুলিতে অপরিবর্তনীয় ডেটা ভেরিয়েবল রয়েছে যাতে এটি কী, মান জোড়ের কী হিসাবে ব্যবহার করা যায়।


0

আমি এটি সাধারণ উদাহরণ দিয়ে ব্যাখ্যা করব


যে কোনও চরিত্রের অ্যারে বিবেচনা করুন: যেমন চর a [] = {'এইচ', 'ই', 'ল', 'ল', 'ও'}; এবং একটি স্ট্রিং: স্ট্রিং s = "হ্যালো";


অক্ষর অ্যারেতে আমরা অ্যারে পুনরুক্ত করে কেবলমাত্র তিনটি অক্ষর মুদ্রণের মতো ক্রিয়াকলাপ সম্পাদন করতে পারি; তবে স্ট্রিংয়ে আমাদের নতুন স্ট্রিং অবজেক্ট তৈরি করতে হবে এবং প্রয়োজনীয় স্ট্রিংয়ের কপি করতে হবে এবং এর ঠিকানাটি নতুন স্ট্রিং অবজেক্টে থাকবে।

যেমন

***String s="hello";
String s2=s.substrig(0,3);***

সুতরাং এস 2 এর "হেল" থাকবে;


-1

জাভাতে অপরিবর্তনীয় ও ফাইনালের স্ট্রিংয়ের অর্থ কেবল এটি পরিবর্তন বা সংশোধন করা যায় না:

মামলা 1:

class TestClass{  
 public static void main(String args[]){  
   String str = "ABC";  
   str.concat("DEF");  
   System.out.println(str);  
 }  
} 

আউটপুট: এবিসি

কারণ: অবজেক্ট রেফারেন্স আরআর আসলে পরিবর্তিত হয় না একটি নতুন অবজেক্ট "ডিইএফ" তৈরি করা হয়েছে যা পুলটিতে রয়েছে এবং এর কোনও রেফারেন্স নেই (অর্থাত্ হারিয়ে গেছে)।

কেস 2:

class TestClass{  
 public static void main(String args[]){  
   String str="ABC";  
   str=str.concat("DEF");  
   System.out.println(str);  
 }  
}  

আউটপুট: এবিসিডিইএফ

কারণ: এই ক্ষেত্রে str এখন একটি নতুন অবজেক্ট "এবিসিডিইএফ" উল্লেখ করছে সুতরাং এটি এবিসিডিএফ প্রিন্ট করে অর্থাৎ পূর্ববর্তী স্ট্রিং অবজেক্ট "এবিসি" কোনও পুলের মধ্যে হারিয়ে গেছে।


-1

স্ট্রিং অপরিবর্তনীয় তাই পরিবর্তনগুলি ঘটবে না যদি আপনি স্ট্রিংকে ফাংশনের প্রত্যাশিত মান বরাদ্দ করেন না। সুতরাং আপনার প্রশ্নে অদলবদল ফাংশনটির মানকে এস-তে ফেরত মান প্রদান করবে।

s = swap (s, n1, n2); তারপরে স্ট্রিংয়ের মান পরিবর্তন হবে।

আমি যখন কিছু ক্রিয়াকলাপের স্ট্রিং পাওয়ার জন্য প্রোগ্রাম লিখছিলাম তখন আমি অপরিবর্তিত মানটিও পাচ্ছিলাম (যদিও এটি সমস্ত অনুমোদন দিচ্ছে না তবে এটি আপনার প্রশ্নের উত্তর দেওয়ার জন্য উদাহরণস্বরূপ)

এখানে একটি উদাহরণ।

> import java.io.*;  public class MyString { public static void
> main(String []args)throws IOException {  BufferedReader br=new
> BufferedReader(new InputStreamReader(System.in));  String
> s=br.readLine().trim(); int n=0;int k=0;  while(n!=s.length()) {
> while(k<n){  swap(s,k,n); System.out.println(s); swap(s,k,n); k++; }
> n++; } }  public static void swap(String s,int n1,int n2) { char temp;
> temp=s.charAt(n1); StringBuilder sb=new StringBuilder(s);
> sb.setCharAt(n1,s.charAt(n2)); sb.setCharAt(n2,temp); s=sb.toString();
> } }

তবে আমি উপরের কোড থেকে স্ট্রিংয়ের অনুমতিপ্রাপ্ত মান পাচ্ছি না o সুতরাং আমি অদলবদল ফাংশনটির ফিরে আসা মানটি স্ট্রিংয়ে অর্পণ করেছি এবং স্ট্রিংয়ের পরিবর্তিত মান পেয়েছি। প্রত্যাবর্তিত মান নির্ধারণের পরে আমি স্ট্রিংয়ের অনুমতিপ্রাপ্ত মান পেয়েছি।

/import java.util.*; import java.io.*; public class MyString { public static void main(String []args)throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
String s=br.readLine().trim(); int n=0;int k=0; 
while(n!=s.length()){ while(k<n){ s=swap(s,k,n); 
System.out.println(s); s=swap(s,k,n); k++; } n++; } } 
public static String swap(String s,int n1,int n2){
char temp; temp=s.charAt(n1); StringBuilder sb=new StringBuilder(s); sb.setCharAt(n1,s.charAt(n2)); sb.setCharAt(n2,temp); s=sb.toString(); return s; } }

-1
    public final class String_Test {

    String name;
    List<String> list=new ArrayList<String>();

    public static void main(String[] args) {

        String_Test obj=new String_Test();
        obj.list.add("item");//List will point to a memory unit- i.e will have one Hashcode value #1234

        List<String> list2=obj.list; //lis1 also will point to same #1234

        obj.list.add("new item");//Hashcode of list is not altered- List is mutable, so reference remains same, only value in that memory location changes

        String name2=obj.name="Myname"; // name2 and name will point to same instance of string -Hashcode #5678
        obj.name = "second name";// String is Immutable- New String HAI is created and name will point to this new instance- bcoz of this Hashcode changes here #0089

        System.out.println(obj.list.hashCode());
        System.out.println(list2.hashCode());
        System.out.println(list3.hashCode());

        System.out.println("===========");
        System.out.println(obj.name.hashCode());
        System.out.println(name2.hashCode());
    }
}

এই মত কিছু করা উত্পাদন করা হবে

1419358369 1419358369

103056 65078777

অপ্রচলিত বস্তুর উদ্দেশ্য হ'ল এর মান একবার বরাদ্দ করা উচিত নয়। বাস্তবায়নের ভিত্তিতে আপনি যখনই এটি পরিবর্তন করার চেষ্টা করবেন এটি প্রতিটি নতুন বস্তু ফিরে আসবে। দ্রষ্টব্য: স্ট্রিংয়ের পরিবর্তে স্ট্রিংবফার এটি এড়াতে ব্যবহার করা যেতে পারে।

আপনার শেষ প্রশ্নটির :: আপনার কাছে একটি রেফারেন্স থাকবে এবং স্ট্রিং পুলে 2 টি স্ট্রিং থাকবে .. রেফারেন্স ব্যতীত এম! এসএস! এসএস! পিপি নির্দেশ করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.