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


78

আমি এর কারণ বুঝতে পারি না। আমি সর্বদা অন্যান্য বিকাশকারীদের মতো স্ট্রিং ক্লাস ব্যবহার করি তবে আমি যখন এর মানটি পরিবর্তন করি তখন স্ট্রিংয়ের নতুন উদাহরণ তৈরি হয়।

জাভাতে স্ট্রিং ক্লাসের অপরিবর্তনীয়তার কারণ কী হতে পারে?

আমি জানি স্ট্রিংবুফার বা স্ট্রিংবিল্ডারের মতো কিছু বিকল্প আছে। এটি কেবল কৌতূহল।


20
প্রযুক্তিগতভাবে, এটি কোনও সদৃশ নয়, তবে এরিক লিপার্ট এখানে এই প্রশ্নের দুর্দান্ত উত্তর দেয়: প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জাও
১১৯৯১/

উত্তর:


105

concurrency

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

অনেকগুলি মাল্টিথ্রেডেড সি ++ বাগ রয়েছে যা একটি ভাগ করা স্ট্রিংয়ের কারণে ক্রপ হয়ে গেছে - যেখানে একটি মডিউল মনে করেছিল যে এটি পরিবর্তন করা নিরাপদ যখন কোডের অন্য একটি মডিউল এটিতে একটি পয়েন্টার সংরক্ষণ করেছিল এবং আশা করে যে এটি একই থাকবে।

এর 'সমাধান' হ'ল প্রতিটি বর্গ এটি পরিবর্তনযোগ্য অবজেক্টগুলির প্রতিরক্ষামূলক অনুলিপি তৈরি করে। পরিবর্তনীয় স্ট্রিংয়ের জন্য, অনুলিপিটি তৈরি করা ও (এন)। অপরিবর্তনীয় স্ট্রিংয়ের জন্য, অনুলিপি তৈরি করা ও (1) কারণ এটি অনুলিপি নয়, এটি একই জিনিস যা পরিবর্তন করতে পারে না।

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

নিরাপত্তা

কনস্ট্রাক্টরদের পক্ষে যুক্তি হিসাবে প্রায়শই বার স্ট্রিংগুলি পাস করা হয় - নেটওয়ার্ক সংযোগ এবং প্রোটোকল দুটি যা সবচেয়ে সহজে মনে আসে। মৃত্যুদন্ড কার্যকর করার পরে একটি নির্ধারিত সময়ে এটিকে পরিবর্তন করতে সক্ষম হওয়ায় সুরক্ষা সমস্যা দেখা দিতে পারে (ফাংশনটি ভেবেছিল যে এটি একটি মেশিনের সাথে সংযোগ স্থাপন করছে, তবে অন্যটিতে ডাইভার্ট করা হয়েছিল, তবে অবজেক্টের সমস্ত কিছুই দেখে মনে হচ্ছে এটি প্রথমটির সাথে সংযুক্ত ... এটি এমনকি একই স্ট্রিং)।

জাভা একটিকে প্রতিবিম্বিত করতে দেয় - এবং এর জন্য পরামিতিগুলি স্ট্রিং। একের স্ট্রিং দিয়ে যাওয়ার বিপদ যা প্রতিফলিত করে এমন অন্য পদ্ধতির পথে সংশোধন করতে পারে। এটা খুব খারাপ.

হ্যাশ কী

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

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

সাবস্ট্রিং

স্ট্রিং অপরিবর্তনীয় হতে পারে, তথ্য কাঠামোর পিছনে থাকা অন্তর্নিহিত অক্ষর অ্যারেও অপরিবর্তনীয়। এটি করার substringপদ্ধতিটিতে নির্দিষ্ট অপ্টিমাইজেশনের অনুমতি দেয় (এগুলি অগত্যা করা হয় না - এটি কিছু মেমরি ফাঁসের সম্ভাবনাও প্রবর্তন করে)।

যদি তুমি করো:

String foo = "smiles";
String bar = foo.substring(1,5);

এর মান bar'মাইল'। যাইহোক, উভয় fooএবং barএকই অক্ষর অ্যারে দ্বারা সমর্থন করা যেতে পারে, আরও অক্ষর অ্যারের ইনস্ট্যান্টেশন কমিয়ে আনা বা এটি অনুলিপি করা - স্ট্রিংয়ের মধ্যে বিভিন্ন স্টার্ট এবং শেষ পয়েন্টগুলি ব্যবহার করে।

