1. তুলনা

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

পূর্ণসংখ্যা তুলনা করা খুব সহজ — আপনি শুধু ব্যবহার করুন ==এবং আপনার কাজ শেষ। বাস্তব সংখ্যার তুলনা করার জন্য , আপনাকে তাদের পার্থক্য (বা বরং, পার্থক্যের পরম মান) কিছু খুব ছোট সংখ্যার সাথে তুলনা করতে হবে।

স্ট্রিং তুলনা আরো কঠিন. সর্বোপরি, এর কারণ হল স্ট্রিংগুলি বস্তু। আরও কি, প্রোগ্রামাররা প্রায়ই পরিস্থিতির উপর নির্ভর করে স্ট্রিং তুলনা একটু ভিন্নভাবে যেতে চায়।


2. কিভাবে স্ট্রিং মেমরি সাজানো হয়

আপনি ইতিমধ্যে দেখেছেন, স্ট্রিংগুলি মেমরিতে পূর্ণসংখ্যা এবং বাস্তব সংখ্যার চেয়ে আলাদাভাবে সংরক্ষণ করা হয়:

কিভাবে স্ট্রিং মেমরি সাজানো হয়

মেমরির দুটি ব্লক স্ট্রিং সংরক্ষণ করতে ব্যবহার করা হয়: একটি ব্লক টেক্সট নিজেই সংরক্ষণ করে (এর আকার পাঠ্যের আকারের উপর নির্ভর করে) যখন দ্বিতীয় ব্লক (4 বাইট) প্রথম ব্লকের ঠিকানা সংরক্ষণ করে।

যদিও একজন অভিজ্ঞ প্রোগ্রামার এমন কিছু বলবেন " ভেরিয়েবল একটি বস্তুর String strরেফারেন্স সঞ্চয় করে ।String


3. একটি স্ট্রিং এর রেফারেন্স বরাদ্দ করা

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

String text = "This is a very important message";
String message = text;

এবং ফলস্বরূপ মেমরিতে কী থাকবে তা এখানে:

একটি স্ট্রিং রেফারেন্স বরাদ্দ করা

এই ধরনের অ্যাসাইনমেন্ট অপারেশনের পরে, Stringঅবজেক্টটি যেখানে ছিল সেখানেই থাকে এবং শুধুমাত্র তার ঠিকানা (অবজেক্টের একটি রেফারেন্স) ভেরিয়েবলে কপি করা হয় message


4. রেফারেন্স এবং বস্তুর সাথে কাজ করা

কিন্তু আপনি যদি একটি স্ট্রিংকে বড় হাতের অক্ষরে (ক্যাপিটাল অক্ষর) রূপান্তর করার সিদ্ধান্ত নেন, জাভা মেশিন সবকিছু ঠিকঠাক করে: আপনি দুটি অবজেক্টের সাথে শেষ হবে এবং Stringএবং textভেরিয়েবল messageরেফারেন্স সংরক্ষণ করবে, প্রতিটি তার নিজস্ব বস্তুতে।

উদাহরণ:

String text = "This is a very important message";
String message = text.toUpperCase(); 

এবং ফলস্বরূপ মেমরিতে কী থাকবে তা এখানে:

রেফারেন্স এবং অবজেক্ট নিয়ে কাজ করা

দয়া করে মনে রাখবেন যে toUpperCase()পদ্ধতিটি যে স্ট্রিংটিতে কল করা হয়েছে তা পরিবর্তন করে না । পরিবর্তে, এটি একটি নতুন স্ট্রিং (নতুন বস্তু) তৈরি করে এবং এটিতে একটি রেফারেন্স প্রদান করে।

কিভাবে একটি এমনকি আরো আকর্ষণীয় উদাহরণ সম্পর্কে. ধরা যাক আপনি একটি Scannerবস্তুতে একটি স্ট্রিং পাস করার সিদ্ধান্ত নিয়েছেন (যাতে এটি স্ট্রিং থেকে মানগুলি পড়তে পারে)।

উদাহরণ:

String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();

আপনি এখানে ক্লাস কিভাবে Scannerকাজ করে সে সম্পর্কে আরও জানতে পারেন ।

এইভাবে এটি সব মেমরিতে সংরক্ষণ করা হবে:

রেফারেন্স এবং অবজেক্ট নিয়ে কাজ করা।  স্ক্যানার ক্লাস

এই ক্ষেত্রে, একটি একক Stringঅবজেক্ট মেমরিতে থাকে ঠিক যেমনটি ছিল - শুধুমাত্র এর রেফারেন্সগুলি চারপাশে পাস করা হয় এবং ভেরিয়েবলগুলিতে সংরক্ষণ করা হয়।


String5. বস্তুর রেফারেন্স তুলনা

এবং অবশেষে, আমরা মজার অংশে পৌঁছেছি: স্ট্রিং তুলনা।

স্ট্রিং ভেরিয়েবলের তুলনা করার জন্য আপনি দুটি অপারেটর ব্যবহার করতে পারেন: ==(সমান) এবং !=(সমান নয়)। আপনি "এর চেয়ে বড়", "এর চেয়ে কম", বা "এর চেয়ে বড় বা সমান" অপারেটর ব্যবহার করতে পারবেন না - কম্পাইলার এটির অনুমতি দেবে না।

কিন্তু এখানে একটি আকর্ষণীয় nuance আছে: কি আসলে স্ট্রিং ভেরিয়েবলে সংরক্ষণ করা হয়? এটা ঠিক: বস্তুর ঠিকানা (রেফারেন্স)। এবং এই ঠিকানাগুলি তুলনা করা হবে:

String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase(); 

স্মৃতিতে যা থাকবে তা এখানে:

স্ট্রিং বস্তুর রেফারেন্স তুলনা

এবং messageভেরিয়েবল textএকই বস্তুকে নির্দেশ করে (এর ঠিকানা সংরক্ষণ করে)। কিন্তু s1এবং s2ভেরিয়েবলগুলি এমন বস্তুর রেফারেন্স সংরক্ষণ করে যেগুলি খুব একই রকম কিন্তু স্বতন্ত্র।

এবং যদি আপনি কোডে এই 4টি ভেরিয়েবল তুলনা করেন, তাহলে আপনি নিম্নলিখিত ফলাফল পাবেন:

কোড কনসোল আউটপুট
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 


true  // The addresses are equal
false // The addresses are different
false // The addresses are different