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


177

আমাকে একটি সাক্ষাত্কারে জিজ্ঞাসা করা হয়েছিল যে স্ট্রিং কেন অপরিবর্তনীয়

আমি এর উত্তর দিয়েছি:

আমরা যখন মত জাভা একটি স্ট্রিং তৈরি String s1="hello";তারপর একটি বস্তু তৈরি করা হবে স্ট্রিং পুকুর (হ্যালো) এবং S1 নির্দেশিত করা হবে হ্যালো .Now আবার আমরা যদি String s2="hello";তারপর অন্য বস্তুর তৈরি করা হবে তবে S2 নির্দেশ করবে hello কারণ জেভিএম হবে প্রথম চেক যদি একই বস্তুটি স্ট্রিং পুলে উপস্থিত থাকে বা না থাকে present তবে উপস্থিত না হলে কেবল একটি নতুন তৈরি করা হবে অন্যটি নয়।

এখন বলছিস জাভা যদি আমরা পরিবর্তন স্ট্রিং চপল তারপর পারবেন যদি S1 থেকে hello worldতারপর S2 মান হতে হবে hello world, যাতে জাভা স্ট্রিং অপরিবর্তনীয় হয়।

আমার উত্তর সঠিক বা ভুল কিনা কোনও শরীর দয়া করে আমাকে বলতে পারেন ?


46
উত্তর দেওয়া কেন সবসময় কঠিন। সর্বাধিক সঠিক উত্তর সম্ভবত: ভাষা ডিজাইনাররা যেহেতু অনুগ্রহ করে তা ভাল ধারণা ছিল।
কেপিল

1
এছাড়াও দেখুন, এই উত্তর

3
আপনার উত্তর বিন্দু হয় না। সি ++ std::stringপরিবর্তনীয়, তবে তাদের স্ট্রিং পুলও রয়েছে (ভাল, আরও সঠিকভাবে, চরিত্রের অ্যারে পুল)।
সিয়ুয়ান রেন

1
@ রকিং সত্য কথা বলতে কি তা সঠিক কিনা বা না তা নির্ভর করে তারা কীভাবে এটি পড়েন। জিনিসটি হ'ল, জাভাতে একটি স্ট্রিং পুল থাকতে পারে কারণ স্ট্রিং অপরিবর্তনীয়। তারা যদি স্ট্রিংগুলিকে পরিবর্তনযোগ্য করে তোলার সিদ্ধান্ত নিয়েছে তবে তারা স্ট্রিং পুল ব্যবহার না করত; সুতরাং "স্ট্রিং পুল, অতএব অপরিবর্তনীয় স্ট্রিং" বলা সঠিক নাও হতে পারে; এটি আরও অন্যান্য উপায়ে। কারণ অপরিবর্তনীয় স্ট্রিং চয়নের জন্য নীচের রূপরেখা করা হয়, এবং স্ট্রিং পুকুর কাজ কৌশল কারণ যে। তবুও, আপনার উত্তরটি ভুল নয় , এটি সম্পূর্ণ বলে মনে হচ্ছে না। আপনাকে কেবল অপেক্ষা করতে হবে এবং তারা কী বলেছে তা দেখতে হবে।
জেসন সি

34
এই প্রশ্নটি কেন বন্ধ ছিল তা আমি কেবল বুঝতে পারি না। অনুমিত সম্পর্কিত উত্তরটি জাভা সম্পর্কেও নয় এবং এই প্রশ্নের মূল বিষয়টিকে সম্বোধন করে না, যা "কেন"। আমার জন্য এটি আমাদের জন্য একটি দায়িত্বজ্ঞানহীন সম্প্রদায়ের এমন একটি মামলার বিষয়ে যে তারা প্রশ্নে অভিনয় করে যা তারা কিছুই জানেন না। আমি এটি পুনরায় খুলতে মনোনীত করেছি।
এডউইন ডালোরজো

উত্তর:


163