foo | | (0, 6)
    VV
    হাসি
     ^ ^
বার | | (1, 5)

এখন, এর (মেমরি ফুটো) এর নেতিবাচক দিকটি হ'ল যদি কারও কাছে 1k লম্বা স্ট্রিং থাকে এবং প্রথম এবং দ্বিতীয় চরিত্রের সাবস্ট্রিং গ্রহণ করে, এটিও 1k দীর্ঘ অক্ষরের অ্যারে দ্বারা সমর্থনযুক্ত হবে। এই অক্ষর মেমরিতে থাকবে এমনকি যদি মূল চরিত্রের পুরো অক্ষরের অ্যারের মান থাকে তবে আবর্জনা সংগ্রহ করা হত।

এটি স্ট্রিং-এ জেডিকে 6 বি 14 থেকে দেখতে পাবেন (নিম্নলিখিত কোডটি জিপিএল ভি 2 উত্স থেকে প্রাপ্ত এবং উদাহরণ হিসাবে ব্যবহৃত হয়)

   public String(char value[], int offset, int count) {
       if (offset < 0) {
           throw new StringIndexOutOfBoundsException(offset);
       }
       if (count < 0) {
           throw new StringIndexOutOfBoundsException(count);
       }
       // Note: offset or count might be near -1>>>1.
       if (offset > value.length - count) {
           throw new StringIndexOutOfBoundsException(offset + count);
       }
       this.offset = 0;
       this.count = count;
       this.value = Arrays.copyOfRange(value, offset, offset+count);
   }

   // Package private constructor which shares value array for speed.
   String(int offset, int count, char value[]) {
       this.value = value;
       this.offset = offset;
       this.count = count;
   }

   public String substring(int beginIndex, int endIndex) {
       if (beginIndex < 0) {
           throw new StringIndexOutOfBoundsException(beginIndex);
       }
       if (endIndex > count) {
           throw new StringIndexOutOfBoundsException(endIndex);
       }
       if (beginIndex > endIndex) {
           throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
       }
       return ((beginIndex == 0) && (endIndex == count)) ? this :
           new String(offset + beginIndex, endIndex - beginIndex, value);
   }

স্ট্রিং কীভাবে প্যাকেজ স্তরের স্ট্রিং কনস্ট্রাক্টরকে ব্যবহার করে যা অ্যারের কোনও অনুলিপি জড়িত না এবং এটি আরও দ্রুত হবে (সম্ভবত কিছু বড় অ্যারে প্রায় রাখার ব্যয়ে - যদিও বড় অ্যারেগুলি নকল না করে)।

উল্লেখ্য যে উপরের কোডটি জাভা ১.6 এর জন্য। জাভা ১.7.০.০66 এ স্ট্রিংয়ের অভ্যন্তরীণ উপস্থাপনায় পরিবর্তনগুলিতে নথিভুক্ত হিসাবে স্ট্রিংং কনস্ট্রাক্টর বাস্তবায়নের উপায়টি জাভা ১.7 দিয়ে পরিবর্তিত হয়েছিল - যা আমি উপরে উল্লিখিত মেমরি ফাঁসকে বিঙ্গিত করে তোলে । জাভা সম্ভবত প্রচুর স্ট্রিং ম্যানিপুলেশন সহ একটি ভাষা হিসাবে দেখা যায় নি এবং তাই একটি স্ট্রিংয়ের জন্য পারফরম্যান্স বাড়ানো ভাল জিনিস ছিল। এখন, স্ট্রিংগুলিতে বিশাল আকারের এক্সএমএল নথি সংরক্ষণ করা হয় যা কখনই সংগ্রহ করা হয় না, এটি একটি ইস্যুতে পরিণত হয় ... এবং সুতরাং Stringস্ট্রাস্টিং সহ একই অন্তর্নিহিত অ্যারেটি ব্যবহার না করার পরিবর্তনে , যাতে আরও বড় অক্ষরের অ্যারে আরও দ্রুত সংগ্রহ করা যায়।

স্ট্যাক অপব্যবহার করবেন না

এক পারে পরিবর্তে প্রায় অপরিবর্তনীয় স্ট্রিং রেফারেন্স পরিবর্তনশীলতা সঙ্গে সমস্যা এড়ানোর জন্য স্ট্রিং এর মান পাস। তবে, বড় স্ট্রিং সহ, স্ট্যাকটিতে এটি পাস করা ... সিস্টেমের কাছে আপত্তিজনক হবে (পুরো xML ডকুমেন্টকে স্ট্যাকের স্ট্রিং হিসাবে রাখা এবং তারপরে সেগুলি বন্ধ করে দেওয়া বা তাদের সাথে চালিয়ে যাওয়া ...)।

