জাভাতে আমার স্ট্রিংগুলি কীভাবে অনুলিপি করা উচিত?


198
    String s = "hello";
    String backup_of_s = s;
    s = "bye";

এই মুহুর্তে, ব্যাকআপ ভেরিয়েবলটিতে এখনও মূল মান "হ্যালো" রয়েছে (এটি স্ট্রিংয়ের অপরিবর্তনীয় অধিকারের কারণে?)।

তবে এই পদ্ধতিটি দিয়ে স্ট্রিংগুলি অনুলিপি করা কি নিরাপদ (যা অবশ্যই নিয়মিত পরিবর্তনীয় জিনিসগুলি অনুলিপি করা নিরাপদ নয়), বা এটি লেখার চেয়ে আরও ভাল? :

    String s = "hello";
    String backup_of_s = new String(s);
    s = "bye";

অন্য কথায়, এই দুটি স্নিপেটের মধ্যে পার্থক্য (যদি থাকে) তবে কী?


সম্পাদনা করুন - প্রথম স্নিপেটটি নিরাপদ থাকার কারণ:

ইতিমধ্যে সরবরাহ করা ভাল উত্তরের (যা মূলত 2 স্নিপেটের মধ্যে পারফরম্যান্সের পার্থক্যের প্রশ্নে মূলত মনোনিবেশ করা হয়েছিল) এর উপর ভিত্তি করে আমাকে কিছুটা বিশদ দিয়ে জিনিসগুলি ব্যাখ্যা করতে দাও:

স্ট্রিং জাভাতে অপরিবর্তনীয়, যার অর্থ একটি স্ট্রিং অবজেক্ট তার নির্মাণের পরে পরিবর্তন করা যায় না। তাই,

String s = "hello";একটি নতুন স্ট্রিং দৃষ্টান্ত তৈরি করে এবং এর ঠিকানাটি বরাদ্দ করে s( sউদাহরণ / বস্তুর উল্লেখ হিসাবে)

String backup_of_s = s;একটি নতুন ভেরিয়েবল তৈরি করে backup_of_sএবং এটি সূচনা করে যাতে এটি বর্তমানে রেফারেন্স করা অবজেক্টটির উল্লেখ করে s

দ্রষ্টব্য: স্ট্রিং অপরিবর্তনীয়তা গ্যারান্টি দেয় যে এই বস্তুটি সংশোধন করা হবে না: আমাদের ব্যাকআপ নিরাপদ

নোট 2: জাভা আবর্জনা সংগ্রহের প্রক্রিয়া গ্যারান্টি দেয় যে যতক্ষণ না এটি কমপক্ষে একটি ভেরিয়েবল দ্বারা উল্লেখ করা হয় ততক্ষণ এই বস্তুটি ধ্বংস হবে না ( backup_of_sএই ক্ষেত্রে)

অবশেষে, s = "bye";আরেকটি স্ট্রিং উদাহরণ তৈরি করে (অপরিবর্তনীয়তার কারণে এটি একমাত্র উপায়), এবং sভেরিয়েবলটি সংশোধন করে যাতে এটি এখন নতুন বস্তুর উল্লেখ করে।

উত্তর:


140

যেহেতু স্ট্রিং অপরিবর্তনীয়, উভয় সংস্করণ নিরাপদ। তবে, এটি কম দক্ষ (এটি একটি অতিরিক্ত বস্তু তৈরি করে এবং কিছু ক্ষেত্রে চরিত্রের ডেটা অনুলিপি করে)।

এটি মাথায় রেখে, প্রথম সংস্করণটি পছন্দ করা উচিত।


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

1
@ বালুসসি, আমি দেখতে পাচ্ছি না যে নতুন স্ট্রিং () কীভাবে জেভিএমের স্ট্রিং পুলে কিছু তৈরি করতে পারে। কেবল স্ট্রিং লিটারালগুলি এবং ইন্টার্ন () এর মাধ্যমে পুলটিতে যাওয়া ব্যক্তিরা পুলটিতে আছেন।
Snicolas

3
@ গ্রিফিডগ: আমি প্রশ্নটি কম আক্ষরিকভাবে পড়ছি। আমি যা বলছি তা হ'ল কেউ স্ট্রিংটি সংশোধন করতে পারে এই আশঙ্কা ছাড়াই স্ট্রিং অবজেক্টের উল্লেখ দেওয়া নিরাপদ out
এনপিই

2
@ গ্রিফিডগ আমি আপনার মন্তব্যটি খুব বিভ্রান্তিকর মনে করি: অপরিবর্তনীয়তা হ'ল প্রথম স্নিপেটকে নিরাপদ করে তোলে, আপনি কেন বলবেন এর "এর" সাথে কোনও সম্পর্ক নেই?
সেবাস্টিয়ান

5
@ সেবাস্তিয়ান এটি যা করছে তা হ'ল রেফারেন্স ভেরিয়েবলটিকে sএকটি ভিন্ন অবজেক্টের ( String"বাই") উল্লেখ করার জন্য পুনরায় সাইন করা হচ্ছে । এটি রেফারেন্স ভেরিয়েবল backup_of_s( String"হ্যালো") যা উল্লেখ করছে তা প্রভাবিত করে না । যেমনটি আমি বলেছিলাম, আমি এসগুলির সাথে একটি সমতুল্য উদাহরণ প্রদান করতে পারি StringBuilder, যা স্থাবর নয় । আমার মন্তব্যটি মূলত ওপিএস বিবৃতি সম্পর্কিত: এই মুহুর্তে, ব্যাকআপ ভেরিয়েবলটিতে এখনও মূল মান "হ্যালো" থাকে (এটি স্ট্রিংয়ের অপরিবর্তনীয় অধিকারের কারণে?)।
গ্রিফিয়েডগ

22

স্ট্রিংগুলি অপরিবর্তনীয় বস্তু যাতে আপনি তাদের কেবলমাত্র তাদের রেফারেন্সটি অনুলিপি করতে পারেন, কারণ রেফারেন্সযুক্ত অবজেক্টটি পরিবর্তন করতে পারে না ...

সুতরাং আপনি কোনও সমস্যা ছাড়াই আপনার প্রথম উদাহরণ হিসাবে অনুলিপি করতে পারেন:

String s = "hello";
String backup_of_s = s;
s = "bye";

10

আপনার দ্বিতীয় সংস্করণটি কম দক্ষ কারণ এটি যখন করার দরকার হয় না তখন এটি একটি অতিরিক্ত স্ট্রিং অবজেক্ট তৈরি করে।

অপরিচ্ছন্নতার অর্থ হল আপনার প্রথম সংস্করণটি আপনার প্রত্যাশার সাথে আচরণ করে এবং এভাবেই পছন্দটি পছন্দ করা যায়।


0

স্ট্রিং পুলের ক্ষেত্রে দ্বিতীয় কেসটিও অদক্ষ, আপনাকে ইন্টার্নটি তৈরি করার জন্য আপনাকে স্পষ্টভাবে রিটার্ন রেফারেন্সে ইন্টার্ন () কল করতে হবে।


-16
String str1="this is a string";
String str2=str1.clone();

এরকম অনুলিপি সম্পর্কে কীভাবে? আমি মনে করি একটি নতুন অনুলিপি পাওয়া আরও ভাল, যাতে রেফারেন্স এবং ফিউচার অ্যাকশনে সংশোধন করার str1সময় এর ডেটা প্রভাবিত হবে না str2


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