String বিভিন্ন কারণে অপরিবর্তনীয়, এখানে একটি সংক্ষিপ্তসার রয়েছে:

  • সুরক্ষা : প্যারামিটারগুলি সাধারণত হিসাবে প্রদর্শিত হয়String নেটওয়ার্ক সংযোগ, ডাটাবেস সংযোগ url, ব্যবহারকারীর নাম / পাসওয়ার্ড ইত্যাদির হয় able এটি যদি পরিবর্তনীয় হয় তবে এই পরামিতিগুলি সহজেই পরিবর্তন করা যেতে পারে।
  • সিংক্রোনাইজ এবং সম্মতি: স্ট্রিংকে স্বয়ংক্রিয়ভাবে অপরিবর্তনীয় করে তোলা সেগুলি সুসংগতকরণের সমস্যাগুলি সমাধান করে নিরাপদ করে তোলে issues
  • ক্যাশিং : কম্পাইলার যখন আপনার স্ট্রিং অবজেক্টগুলিকে অনুকূল করে , তখন এটি দেখতে পাবে যে দুটি বস্তুর যদি একই মান হয় (a = "টেস্ট", এবং বি = "পরীক্ষা") এবং সুতরাং আপনার কেবলমাত্র একটি স্ট্রিং অবজেক্টের প্রয়োজন হয় (a এবং b উভয়ের জন্যই এই দুটি হবে) একই বস্তুর দিকে নির্দেশ করুন)।
  • শ্রেণি লোডিং : Stringশ্রেণি লোডিংয়ের জন্য আর্গুমেন্ট হিসাবে ব্যবহৃত হয়। যদি পরিবর্তনীয় হয় তবে এর ফলস্বরূপ ভুল শ্রেণি লোড হতে পারে (কারণ পরিবর্তনযোগ্য বস্তুগুলি তাদের রাষ্ট্র পরিবর্তন করে)।

বলা হচ্ছে, Stringকেবল অপরিবর্তনীয়তার অর্থ আপনি এর সর্বজনীন এপিআই ব্যবহার করে এটি পরিবর্তন করতে পারবেন না। আপনি প্রতিবিম্বটি ব্যবহার করে সাধারণ API এড়িয়ে যেতে পারেন। উত্তর এখানে দেখুন

আপনার উদাহরণে, যদি Stringপরিবর্তনীয় হয় তবে নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

  String a="stack";
  System.out.println(a);//prints stack
  a.setValue("overflow");
  System.out.println(a);//if mutable it would print overflow

14
এটি কীভাবে সুরক্ষাকে প্রভাবিত করতে পারে?
আর্কিট মহেশ্বরী

2
কেউ সম্ভব হলে উদাহরণ সহ ক্লাস লোডিংয়ের ব্যাখ্যা দিতে পারেন?
ভিরাজ