ছাড়ের সম্ভাবনা

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

যে কেউ স্ট্রিংসের সাথে কিছুটা কাজ করেছেন জানেন যে তারা স্মৃতি চুষতে পারেন। এটি বিশেষভাবে সত্য যখন আপনি কিছু সময়ের জন্য স্থায়ীভাবে থাকা ডাটাবেসগুলি থেকে ডেটা টানার মতো কাজ করেন। এই স্টিংগুলির সাথে অনেক সময়, তারা বারবার একই স্ট্রিং হয় (প্রতিটি সারির জন্য একবার)।

অনেক বড় আকারের জাভা অ্যাপ্লিকেশন বর্তমানে স্মৃতিতে বাধা রয়েছে। পরিমাপ থেকে প্রমাণিত হয়েছে যে জাভা হিপ লাইভ ডেটা এই ধরণের অ্যাপ্লিকেশনগুলিতে সেট করা প্রায় 25% স্ট্রিং অবজেক্ট দ্বারা গ্রাস করা হয়। আরও, স্ট্রিং অবজেক্টগুলির প্রায় অর্ধেকটি নকল, যেখানে সদৃশ মানে স্ট্রিং 1.equals (স্ট্রিং 2) সত্য। স্তূপে নকল স্ট্রিং অবজেক্টগুলি থাকা, মূলত, কেবল স্মৃতির অপচয়। ...

জাভা 8 আপডেট 20 দিয়ে, JEP 192 (উপরে উত্সাহিত অনুপ্রেরণা) এটি সমাধানের জন্য প্রয়োগ করা হচ্ছে। স্ট্রিং ডুপ্লিকেশন কীভাবে কাজ করে তার বিশদ না জেনে স্ট্রিংগুলি নিজেরাই অপরিবর্তনীয়। আপনি স্ট্রিংবিল্ডারদের সদৃশ করতে পারবেন না কারণ তারা পরিবর্তন করতে পারে এবং আপনি চান না যে কেউ আপনার অধীনে থেকে কিছু পরিবর্তন করবে। অপরিবর্তনীয় স্ট্রিংস (সেই স্ট্রিং পুলের সাথে সম্পর্কিত) এর অর্থ হল আপনি যেতে পারেন এবং যদি আপনি দুটি স্ট্রিং একইরকম দেখতে পান তবে আপনি অন্যটির সাথে একটি স্ট্রিং রেফারেন্স নির্দেশ করতে পারেন এবং আবর্জনা সংগ্রহকারীকে সদ্য ব্যবহৃত না হওয়াটিকে গ্রাস করতে দিন।

অন্যান্য ভাষাসমূহ

উদ্দেশ্য সি (যা জাভা পূর্বাভাস দেয়) আছে NSStringএবং NSMutableString

সি # এবং .NET ডিফল্ট স্ট্রিংয়ের একই নকশার পছন্দগুলি অপরিবর্তনীয়।

লুয়া স্ট্রিংগুলিও অপরিবর্তনীয়।

পাইথন পাশাপাশি।

.তিহাসিকভাবে, লিস্প, স্কিম, স্মলটাক সমস্ত স্ট্রিংকে অন্তর্ভুক্ত করে এবং তাই এটি অপরিবর্তনীয় হতে পারে। আরও আধুনিক গতিশীল ভাষাগুলি প্রায়শই কিছু উপায়ে স্ট্রিং ব্যবহার করে যার প্রয়োজন হয় সেগুলি অপরিবর্তনীয় (এটি স্ট্রিং নাও হতে পারে , তবে এটি অপরিবর্তনীয়)।

উপসংহার

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


3
জাভা পরিবর্তনীয় এবং অপরিবর্তনীয় স্ট্রিং সরবরাহ করে। এই উত্তরে কিছু পারফরম্যান্স সুবিধা যা অপরিবর্তনীয় স্ট্রিংয়ে করা যেতে পারে এবং কিছু কারণে অপরিবর্তনীয় ডেটা বেছে নিতে পারে; তবে কেন অপরিবর্তনীয় সংস্করণটি ডিফল্ট সংস্করণ তা নিয়ে আলোচনা করে না।
বিলি ওনিল

