Java তে স্ট্রিং হ্যান্ডলিং একটি গুরুত্বপূর্ণ বিষয়, কারণ স্ট্রিং হলো এমন একটি ডেটা টাইপ যা সাধারণত বেশি ব্যবহৃত হয়। স্ট্রিং হ্যান্ডলিংয়ের জন্য Java-তে বিভিন্ন ক্লাস এবং মেথড রয়েছে, বিশেষত String
, StringBuilder
, এবং StringBuffer
ক্লাসগুলি। Java তে স্ট্রিং হ্যান্ডলিং নিয়ে ইন্টারভিউতে কিছু গুরুত্বপূর্ণ প্রশ্ন থাকে। নিচে কিছু সাধারণ প্রশ্ন এবং তাদের উত্তর দেওয়া হল।
String
একটি অবজেক্ট ক্লাস (immutable class) যা চরিত্রের সিকোয়েন্স (sequence) সংরক্ষণ করতে ব্যবহৃত হয়। স্ট্রিং এর ডেটা পরিবর্তনযোগ্য নয়, অর্থাৎ একবার স্ট্রিং তৈরি হলে তার মান পরিবর্তন করা যায় না। যদি আপনি স্ট্রিং এর মান পরিবর্তন করতে চান, তবে একটি নতুন স্ট্রিং তৈরি হয়।StringBuffer
থ্রেড সেফ (thread-safe) এবং StringBuilder
থ্রেড সেফ নয়, তবে এটি একটু বেশি দ্রুত কাজ করে।উদাহরণ:
String s1 = "Hello";
s1 = s1 + " World"; // A new String object is created.
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // The same StringBuilder object is modified.
String
ক্লাসটি immutable (অপরিবর্তনীয়) হওয়ার মানে হল যে একবার স্ট্রিং তৈরি হলে তার মান পরিবর্তন করা সম্ভব নয়। যদি আপনি একটি নতুন মান অ্যাসাইন করেন, তবে একটি নতুন স্ট্রিং অবজেক্ট তৈরি হয়, এবং পুরানো স্ট্রিং অবজেক্টটি আর ব্যবহার করা হয় না।উদাহরণ:
String s = "Hello";
s = s + " World"; // A new String object is created, and the reference s now points to it.
length()
মেথড ব্যবহার করা হয়। এটি স্ট্রিংয়ের মধ্যে মোট চরিত্রের সংখ্যা ফেরত দেয়।উদাহরণ:
String str = "Hello World";
int length = str.length(); // Output will be 11
+
অপারেটর ব্যবহার করে দুটি স্ট্রিংকে একত্রিত করা যায়। তবে, স্ট্রিং কন্টক্যাটেনেশন যদি লুপে বা একাধিক বার হয়, তবে StringBuilder
বা StringBuffer
ব্যবহার করা ভালো, কারণ এগুলি mutable এবং আরও কার্যকরী।উদাহরণ:
String str1 = "Hello";
String str2 = " World";
String result = str1 + str2; // Concatenation using + operator
equals()
এবং compareTo()
মেথড ব্যবহার করা হয়:equals()
: এটি দুটি স্ট্রিংয়ের মান তুলনা করে এবং যদি তারা সমান হয় তবে true
ফেরত দেয়।compareTo()
: এটি দুটি স্ট্রিংয়ের মানের আলফাবেটিক্যাল তুলনা করে। এটি একটি পূর্ণসংখ্যা ফেরত দেয় যা প্রমাণ করে কোন স্ট্রিংটি বড় বা ছোট।উদাহরণ:
String str1 = "Hello";
String str2 = "hello";
System.out.println(str1.equals(str2)); // false, because case matters
System.out.println(str1.compareTo(str2)); // Negative number, because "H" < "h"
substring()
বা clone()
মেথড ব্যবহার করা যায়।উদাহরণ:
String str1 = "Hello World";
String str2 = str1.substring(0, 5); // str2 will be "Hello"
String
এর উপরের এবং নিচের কেস পরিবর্তন করার মেথড কী?toUpperCase()
মেথডটি স্ট্রিংয়ের সব অক্ষরকে বড় অক্ষরে পরিবর্তন করে।toLowerCase()
মেথডটি স্ট্রিংয়ের সব অক্ষরকে ছোট অক্ষরে পরিবর্তন করে।উদাহরণ:
String str = "Hello World";
System.out.println(str.toUpperCase()); // "HELLO WORLD"
System.out.println(str.toLowerCase()); // "hello world"
charAt()
: একটি নির্দিষ্ট ইনডেক্সে থাকা চরিত্র ফেরত দেয়।substring()
: একটি সাবস্ট্রিং ফেরত দেয়।indexOf()
: একটি নির্দিষ্ট চরিত্র বা সাবস্ট্রিং এর প্রথম ইনডেক্স ফেরত দেয়।replace()
: একটি নির্দিষ্ট চরিত্র বা সাবস্ট্রিং প্রতিস্থাপন করে।trim()
: স্ট্রিংয়ের শুরু এবং শেষে থাকা অপ্রয়োজনীয় স্পেস সরিয়ে দেয়।উদাহরণ:
String str = " Hello World ";
System.out.println(str.trim()); // "Hello World"
System.out.println(str.indexOf("World")); // 6
System.out.println(str.replace("World", "Java")); // "Hello Java"
String Handling Java এর অন্যতম গুরুত্বপূর্ণ একটি অংশ। স্ট্রিংয়ের কার্যকারিতা, স্ট্রিং কম্পারিজন, কন্টক্যাটেনেশন, সাবস্ট্রিং এবং আরও অনেক মেথডের সঠিক ব্যবহার ইন্টারভিউতে আপনার দক্ষতা প্রমাণ করতে সহায়তা করবে।
Java তে String, StringBuilder, এবং StringBuffer তিনটি প্রধান ক্লাস যা স্ট্রিং (অক্ষরের সিকোয়েন্স) নিয়ে কাজ করতে ব্যবহৃত হয়। এই তিনটি ক্লাসের মধ্যে পার্থক্য রয়েছে, এবং সেগুলি বিভিন্ন পরিস্থিতিতে ব্যবহার করা হয়। এখানে আমি এই তিনটি ক্লাসের মধ্যে পার্থক্য বিস্তারিতভাবে ব্যাখ্যা করব।
String হল একটি immutable (অপরিবর্তনশীল) ক্লাস, অর্থাৎ একবার একটি স্ট্রিং তৈরি হওয়ার পর তার মান পরিবর্তন করা যায় না। যখন আপনি একটি স্ট্রিংয়ের মান পরিবর্তন করার চেষ্টা করেন, তখন একটি নতুন স্ট্রিং অবজেক্ট তৈরি হয় এবং পুরানো স্ট্রিং অব্যবহৃত থাকে। এর কারণে এটি কিছু ক্ষেত্রে কম কার্যকরী হতে পারে, বিশেষত যখন অনেক পরিবর্তন করতে হয়।
String str1 = "Hello";
String str2 = str1;
str1 = "World"; // This creates a new String object for str1
System.out.println(str2); // Outputs "Hello", str2 remains unchanged
StringBuilder একটি mutable (পরিবর্তনশীল) ক্লাস, যার মান পরিবর্তন করা যায় এবং এটি স্ট্রিংয়ের মতই কাজ করে। এটি সাধারণত তখন ব্যবহার করা হয় যখন বারবার স্ট্রিংয়ের মান পরিবর্তন করতে হয়, কারণ এটি দক্ষভাবে কাজ করতে পারে।
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // Changes the original object
System.out.println(sb); // Outputs "Hello World"
StringBuffer স্ট্রিংয়ের মতো একটি mutable ক্লাস, তবে এটি thread-safe। এটি একাধিক থ্রেড দ্বারা একই সময়ে নিরাপদে ব্যবহৃত হতে পারে, তবে এর কারণে কিছু পারফরম্যান্স হানি হতে পারে, কারণ এতে synchronization এর সুবিধা রয়েছে।
StringBuffer sbf = new StringBuffer("Hello");
sbf.append(" World"); // Modifies the original object
System.out.println(sbf); // Outputs "Hello World"
বিষয় | String | StringBuilder | StringBuffer |
---|---|---|---|
Mutability | Immutable (পরিবর্তনশীল নয়) | Mutable (পরিবর্তনশীল) | Mutable (পরিবর্তনশীল) |
Thread Safety | Thread-Safe (থ্রেড সেফ) | Not Thread-Safe (থ্রেড সেফ নয়) | Thread-Safe (থ্রেড সেফ) |
Performance | ধীর (এটি নতুন অবজেক্ট তৈরি করে প্রতিবার পরিবর্তন করতে) | দ্রুত (কম সময় নেয় পরিবর্তন করার জন্য) | StringBuilder এর চেয়ে ধীর (যেহেতু এটি synchronized) |
Synchronization | Synchronization নেই | Synchronization নেই | Synchronization আছে (থ্রেড সেফতার জন্য) |
Use Case | ছোট বা অপরিবর্তনশীল স্ট্রিং | যখন অনেক পরিবর্তন বা অ্যাপেন্ড করা প্রয়োজন | যখন অনেক থ্রেডের মধ্যে স্ট্রিং পরিবর্তন প্রয়োজন |
String
ব্যবহার করা ভালো।এটি আপনার প্রোগ্রামে পারফরম্যান্স এবং থ্রেড সেফটি নিয়ন্ত্রণ করতে সহায়তা করবে।
উত্তর: একটি Immutable Object এমন একটি অবজেক্ট যা একবার তৈরি হওয়ার পর তার অবস্থান (state) পরিবর্তন করা সম্ভব নয়। অর্থাৎ, এর ডেটা বা ভ্যালু কোনোভাবেই পরিবর্তন করা যায় না। যদি কোনো পরিবর্তন প্রয়োজন হয়, তবে নতুন একটি অবজেক্ট তৈরি করতে হয়।
যখন একটি অবজেক্ট Immutable হয়, তখন তার সমস্ত ফিল্ড (ভ্যালু) শেষ হয়ে যায় (final) এবং কোন setter মেথডের মাধ্যমে তাদের মান পরিবর্তন করা যায় না। Immutable অবজেক্ট ব্যবহার করার প্রধান সুবিধা হলো এটি থ্রেড-সেফ, অর্থাৎ একাধিক থ্রেড একই অবজেক্টের সাথে কাজ করলেও কোনো ডেটার অস্বাভাবিক পরিবর্তন হয় না।
final
হতে হবে যাতে এটি কখনও ইনহেরিট না করা যায়।final
হতে হবে।উদাহরণ:
final class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
এখানে, Person
ক্লাসটি final
এবং এর সমস্ত ফিল্ড final
যা একবার সেট করার পর পরিবর্তন করা সম্ভব নয়।
উত্তর: Java তে String ক্লাসটি Immutable হওয়ার কয়েকটি প্রধান কারণ রয়েছে:
Java তে String ব্যবহৃত হয় একটি বিশেষ মেমরি সঞ্চয়ের মাধ্যমে যাকে String Pool বলা হয়। যখন একটি নতুন String তৈরি করা হয়, Java তা String Pool এ রাখে। String যদি Mutable হত, তাহলে একই String এর ভিন্ন ভিন্ন ভ্যালু তৈরি হতে পারত, যা String Pool-এর উদ্দেশ্যের সাথে সাংঘর্ষিক হত। Immutable String এর মাধ্যমে String Pool নিশ্চিত করে যে, একাধিক জায়গায় একই String অবজেক্ট ব্যবহার করা হয় এবং মেমরি ব্যবহারের দক্ষতা বাড়ে।
String Immutable হওয়ায় একাধিক থ্রেড একসাথে একটি String অবজেক্টের সাথে কাজ করলেও তা থ্রেড-সেফ থাকে। কারণ, যদি String Mutable হত, তবে একাধিক থ্রেড একযোগে String পরিবর্তন করার চেষ্টা করতে পারত, যা Race Condition এবং অন্যান্য সমস্যা সৃষ্টি করত। Immutable হওয়ায় এটি এমন ধরনের সমস্যা প্রতিরোধ করে।
Immutable String এর কারণে, আপনি যেই String অবজেক্ট তৈরি করেছেন, তা কখনই পরিবর্তিত হবে না। এটি আপনাকে কোনো অবজেক্টকে সুরক্ষিত রাখতে এবং তার অবস্থা নিশ্চিত করতে সাহায্য করে। অর্থাৎ, String অবজেক্টের অবস্থা পূর্বে সেট করা থাকলে, তা কখনো পরিবর্তন হবে না।
String অবজেক্ট Immutable হওয়ার কারণে, আপনি String কে ক্যাশ বা ক্যাশিং এর মাধ্যমে পুনরায় ব্যবহার করতে পারবেন এবং এটি পদ্ধতিগত পারফর্মেন্স বৃদ্ধি করতে সাহায্য করে।
StringBuilder এবং StringBuffer দুটোই Mutable (পরিবর্তনযোগ্য) ক্লাস। এগুলো Strings কে পরিবর্তনযোগ্য করতে ব্যবহৃত হয়, তবে String ক্লাসের বিপরীতে, তারা immutable নয়।
উদাহরণ:
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString()); // Output: Hello World
এখানে StringBuilder
অবজেক্টটি পরিবর্তনযোগ্য এবং একই অবজেক্টে নতুন স্ট্রিং যুক্ত করা সম্ভব।
Immutable Objects (যেমন String) এমন অবজেক্ট যেগুলির একবার তৈরি হওয়া পর তার অবস্থা পরিবর্তন করা যায় না। String Immutable হওয়া নিশ্চিত করে যে, এটি ব্যবহারকারী, মেমরি এবং পারফরম্যান্সের জন্য নিরাপদ। String ক্লাসের Immutable হওয়া Java অ্যাপ্লিকেশনগুলোতে একাধিক থ্রেড এবং ডেটার নিরাপত্তা নিশ্চিত করতে সাহায্য করে।
String Pool বা String Intern Pool হল একটি বিশেষ ধরনের ক্যাশ (cache) যা Java-তে String অবজেক্টগুলি পুনঃব্যবহার করার জন্য ব্যবহৃত হয়। এটি মূলত Java Virtual Machine (JVM) এর একটি অংশ, যেখানে String অবজেক্টগুলি ক্যাশে সংরক্ষণ করা হয়, যাতে একাধিক বার একই মানের স্ট্রিং তৈরি করতে না হয় এবং মেমরি ব্যবস্থাপনা উন্নত হয়।
Java তে String
ক্লাসের অবজেক্টগুলো একটি বিশেষ পুলে সংরক্ষিত থাকে, যেখানে একই মানের স্ট্রিং একবারেই রাখা হয়। অর্থাৎ, যদি আপনি একই মানের দুটি স্ট্রিং তৈরি করেন, তাহলে শুধুমাত্র একটি অবজেক্ট মেমরিতে থাকবে এবং একাধিক রেফারেন্স সেই একই অবজেক্টের দিকে ইঙ্গিত করবে। এটি মেমরি ব্যবস্থাপনাকে আরও দক্ষ এবং দ্রুত করে তোলে।
"Hello"
, তখন Java ঐ স্ট্রিংটি String Pool এ সংরক্ষণ করে যদি এটি আগে থেকেই সেখানে না থাকে। পরবর্তীতে যদি আপনি আবার "Hello"
স্ট্রিংটি ব্যবহার করেন, তাহলে নতুন একটি অবজেক্ট তৈরি না করে পুলে থাকা সেই একই অবজেক্টটি ব্যবহার করা হয়।"Hello"
) এর জন্য কাজ করে। স্ট্রিংকে নতুন করে তৈরি করলে (যেমন new String("Hello")
), এটি String Pool এ যাবে না, বরং এটি একটি নতুন অবজেক্ট তৈরি করবে।public class StringPoolExample {
public static void main(String[] args) {
String s1 = "Hello"; // স্ট্রিং লিটারেল
String s2 = "Hello"; // একই স্ট্রিং লিটারেল
// String Pool এ একটি অবজেক্ট থাকবে
System.out.println(s1 == s2); // Output: true (কারণ তারা একই অবজেক্ট)
String s3 = new String("Hello"); // new স্ট্রিং অবজেক্ট
System.out.println(s1 == s3); // Output: false (কারণ এটি আলাদা অবজেক্ট)
}
}
আউটপুট:
true
false
এখানে, s1
এবং s2
একই অবজেক্টের দিকে নির্দেশ করছে, কারণ তারা String Pool থেকে নেওয়া হয়েছে। তবে, s3
হল নতুন একটি অবজেক্ট যা String Pool এর বাইরে তৈরি হয়েছে, তাই s1 == s3
ফলস্বরূপ false
হবে।
==
অপারেটর দিয়ে স্ট্রিংয়ের সমতা পরীক্ষা করতে, আপনি দেখতে পাবেন যে একই স্ট্রিং মানের দুটি স্ট্রিং একই অবজেক্টের দিকে নির্দেশ করছে। এটি স্ট্রিং কম্পেয়ার করার একটি সহজ উপায়।new String("example")
এই রকম স্ট্রিংগুলো String Pool এ যোগ হয় না, কারণ এটি নতুন অবজেক্ট তৈরি করে। তাই new String("example") == "example"
ফলস্বরূপ false
হবে।Java তে String Pool হল একটি গুরুত্বপূর্ণ কৌশল যা স্ট্রিং লিটারেল পুনঃব্যবহার করতে ব্যবহৃত হয়, ফলে মেমরি সাশ্রয়ী এবং পারফরম্যান্স উন্নত হয়। এটি শুধুমাত্র স্ট্রিং লিটারেল স্ট্রিংয়ের জন্য কাজ করে, এবং নতুন স্ট্রিং অবজেক্ট তৈরি করার ক্ষেত্রে এটি কাজ করে না।
String Concatenation বলতে দুটি বা ততোধিক স্ট্রিংকে একত্রিত করার প্রক্রিয়াকে বোঝায়। জাভাতে স্ট্রিং কনক্যাটেনেশন করার জন্য বিভিন্ন পদ্ধতি রয়েছে। নিচে সেগুলোর মধ্যে কিছু সাধারণ পদ্ধতি ব্যাখ্যা করা হলো:
+
Operator (Simple Concatenation)এটি সবচেয়ে সাধারণ এবং সহজ পদ্ধতি। এখানে আমরা দুটি বা তার বেশি স্ট্রিংকে +
অপারেটর দিয়ে একত্রিত করি।
public class StringConcatenation {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
String result = str1 + " " + str2;
System.out.println(result); // Output: Hello World
}
}
+
অপারেটর ব্যবহার করার সময় স্ট্রিং কনক্যাটেনেশন অনেক বেশি অতিরিক্ত অবজেক্ট তৈরি করে, যা কার্যক্ষমতা (performance) খারাপ করতে পারে, বিশেষ করে লুপের ভিতরে কনক্যাটেনেশন করার সময়।StringBuilder
or StringBuffer
যেহেতু স্ট্রিংগুলি immutable (অপরিবর্তনীয়), প্রতিবার কনক্যাটেনেশন করার সময় একটি নতুন স্ট্রিং অবজেক্ট তৈরি হয়। এই সমস্যা এড়িয়ে যেতে StringBuilder
বা StringBuffer
ব্যবহার করা হয়।
StringBuilder
: এটি স্ট্রিং কনক্যাটেনেশন করার জন্য ব্যবহৃত হয় এবং এটি thread-safe নয়। তবে এটি দ্রুত কার্যকরী।StringBuffer
: এটি thread-safe এবং অনেক বেশি সিঙ্ক্রোনাইজড, তবে এর কার্যক্ষমতা কিছুটা কম হতে পারে।public class StringConcatenation {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
StringBuilder sb = new StringBuilder(str1);
sb.append(" ").append(str2); // Using append() method to concatenate
System.out.println(sb.toString()); // Output: Hello World
}
}
String.concat()
MethodString.concat()
মেথডটি একটি স্ট্রিংকে অন্য একটি স্ট্রিংয়ের সাথে যুক্ত করার জন্য ব্যবহৃত হয়। এটি দুটি স্ট্রিংকে একত্রিত করে নতুন স্ট্রিং প্রদান করে।
public class StringConcatenation {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
String result = str1.concat(" ").concat(str2);
System.out.println(result); // Output: Hello World
}
}
+
অপারেটরের মতোই কাজ করে, তবে এটি স্ট্রিং কনক্যাটেনেশনের জন্য আলাদা মেথড ব্যবহার করে এবং কার্যক্ষমতায় কিছুটা পার্থক্য থাকতে পারে।String.format()
MethodString.format()
মেথডটি ফরম্যাটেড স্ট্রিং তৈরি করতে ব্যবহৃত হয়, যেখানে আপনি ভেরিয়েবল বা এক্সপ্রেশন ইনসার্ট করতে পারেন।
public class StringConcatenation {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
String result = String.format("%s %s", str1, str2);
System.out.println(result); // Output: Hello World
}
}
String.join()
Method (Java 8 and above)Java 8 থেকে, String.join()
মেথডটি ব্যবহার করে একটি নির্দিষ্ট ডেলিমিটার দিয়ে স্ট্রিংয়ের একটি সংগ্রহ (যেমন List বা Set) কনক্যাটেনেট করা যায়।
import java.util.*;
public class StringConcatenation {
public static void main(String[] args) {
List<String> words = Arrays.asList("Hello", "World");
String result = String.join(" ", words);
System.out.println(result); // Output: Hello World
}
}
Stream
API (Java 8 and above)Java 8-এ Stream API ব্যবহার করে একাধিক স্ট্রিংয়ের মধ্যে কনক্যাটেনেশন করা যায়, বিশেষ করে যখন স্ট্রিংয়ের একটি সংগ্রহ থাকে এবং সেগুলিকে একত্রিত করতে হয়।
import java.util.*;
import java.util.stream.*;
public class StringConcatenation {
public static void main(String[] args) {
List<String> words = Arrays.asList("Hello", "World");
String result = words.stream().collect(Collectors.joining(" "));
System.out.println(result); // Output: Hello World
}
}
StringBuilder
with append()
inside a Loopযখন লুপের মধ্যে একাধিক স্ট্রিং কনক্যাটেনেট করা হয়, তখন StringBuilder
ব্যবহার করা সর্বোত্তম পদ্ধতি, কারণ এটি অতিরিক্ত অবজেক্ট তৈরি না করে স্ট্রিং কনক্যাটেনেট করে।
public class StringConcatenation {
public static void main(String[] args) {
String[] words = {"Hello", "World", "From", "Java"};
StringBuilder sb = new StringBuilder();
for (String word : words) {
sb.append(word).append(" ");
}
System.out.println(sb.toString().trim()); // Output: Hello World From Java
}
}
যখন স্ট্রিং কনক্যাটেনেশনের জন্য Java ব্যবহার করা হয়, তখন বিভিন্ন পদ্ধতি পাওয়া যায়, এবং প্রতিটি পদ্ধতির নিজস্ব সুবিধা এবং ক্ষতিকর দিক থাকে। স্ট্রিং কনক্যাটেনেশনের জন্য সবচেয়ে ভালো পদ্ধতি নির্বাচন করা আপনার প্রয়োজন এবং অ্যাপ্লিকেশনের কার্যক্ষমতার উপর নির্ভর করে। সাধারণত, StringBuilder
এবং StringBuffer
হচ্ছে সবচেয়ে কার্যকরী পদ্ধতি, বিশেষ করে যদি একাধিক স্ট্রিং কনক্যাটেনেট করতে হয় বা লুপের মধ্যে স্ট্রিং কনক্যাটেনেট করা হয়।
Read more