6
সুরক্ষা সম্পর্কিত, যদি আমি সংযোগের প্যারামিটারগুলি পরিবর্তন করতে আগ্রহী, এটি রান-টাইমে (কোনও ডিবাগার সহ, ইত্যাদি) সোজা। শ্রেণি লোডিং সম্পর্কিত, যদি Stringপরিবর্তনীয় হয়, তবে শ্রেণি লোডার স্ট্রিংটি প্রবেশ করিয়ে নিয়ে আসত, একটি অনুলিপি তৈরি করত এবং তার অনুলিপি পরিবর্তন করত না। যখন চপল কোন সমস্যা হওয়ার চিন্তা java.lang.Stringগুলি, কিভাবে সি ++ সমাধান এই সমস্যা মনে (যেহেতু চপল হয়েছে std::stringসে।
লিমিটেড প্রায়শ্চিত্তের

সুরক্ষা সম্পর্কিত, প্রোগ্রাম চলাকালীন একটি পরিবর্তনীয় স্ট্রিং কীভাবে পরিবর্তন করা যেতে পারে?
মাস্টারজয়ে

স্ট্রিং যেহেতু অপরিবর্তনীয়, তাই এর হ্যাশকোড তৈরির সময় ক্যাশে করা হয় এবং এটি আবার গণনা করার প্রয়োজন হয় না।
আবদুল আলীম শাকির

45

নীচের দিকের নকশা, দক্ষতা এবং সুরক্ষার কারণে জাভা বিকাশকারীরা স্ট্রিংগুলি পরিবর্তনযোগ্য ।

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

ডিজেনে এই নিবন্ধ অনুসারে :

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

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


7
স্ট্রিং পুল সম্পর্কে আপনার বোঝা ভুল। স্ট্রিং ধ্রুবক অন্তরীণ পুলে নির্মিত কিন্তু এটি একই পাঠ্য সহ একটির বেশি স্ট্রিং অবজেক্ট আছে পুরোপুরি সম্ভব। সে ব্যাপারে আমি সম্মত স্ট্রিং হচ্ছে অপরিবর্তনীয় পুলিং সক্ষম, কিন্তু অনেক পুলিং যেমন নয় SA আপনি বিবৃত করেছি।
জন স্কিটি

@ জোনস্কিট আপনি ঠিক বলেছেন স্ট্রিং এস 1 = নতুন স্ট্রিং ("পরীক্ষা"); স্টেটমেন্টটি ইন্টার্ন পুলে নতুন স্ট্রিং ধ্রুবক তৈরি করে যদি না আমরা পদ্ধতিটি ইন্টার্ন () না বলি। স্ট্রিং ইন্টার্ন পুল সম্পর্কে আমার জ্ঞান আরও গভীর করার জন্য আপনাকে ধন্যবাদ।
অ্যালেক্স ম্যাথিউ 26'15

2
এটি কেবল স্ট্রিং কনস্ট্রাক্টর ব্যবহারের চেয়ে বেশি - প্রায় কোনও কিছু যা একটি নতুন স্ট্রিং তৈরি করে, যেমন স্ট্রিং, স্প্লিট, কনক্যাট ইত্যাদি নতুন স্ট্রিং তৈরি করে। কম্পাইল-টাইম ধ্রুবকগুলি এখানে আদর্শ হিসাবে দেখা যায়, আদর্শ নয় ...
জোন স্কিটি

@ জোনস্কিট সাবস্ট্রিং (), কনক্যাট (), রিপ্লেস () ইত্যাদি অভ্যন্তরীণভাবে নতুন স্ট্রিং অবজেক্ট তৈরির জন্য স্ট্রিং কনস্ট্রাক্টর ব্যবহার করছে। আমার উত্তর উন্নতির জন্য আপনাকে ধন্যবাদ।
অ্যালেক্স ম্যাথিউ

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

25

আমরা জাভা ডিজাইনাররা ডিজাইনের সময় আসলে কী ভাবছিলাম তা নিশ্চিত হতে পারি না Stringতবে আমরা স্ট্রিং অপরিবর্তনীয়তা থেকে বেরিয়ে আসা সুবিধার ভিত্তিতে কেবল এই কারণগুলি উপসংহার করতে পারি, যার মধ্যে কয়েকটি হ'ল

1. স্ট্রিং কনস্ট্যান্ট পুলের অস্তিত্ব

স্ট্রিং কনস্ট্যান্ট পুল নিবন্ধে স্ট্রিং কেন স্ট্রোক করা হয়েছে তাতে আলোচিত হিসাবে , প্রতিটি অ্যাপ্লিকেশন অনেকগুলি স্ট্রিং অবজেক্ট তৈরি করে এবং জেভিএমকে প্রথমে প্রচুর স্ট্রিং অবজেক্ট তৈরি করা থেকে বাঁচাতে এবং তারপরে আবর্জনা সংগ্রহের জন্য। জেভিএম স্ট্রিং ধ্রুবক পুল নামক একটি পৃথক মেমরি অঞ্চলে সমস্ত স্ট্রিং অবজেক্টগুলিকে সঞ্চয় করে এবং সেই ক্যাশেড পুল থেকে অবজেক্টগুলিকে পুনরায় ব্যবহার করে।

যখনই আমরা একটি স্ট্রিং আক্ষরিক জেভিএম তৈরি করি প্রথমে দেখি যে সেই আক্ষরিকটি ইতিমধ্যে ধ্রুবক পুলে উপস্থিত রয়েছে কিনা এবং যদি সেখানে থাকে তবে নতুন রেফারেন্স এসসিপিতে একই বস্তুর দিকে ইশারা করা শুরু করবে।

String a = "Naresh";
String b = "Naresh";
String c = "Naresh";

মান সহ উপরোক্ত উদাহরণে স্ট্রিং বস্তু Nareshশুধুমাত্র একবার SCP- র তৈরি করা হবে এবং সমস্ত রেফারেন্স a, b, cএকই বস্তুর কিন্তু কি নির্দেশ যদি আমরা পরিবর্তন করতে চেষ্টা করবে aযেমন a.replace("a", "")

আদর্শভাবে, aমান থাকতে হবে Nreshতবে b, cঅপরিবর্তিত থাকতে হবে কারণ শেষ ব্যবহারকারী হিসাবে আমরা aকেবলমাত্র পরিবর্তন করছি । আমরা জানি a, b, cসব একই বস্তুর প্রতি নির্দেশ করা হয় তাই যদি আমরা পরিবর্তন করতে a, যাতে অন্যরা পরিবর্তন প্রতিফলিত হওয়া উচিত।

তবে স্ট্রিং অপরিবর্তনীয়তা আমাদের এই দৃশ্য থেকে বাঁচায় এবং স্ট্রিং অবজেক্টের স্ট্রিং অবজেক্টের অপরিবর্তনীয়তার কারণে Nareshকখনও পরিবর্তন হবে না। সুতরাং যখন আমরা aস্ট্রিং অবজেক্টের পরিবর্তে কোনও পরিবর্তন করি তখন NareshJVM একটি নতুন অবজেক্ট তৈরি করে aএবং তারপরে সেই বস্তুটিতে পরিবর্তন আনতে পারে।

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

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

2. থ্রেড সুরক্ষা

কোনও বস্তুকে থ্রেড-সেফ বলা হয় যখন একাধিক থ্রেড এটিতে কাজ করে তবে এগুলির কোনওটিই তার স্থিতিটিকে দূষিত করতে সক্ষম হয় না এবং কোনও সময়ে সময়ে প্রতিটি থ্রেডের জন্য অবজেক্ট একই অবস্থা ধারণ করতে সক্ষম হয়।

যেহেতু আমরা একটি অপরিবর্তনীয় বস্তুটিকে তার তৈরির পরে কারও দ্বারা সংশোধন করা যায় না যা প্রতিটি অপরিবর্তনীয় বস্তুকে ডিফল্টরূপে থ্রেডে সুরক্ষিত করে তোলে। আমাদের এতে কোনও থ্রেড সুরক্ষা ব্যবস্থা প্রয়োগ করার দরকার নেই যেমন সিঙ্ক্রোনাইজড পদ্ধতি তৈরি করা।

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

3. সুরক্ষা

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

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

4. ক্লাস লোডিং

উদাহরণ হিসাবে জাভায় প্রতিবিম্বের মাধ্যমে অবজেক্ট তৈরির ক্ষেত্রে যেমন আলোচনা করা হয়েছে , আমরা Class.forName("class_name")মেমরির এমন একটি ক্লাস লোড করার জন্য পদ্ধতিটি ব্যবহার করতে পারি যা আবার অন্য পদ্ধতিগুলিকে এটি করতে ডাকে। এমনকি জেভিএম ক্লাসগুলি লোড করার জন্য এই পদ্ধতিগুলি ব্যবহার করে।

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

মনে করুন স্ট্রিং যদি অচল না হয়ে থাকে এবং আমরা লোড করার চেষ্টা করছি java.lang.Objectযা org.theft.OurObjectএর মধ্যে পরিবর্তিত হয় এবং এখন আমাদের সমস্ত বস্তুর এমন আচরণ রয়েছে যা কেউ অযাচিত জিনিসগুলিতে ব্যবহার করতে পারে।

5. হ্যাশকোড ক্যাচিং

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

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

হ্যাঁ, স্ট্রিং অবজেক্ট তার হ্যাশকোডটিকে বস্তু তৈরির সময় ক্যাশে করে যা হ্যাশ সম্পর্কিত সম্পর্কিত ক্রিয়াকলাপের জন্য এটি দুর্দান্ত প্রার্থী করে কারণ হ্যাশকোডকে আবার গণনা করার দরকার নেই যা আমাদের কিছুটা সময় সাশ্রয় করে। এই কারণেই স্ট্রিং বেশিরভাগ HashMapকী হিসাবে ব্যবহৃত হয় ।

জাভাতে স্ট্রিং কেন অপরিবর্তনীয় এবং চূড়ান্ত তা আরও পড়ুন ।


1
সুরক্ষা সম্পর্কিত - কীভাবে পরিবর্তনীয় স্ট্রিংয়ের মান স্মৃতিতে পরিবর্তিত হতে পারে? অন্য ব্যক্তি কীভাবে আমাদের পরিবর্তনশীল উল্লেখগুলিতে অ্যাক্সেস পেতে পারেন?
মাস্টারজয়ে

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

এখানে কিভাবে ব্যাপার। রেফারেন্সগুলিতে অ্যাক্সেস পাওয়া সম্ভব কিনা। যদি সম্ভব হয়, তবে আপনি কি 1-2 টি কৌশল ব্যবহার করতে পারেন *** (অর্থাত্ কীভাবে) এটি ব্যবহার করতে পারেন? যদি সম্ভব না হয় তবে সুরক্ষা সম্পর্কিত পয়েন্টটি প্রযোজ্য নয়। *** উদাহরণ - কোনও ওয়েব অ্যাপের ডিবি আক্রমণ করার জন্য একটি কৌশলটির নাম দিন -> এসকিউএল ইনজেকশন। রেফারেন্স আক্রমণ করার জন্য আপনি কি এর মতো কোনও কৌশল জানেন?
মাস্টারজয়ে

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

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

21

ডিজেনে এই নিবন্ধ অনুযায়ী সর্বাধিক গুরুত্বপূর্ণ কারণ :

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

নিরাপত্তা

স্ট্রিং ব্যাপকভাবে অনেক জাভা ক্লাসের প্যারামিটার হিসাবে ব্যবহৃত হয়, যেমন নেটওয়ার্ক সংযোগ, ফাইল খোলার ইত্যাদি St ...

আশা করি এটা তোমাকে সাহায্য করবে।


@JasonC আমি শুধু জানতে যদি আমার উত্তর ভুল বা not.I ইতিমধ্যে ইন্টারভিউ এবং result.If জন্য অপেক্ষা উত্তর তাদের বলেছিলাম উপস্থিত ছিলেন ছিল ডান তারপর চান আমি নির্বাচিত করা হবে
দোলনা

1
আমার জ্ঞান অনুসারে আপনার উত্তরটি সঠিক, তবে স্থাবর হওয়ার অর্থ রেফারেন্সটি কখনই পয়েন্টিং অবস্থান পরিবর্তন করবে না your আপনার সাক্ষাত্কারের জন্য সেরা।
জেডিগুইড

1
যদি আপনার # 1 পয়েন্টটি স্বীকার করে নেয়, তবে সমস্ত বস্তু অপরিবর্তনীয় হওয়া উচিত।
নিকম্প্প

হাই জেডিপ্লোপার, আমি আপনার উত্তরটির উত্সকে যথাযথ অনুপাত দেওয়ার জন্য আপনার উত্তরটি সম্পাদনা করেছি। কন্টেন্টের ভারব্যাটিম কপির জন্য সর্বদা ব্লক কোট ব্যবহার করা মনে রাখবেন। ধন্যবাদ!
নিকল

ডি জোন নিবন্ধটিতে স্ট্রাইন পুলের কার্যক্রম সম্পর্কে বড় ত্রুটি রয়েছে । এটি কেবল ধ্রুবকদের জন্য। উল্লিখিত যুক্তি ত্রুটিযুক্ত
মারকুইস

4

আমি জাভাতে স্ট্রিং অপরিবর্তনীয় বা চূড়ান্ত কেন এই পোস্টটি পড়েছি এবং মনে করি যে নিম্নলিখিতটি সর্বাধিক গুরুত্বপূর্ণ কারণ হতে পারে:

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


1

তুমি ঠিক. Stringজাভা String Poolআক্ষরিক ধারণা ব্যবহার করে । যখন একটি স্ট্রিং তৈরি হয় এবং যদি পুলে স্ট্রিং ইতিমধ্যে বিদ্যমান থাকে তবে নতুন স্ট্রিং তৈরি করে এর রেফারেন্সটি ফিরিয়ে দেওয়ার পরিবর্তে বিদ্যমান স্ট্রিংয়ের রেফারেন্সটি ফিরে আসবে f যদি একটি স্ট্রিং পরিবর্তনযোগ্য না হয় তবে একটি রেফারেন্স সহ স্ট্রিং পরিবর্তন করা হবে অন্যান্য রেফারেন্সগুলির জন্য ভুল মান বাড়ে।

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


0

স্ট্রিং ক্লাস এর FINALঅর্থ হ'ল আপনি এর উত্তরাধিকারী এবং বুনিয়াদি কাঠামো পরিবর্তন করতে এবং স্টিংকে পরিবর্তনযোগ্য করতে কোনও শ্রেণি তৈরি করতে পারবেন না।

স্ট্রিং ক্লাসের আর একটি জিনিস উদাহরণ পরিবর্তনশীল এবং পদ্ধতিগুলি সরবরাহ করা হয় সেগুলি হ'ল আপনি Stringএকবার তৈরি হয়ে গেলে বস্তু পরিবর্তন করতে পারবেন না ।

আপনি যা যুক্ত করেছেন তার কারণে স্ট্রিংটি একেবারেই স্থাবর হয়ে উঠবে না all এই সবই বলে যে স্ট্রিংটি কীভাবে স্তূপে সংরক্ষণ করা হয় string এছাড়াও স্ট্রিং পুলটিতে পারফরম্যান্সে বিশাল পার্থক্য আসে


11
যদি শ্রেণিটি চূড়ান্ত হিসাবে ঘোষিত হয়, এর অর্থ হ'ল শ্রেণিটি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না, তবে এর অর্থ এই নয় যে শ্রেণীর উদাহরণস্বরূপ ক্ষেত্রগুলি পরিবর্তন করা যায় না এবং সুতরাং শ্রেণিটি অচল।
দিমিত্রি বাইচেনকো

@ জিশান: আপনি যে উদাহরণস্বরূপ ক্লাস দেন তা সবই অচল।
সিয়ুয়ান রেন

0

স্ট্রিংটি সূর্যের মাইক্রো সিস্টেম দ্বারা অপরিবর্তনীয় হিসাবে দেওয়া হয়, কারণ স্ট্রিংটি মানচিত্র সংগ্রহের মূল হিসাবে সংরক্ষণ করতে পারে। স্ট্রিংবুফার পরিবর্তনযোগ্য। এটি কারণ, এটি মানচিত্রের অবজেক্টে কী হিসাবে ব্যবহার করা যায় না


0

জাভাতে স্ট্রিংকে অপরিবর্তনীয় করে তোলার সবচেয়ে গুরুত্বপূর্ণ কারণটি হল সুরক্ষা বিবেচনা। এর পরেরটি হবে ক্যাচিং

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

গোসলিংয়ের সাক্ষাত্কার ট্রান্সক্রিপ্টটি এখানে দেখুন

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

আপনি অবজেক্টটির প্রতিলিপি তৈরির জন্য প্রায় বাধ্য হয়ে পড়েছেন কারণ আপনি নিজের মালিকানা পাবেন কিনা তা আপনি জানেন না। এবং অপরিবর্তনীয় বস্তু সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল উত্তর, "হ্যাঁ, অবশ্যই আপনি করেন।" কারণ মালিকানার প্রশ্ন, যার পরিবর্তন করার অধিকার রয়েছে তার অস্তিত্ব নেই।

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


0

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

public class Main {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4};
        int[] b = a;
        a[0] = 8;
        b[1] = 7;
        System.out.println("A: " + a[0] + ", B: " + b[0]);
        System.out.println("A: " + a[1] + ", B: " + b[1]);
        //outputs
        //A: 8, B: 8
        //A: 7, B: 7
    }
}