3
@ বিলিওনিল: একটি সুরক্ষিত ডিফল্ট এবং একটি অনিরাপদ বিকল্প প্রায়শই সর্বদা বিপরীত পদ্ধতির চেয়ে বেশি সুরক্ষিত সিস্টেমগুলিতে নিয়ে যায়।
জোছিম সৌর

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

@ জোয়াচিম: আমি অন্যথায় দাবি করছি না।
বিলি ওনিল

1
প্রযুক্তিগতভাবে, কমন লিস্পের "স্ট্রিং-জাতীয়" ক্রিয়াকলাপের জন্য এবং পরিবর্তনীয় শনাক্তকারীদের জন্য পরিবর্তনীয় নামের প্রতীকগুলির জন্য পরিবর্তনীয় স্ট্রিং রয়েছে।
ভ্যাটাইন

21

যে কারণগুলি আমি স্মরণ করতে পারি:

  1. স্ট্রিং পুলের সুবিধা স্ট্রিংকে পরিবর্তনযোগ্য না করে তৈরি করা মোটেই সম্ভব নয় কারণ স্ট্রিং পুলের ক্ষেত্রে একটি স্ট্রিং অবজেক্ট / আক্ষরিক যেমন "এক্সওয়াইজেড" অনেক রেফারেন্স ভেরিয়েবল দ্বারা রেফারেন্স করা হবে, সুতরাং যদি তাদের কোনওটির মান পরিবর্তন হয় তবে অন্যরা স্বয়ংক্রিয়ভাবে প্রভাবিত হবে ।

  2. স্ট্রিং বেশ কয়েকটি জাভা ক্লাসের প্যারামিটার হিসাবে বহুল ব্যবহৃত হয়েছে যেমন নেটওয়ার্ক সংযোগ খোলার জন্য, ডাটাবেস সংযোগ খোলার জন্য, ফাইল খোলার জন্য। স্ট্রিং যদি পরিবর্তনযোগ্য না হয়, তবে এটি গুরুতর সুরক্ষার হুমকির কারণ হতে পারে।

  3. অপরিচ্ছন্নতা স্ট্রিংকে এর হ্যাশকোড ক্যাশে রাখতে দেয়।

  4. এটি থ্রেড-নিরাপদ করে তোলে।


7

1) স্ট্রিং পুল

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

String s1 = "Java";
String s2 = "Java";

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

2) সুরক্ষা

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

3) ক্লাস লোডিং মেকানিজমে স্ট্রিংয়ের ব্যবহার

স্ট্রিংকে চূড়ান্ত বা অপরিবর্তনীয় করে তোলার আরও একটি কারণ এটি শ্রেণীবদ্ধকরণ ব্যবস্থায় অত্যধিক ব্যবহৃত হয়েছিল বলে চালিত হয়েছিল। স্ট্রিং যেমন অপরিবর্তনীয় নয়, কোনও আক্রমণকারী এই বাস্তবতার সুযোগ নিতে পারে এবং স্ট্যান্ডার্ড জাভা ক্লাস লোড করার জন্য অনুরোধ করতে পারে যেমন java.io.Reader কে দূষিত শ্রেণীর com.unعلوم.DataStolenReader এ পরিবর্তন করা যেতে পারে। স্ট্রিংকে চূড়ান্ত এবং অপরিবর্তনীয় রেখে, আমরা কমপক্ষে নিশ্চিত হতে পারি যে জেভিএম সঠিক ক্লাসগুলি লোড করছে।

4) মাল্টিথ্রেডিং বেনিফিট

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

5) অপ্টিমাইজেশন এবং পারফরম্যান্স

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


5

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

এটি "মিসিসিপি" এর মতো ছোট স্ট্রিংয়ের পক্ষে তুচ্ছ, তবে বৃহত্তর স্ট্রিং এবং একাধিক ক্রিয়াকলাপের সাথে, স্ট্রিংটি অনুলিপি না করা বড় সময়ের সাশ্রয়কারী! যদি স্ট্রিংগুলি পরিবর্তনযোগ্য হয় তবে আপনি এটি করতে পারতেন না কারণ আসলটি পরিবর্তন করে স্ট্রিংয়ের "অনুলিপিগুলিকেও" প্রভাবিত করবে।

এছাড়াও, ডোনাল যেমন উল্লেখ করেছেন, সুবিধাগুলি এর অসুবিধার দ্বারা ব্যাপকভাবে ওজন হবে। কল্পনা করুন যে আপনি একটি প্রোগ্রাম লিখেছেন যা একটি লাইব্রেরির উপর নির্ভর করে এবং আপনি কোনও ফাংশন ব্যবহার করেন যা কোনও স্ট্রিং দেয় returns আপনি কীভাবে নিশ্চিত হতে পারেন যে সেই মান স্থির থাকবে? এ জাতীয় কোনও ঘটনা যাতে না ঘটে তা নিশ্চিত করতে আপনাকে সর্বদা একটি অনুলিপি তৈরি করতে হবে।

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

এই সমস্ত কারণে, সি ++ থেকে নিজেকে আলাদা করার জন্য এটি জাভাতে করা প্রাথমিক সিদ্ধান্তগুলির মধ্যে একটি ছিল।


তাত্ত্বিকভাবে, আপনি একটি মাল্টি-লেয়ার বাফার পরিচালনা করতে পারেন যা অনুলিপি-যদি ভাগ করে নেওয়ার অনুমতি দেয় তবে এটি মাল্টি-থ্রেড পরিবেশে দক্ষতার সাথে কাজ করা খুব কঠিন that's
ডোনাল ফেলো

@ ডোনালফেলো আমি কেবল ধরে নিয়েছি যে যেহেতু জাভা ভার্চুয়াল মেশিন জাভাতে লেখা নেই (স্পষ্টতই), তাই এটি ভাগ করে নেওয়া পয়েন্টার বা এর মতো কিছু ব্যবহার করে অভ্যন্তরীণভাবে পরিচালিত হয়।
নীল

5

স্ট্রিংয়ের অপরিবর্তনীয়তার কারণটি ভাষার অন্যান্য আদিম ধরণের সাথে সামঞ্জস্যতা থেকে আসে। আপনার যদি intমান 42 থাকে এবং আপনি এর সাথে মান 1 যোগ করেন তবে আপনি 42 টি পরিবর্তন করবেন না 43 43 আপনি একটি নতুন মান পাবেন যা শুরু মানগুলির সাথে সম্পূর্ণ সম্পর্কিত নয়। স্ট্রিং ব্যতীত আদিমগুলিকে মিউট করা কোনও ধারণামূলক ধারণা দেয় না; এবং যেমন প্রোগ্রামগুলি স্ট্রিংগুলিকে অপরিবর্তনীয় বলে মনে করে তাদের সম্পর্কে প্রায়শই যুক্তি করা এবং বোঝা সহজ।

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

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


@ বিলি-ওয়াল .. সম্পর্কিত "আপনার যদি 42 এর মান রয়েছে এবং আপনি এর সাথে মান 1 যোগ করেন তবে আপনি 42 টি পরিবর্তন করবেন না You 43 আপনি একটি নতুন মান পাবেন যা শুরু থেকে সম্পূর্ণ সম্পর্কিত নয় re মান। " আপনি কি এ ব্যাপারে নিশ্চিত?
শমিত ভার্মা

@ শামিত: হ্যাঁ, আমি নিশ্চিত 43 এ 1 থেকে 42 ফলাফল যুক্ত করা। এটি 42 নম্বরটি 43 নম্বর হিসাবে একই
জিনিসটিকে বোঝায় না

@ শামিত: একইভাবে, আপনিও কিছু করতে পারবেন না 43 = 6এবং প্রত্যাশা করতে পারেন 43 নম্বরটি 6 নম্বর হিসাবে একই জিনিসটি বোঝায়
বিলি ওনেল

int i = 42; i = i + 1; এই কোড স্মৃতিতে 42 সংরক্ষণ এবং তারপর 43. একই অবস্থানে মান পরিবর্তন করতে হবে তাই আসলে, পরিবর্তনশীল "আমি" 43 একটি নতুন মান অর্জন
Shamit ভার্মা

@ শামিত: সেক্ষেত্রে আপনার পরিবর্তন হয়েছে i, ৪২ নয় Consider বিবেচনা করুন string s = "Hello "; s += "World";। আপনি ভেরিয়েবলের মানটি পরিবর্তন করেছেন s। কিন্তু স্ট্রিং "Hello ", "World"এবং "Hello World"অপরিবর্তনীয় হয়।
বিলি ওনিল

4