এটি কেবল কোডে ত্রুটিগুলি সৃষ্টি করতে পারে তা নয় এটি ক্ষতিকারক ব্যবহারকারীর দ্বারাও ব্যবহার করা যাবে (এবং করবে)। ধরুন আপনার যদি এমন কোনও সিস্টেম থাকে যা প্রশাসকের পাসওয়ার্ড পরিবর্তন করে। ব্যবহারকারী প্রথম লিখতে হবে newPasswordএবং তারপর oldPasswordযদি oldPasswordহিসাবে একই adminPassকর্মসূচি পরিবর্তনের ফলে পাসওয়ার্ড adminPass = newPassword। ধরা যাক যে নতুন পাসওয়ার্ডের অ্যাডমিন পাসওয়ার্ডের মতোই রেফারেন্স রয়েছে তাই কোনও খারাপ প্রোগ্রামার tempব্যবহারকারীদের ডেটা ইনপুট করার আগে প্রশাসকের পাসওয়ার্ড ধরে রাখতে একটি পরিবর্তনশীল তৈরি করতে পারে যদি এর oldPasswordসমান হয়temp এটি অন্যথায় পাসওয়ার্ড পরিবর্তনadminPass = temp। যে কেউ জানে যে সহজেই নতুন পাসওয়ার্ড প্রবেশ করতে পারে এবং কখনও পুরানো পাসওয়ার্ড এবং অ্যাব্র্যাকডব্রের প্রবেশ করতে পারে না তার অ্যাডমিন অ্যাক্সেস রয়েছে। স্ট্রিংস সম্পর্কে শিখতে গিয়ে আমি আর বুঝতে পারি নি যে কেন জেভিএম প্রতিটি বস্তুর জন্য একটি নতুন স্ট্রিং তৈরি করে না এবং এর জন্য স্মৃতিতে একটি অনন্য স্থান রাখে এবং আপনি কেবল এটি করতে পারেন যে new String("str");আপনি সর্বদা ব্যবহার করতে চান না তার কারণটি newহ'ল কারণ এটি মেমরি দক্ষ নয় এবং এটি বেশিরভাগ ক্ষেত্রেই ধীর আরও পড়তে


0

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

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

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

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

উত্তর:

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


-1

Securityদৃষ্টিকোণ থেকে আমরা এই ব্যবহারিক উদাহরণটি ব্যবহার করতে পারি:

DBCursor makeConnection(String IP,String PORT,String USER,String PASS,String TABLE) {

    // if strings were mutable IP,PORT,USER,PASS can be changed by validate function
    Boolean validated = validate(IP,PORT,USER,PASS);

    // here we are not sure if IP, PORT, USER, PASS changed or not ??
    if (validated) {
         DBConnection conn = doConnection(IP,PORT,USER,PASS);
    }

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