অপরিচ্ছন্নতা মানে আপনার নিজের না এমন শ্রেণি দ্বারা আটকানো ধ্রুবকগুলি সংশোধন করা যায় না। আপনার নিজের নয় এমন ক্লাসগুলির মধ্যে যা জাভা বাস্তবায়নের মূল অংশে অন্তর্ভুক্ত রয়েছে এবং যে স্ট্রিংগুলিতে পরিবর্তন করা উচিত নয় সেগুলির মধ্যে সুরক্ষা টোকেন, পরিষেবা ঠিকানা ইত্যাদির অন্তর্ভুক্ত রয়েছে You আপনি সত্যিকার অর্থে এই ধরণের পরিবর্তন করতে সক্ষম হবেন না জিনিসগুলির (এবং স্যান্ডবক্সযুক্ত মোডে অপারেটিং করার সময় এটি দ্বিগুণভাবে প্রযোজ্য)।

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


4
এই একই একই যুক্তি যে কোনও ধরণের ক্ষেত্রেই প্রযোজ্য , কেবল তেমন নয় String। তবে, উদাহরণস্বরূপ, Arrays তবে যাইহোক পরিবর্তনযোগ্য। সুতরাং, কেন Stringঅপরিবর্তনীয় এবং হয় Arrayনা। এবং যদি অপরিবর্তনশীলতা এত গুরুত্বপূর্ণ, তবে জাভা কেন অপরিবর্তনীয় বস্তু তৈরি এবং কাজ করতে এত কঠিন করে?
Jörg W Mittag

1
@ জার্গডব্লিউমিত্যাগ: আমি ধরে নিই যে এটি মূলত একটি প্রশ্ন যে তারা কতটা মৌলবাদী হতে চেয়েছিল। অপরিবর্তনীয় স্ট্রিং থাকা জাভাতে ১.০ দিনের মধ্যে ছিল বেশ মৌলিক। একটি (প্রাথমিকভাবে বা এমনকি একচেটিয়া) অপরিবর্তনীয় সংগ্রহ কাঠামো থাকা, ভাষার বিস্তৃত ব্যবহার পাওয়ার জন্য খুব মৌলিক হতে পারে।
জোচিম সৌর

কার্যকর অপরিবর্তনীয় সংগ্রহের কাঠামো করা পারফরম্যান্স করা বেশ মুশকিল, এমন কথা লিখেছেন এমন ব্যক্তির মতো কথা বলা (তবে জাভাতে নয়)। আমি সম্পূর্ণরূপে ইচ্ছুক যে আমার অস্থায়ীভাবে অ্যারে ছিল; এটি আমাকে বেশ কিছু কাজ বাঁচাতে পারত।
ডোনাল ফেলো

@ ডোনালফেলোস: পোকোলিকেশনগুলির লক্ষ্য কেবল এটি করা (যদিও এটি কখনও নিজে ব্যবহার করা হয়নি)।
জোচিম সৌর

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

2

এমন কোনও সিস্টেমের কল্পনা করুন যেখানে আপনি কিছু ডেটা গ্রহণ করেন, এর যথার্থতা যাচাই করুন এবং তারপরে এটি পাস করুন (উদাহরণস্বরূপ কোনও ডিবিতে সংরক্ষণ করার জন্য)।

ধরে নিই যে ডেটা একটি Stringএবং এটি কমপক্ষে 5 টি অক্ষর দীর্ঘ হতে হবে। আপনার পদ্ধতিটি এরকম কিছু দেখাচ্ছে:

public void handle(String input) {
  if (input.length() < 5) {
    throw new IllegalArgumentException();
  }
  storeInDatabase(input);
}

এখন আমরা একমত হতে পারি, যখন storeInDatabaseএখানে ডাকা inputহবে, প্রয়োজনের সাথে মানিয়ে যাবে। কিন্তু যদি Stringচপল হয় তাহলে কলার পরিবর্তন হতে পারে inputবস্তু (অন্য থ্রেড থেকে) ডান পরে এটি যাচাই করা হয়েছে এবং আগেই ডাটাবেসের মধ্যে সংরক্ষিত হয়েছে । এটির জন্য ভাল সময় প্রয়োজন এবং সম্ভবত প্রতিটি সময় ভাল হতে পারে না, তবে মাঝে মাঝে তিনি আপনাকে ডাটাবেসে অবৈধ মান সংরক্ষণ করতে সক্ষম হবেন।

অপরিবর্তনীয় ডেটা প্রকারগুলি হ'ল এটির (এবং অনেকগুলি সম্পর্কিত) সমস্যার খুব সহজ সমাধান: আপনি যখনই কোনও মান পরীক্ষা করেন, আপনি পরে পরীক্ষা করে শর্তটি এখনও সত্য কিনা তার উপর নির্ভর করতে পারেন ।


ব্যাখ্যা করার জন্য ধন্যবাদ. আমি যদি হ্যান্ডেল পদ্ধতিটিকে এভাবে কল করি; হ্যান্ডেল (নতুন স্ট্রিং (ইনপুট + "ন্যাবারলান"))। আমার ধারণা আমি এইভাবে ডিবিতে অবৈধ মান সংরক্ষণ করতে পারি।
yfklon

1
@blank: ভাল, যেহেতু inputএর handleপদ্ধতি ইতিমধ্যে অত্যন্ত দীর্ঘ (কোন ব্যাপার কি মূল input হয়), এটা শুধু একটি ব্যতিক্রম নিক্ষেপ করবে। পদ্ধতিটি কল করার আগে আপনি একটি নতুন ইনপুট তৈরি করছেন । এটা কোন সমস্যা না.
জোচিম সৌর

0

সাধারণভাবে, আপনি মান ধরণের এবং রেফারেন্স ধরণের মুখোমুখি হবেন । একটি মান প্রকারের সাথে, আপনি যে বিষয়টিকে উপস্থাপন করে তার বিষয়ে আপনি পাত্তা দিচ্ছেন না, আপনি মানটির বিষয়ে চিন্তা করেন। যদি আমি আপনাকে একটি মান দেয় তবে আপনি সেই মানটি একই থাকবেন বলে আশা করছেন। আপনি হঠাৎ এটি পরিবর্তন করতে চান না। 5 নম্বরটি একটি মান। আপনি হঠাৎ এটি 6 এ পরিবর্তিত হবে বলে আশা করবেন না। "হ্যালো" স্ট্রিংয়ের একটি মান। আপনি হঠাৎ এটি "পি *** অফ" রূপান্তরিত হওয়ার আশা করবেন না।

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

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

বিপরীত সিদ্ধান্ত নেওয়া যেতে পারে, কিন্তু আমার মতে প্রচুর মাথা ব্যথা হতে পারে। অন্য কোথাও যেমন বলা হয়েছে, অনেকগুলি ভাষা একই সিদ্ধান্ত নিয়েছিল এবং একই সিদ্ধান্তে এসেছিল। একটি ব্যতিক্রম সি ++, যার একটি স্ট্রিং ক্লাস রয়েছে এবং স্ট্রিংগুলি ধ্রুবক বা অ-ধ্রুবক হতে পারে, তবে সি ++-তে জাভা থেকে ভিন্ন, অবজেক্টের প্যারামিটারগুলি রেফারেন্স হিসাবে নয় মান হিসাবে পাস হতে পারে।


0

আমি সত্যিই অবাক হয়েছি কেউ এটিকে নির্দেশ করেনি।

উত্তর: এটি পরিবর্তনীয় হলেও তা আপনার উল্লেখযোগ্য উপকারে আসবে না। এটি আপনার ততটা উপকার করতে পারে না যা অতিরিক্ত ঝামেলার সৃষ্টি করে। চলুন মিউটেশনের দুটি সাধারণ ক্ষেত্রে পরীক্ষা করা যাক:

একটি স্ট্রিংয়ের একটি চরিত্র পরিবর্তন করা

যেহেতু জাভা স্ট্রিংয়ের প্রতিটি অক্ষর 2 বা 4 বাইট নেয়, তাই নিজেকে জিজ্ঞাসা করুন, আপনি যদি বিদ্যমান অনুলিপিটি পরিবর্তন করতে পারেন তবে আপনি কি কিছু অর্জন করতে পারবেন?

দৃশ্যে আপনি 2 বাইট চরিত্রের পরিবর্তে 4 বাইট ওয়ান (বা তদ্বিপরীত) দিয়ে প্রতিস্থাপন করছেন, আপনাকে স্ট্রিংয়ের অবশিষ্ট অংশটি 2 বাইট দ্বারা বাম বা ডানে সরিয়ে নিতে হবে। যা সম্পূর্ণ স্ট্রিংটি সম্পূর্ণ গণনা করার দিক থেকে অনুলিপি করা থেকে আলাদা নয়।

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

বিদ্যমান স্ট্রিংয়ে অন্য স্ট্রিং (বা চরিত্র) যুক্ত করা

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

আপনাকে একটি সম্পূর্ণ নতুন স্থানে কনটেনটেটেড স্ট্রিংটি অনুলিপি করতে হবে, যা হ'ল উভয় স্ট্রিং যেমন অপরিবর্তনীয় ছিল ঠিক তেমনই।

আপনি যদি দক্ষতার সাথে সংযোজনগুলি করতে চান তবে আপনি ব্যবহার করতে চাইতে পারেন StringBuilder, যা সম্ভবত ভবিষ্যতের সংযোজন সম্পর্কিত এই উদ্দেশ্যে, একটি স্ট্রিংয়ের শেষে বেশ বড় পরিমাণের জায়গা সংরক্ষণ করে।


-2
  1. তারা ব্যয়বহুল এবং এগুলি অপরিবর্তনীয় রাখার ফলে সাব স্ট্রিংগুলি মূল স্ট্রিংয়ের বাইট অ্যারে ভাগ করে নেওয়ার মতো জিনিসগুলির জন্য অনুমতি দেয়। (গতি বাড়ানো যেমন নতুন বাইট অ্যারে তৈরি করার প্রয়োজন হয় না এবং অনুলিপি করে)

  2. সুরক্ষা - আপনার প্যাকেজ বা ক্লাস কোডটির নামকরণ করা চাইবে না

    [সরানো পুরানো 3 স্ট্রিংবিল্ডার এসসিআর-এর দিকে তাকালো - এটি স্ট্রিং দিয়ে মেমরি ভাগ করে না (পরিবর্তিত হওয়া পর্যন্ত) আমার মনে হয় যে এটি 1.3 বা 1.4 এ ছিল]

  3. ক্যাশে হ্যাশকোড

  4. পরিবর্তনীয় স্ট্রিংগুলির জন্য এসবি ব্যবহার করুন (প্রয়োজন অনুসারে বিল্ডার বা বাফার)


2
১. অবশ্যই, যদি এটি ঘটে থাকে তবে স্ট্রিংয়ের বৃহত অংশগুলি ধ্বংস করতে সক্ষম না হবার শাস্তি রয়েছে। ইন্টার্নিং বিনামূল্যে নয়; যদিও এটি অনেক বাস্তব বিশ্ব প্রোগ্রামের জন্য কর্মক্ষমতা উন্নত করে। ২. সহজেই "স্ট্রিং" এবং "ইমটুটেবল স্ট্রিং" থাকতে পারে যা সেই প্রয়োজনটি পূরণ করতে পারে। ৩. আমি নিশ্চিত যে আমি এটি বুঝতে পারি না ...
বিলি ওনিল

.3। হ্যাশ কোডটি ক্যাশে করা উচিত ছিল। এটিও একটি পরিবর্তনীয় স্ট্রিং দিয়ে করা যেতে পারে। @ বিলি-ওয়াল
tgkprog

-4

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


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

1
"কেন" এর উত্তর হ'ল ভাষা নকশার সিদ্ধান্ত। পরিবর্তনীয় স্ট্রিংগুলিকে সমর্থন করার জন্য তিনটি ভিন্ন ভিন্ন উপায় হ্যাক যা সংকলক / জেভিএম পরিচালনা করবে।
সিওয়াল্যাচ

3
স্ট্রিং এবং স্ট্রিংবফার আসল ছিল। স্ট্রিংবুডার পরে নকশার অসুবিধা স্বীকৃতি দিয়ে স্ট্রিংবিল্ডার যুক্ত করা হয়েছিল। পরিবর্তিত এবং অপরিবর্তনীয় স্ট্রিংগুলি বিভিন্ন অবজেক্ট হিসাবে পাওয়া যায় অনেকগুলি ভাষায় ডিজাইনের বিবেচনাটি বারবার তৈরি করা হয়েছিল এবং সিদ্ধান্ত নিয়েছে যে প্রতিবার প্রতিটি পৃথক বস্তু। সি # "স্ট্রিংগুলি অপরিবর্তনীয়" এবং কেন। নেট স্ট্রিং অপরিবর্তনীয়? , অবজেক্টিভ সি এনএসএসস্ট্রিং অপরিবর্তনীয় এবং এনএস মিটেবল স্ট্রিং পরিবর্তনীয়। stackoverflow.com/questions/9544182
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.