String in Java

String in Java

String ဆိုတာ character ‌‌‌တွေအတွဲလိုက် စုဝေးထားတဲ့ Object အမျိုးအစားတစ်ခုပါ။ Java မှာရှိတဲ့ String ဟာ int, float, char နဲ့ boolean ‌‌တွေလို Primitive type မျိုး မဟုတ်ပါဘူး။ အခြေခံအားဖြင့် char array တစ်ခုက String တစ်ခုရဲ့ အလုပ်လုပ်ပုံနဲ့တူပါတယ်။

3.png

String ကို ပုံမှန်အားဖြင့်နည်းလမ်း ၂ ခုနဲ့ အသုံးပြုလို့ရပါတယ်။

  1. Using string literal

  2. Using new keyword

(String Object ‌‌တွေကို တည်ဆောက်ဖို့ဆိုရင် java.lang.String class ကို အသုံးပြုရပါတယ်)


String str = "Hello World";

String Literal အသုံးပြုနည်းကတော့ ရှင်းပါတယ်။ double quote လုပ်ပြီး Variable ထဲ Initialize လုပ်ဖို့ပဲလိုပါတယ်။

5.png

Java မှာ String Objects ‌တွေသိမ်းဖို့အတွက် Special memory area ဆိုပြီးရှိတယ်။ အဲ့ဒီ Memory ကို String constant pool လို့လည်းခေါ်ပါတယ်။

String Literal တစ်ခု Create လုပ်တိုင်း Memory မှာနေရာမယူခင် JVM (Java Virtual Machine) ကနေ အလုပ်တစ်ခုလုပ်ပါတယ်။ အဲ့ဒါကထည့်လိုက်တဲ့ String value ‌က pool ထဲမှာ Value ရှိိိိိိိိိိိိိိပြီးသားဆိုရင် Object အသစ်မလုပ်ပဲ Value ကို လက်ခံနိုင်ဖို့အတွက် Reference ပဲပေးလိုက်ပါတယ်။ Pool ထဲမှာ တူညီတဲ့ Value မရှိဘူးဆိုရင်တော့ Object အသစ်တစ်ခုပြုလုပ်ရပါပြီ။

String str1 = "java"; 
String str2 = "java";

ဒီလိုအခြေနေမျိုးဆိုရင် str2 အနေနဲ့ Object အသစ်လုပ်စရာ မလိုတော့ပဲ Pool ထဲက java ဆိုတဲဲ့ value ကိုပဲအသုံးပြုလိုက်ရပါတယ်။ (ပုံပါအတိုင်း)

Memory efficient ဖြစ်တယ်လို့ ‌‌ပြောလို့ရပေမယ့် String class က immutable ဖြစ်တဲ့အတွက်ကြောင့် Value change တိုင်း Overwrite ဖြစ်မှာမဟုတ်ပဲ Object ‌‌တွေသာ အသစ်လုပ်မှာဖြစ်တဲ့အတွက်ကြောင့် String Concatenation တို့လို string manipulations ‌‌တွေအကြိမ်များစွာလုပ်ရင် Memory cost ကတော့ ပိုလို့ဆိုးပါလိမ့်မယ်


String str = new String("java");

6.png

new keyword နဲ့ create လုပ်မယ်ဆိုရင်တော့ JVM က String Literal လို value တူရှိလား မစစ်တော့ပဲဲ Object ၂ ခု ‌ဆောက်ပြီး Reference တစ်ခုသုံးတဲ့ ပုံစံပြုလုပ်မှာပါ။ Object ၂ ခုမှာ တစ်ခုကို Heap ထဲမှာသာထားပြီး Literal "java" value ကိုတော့ pool ထဲမှာထည့်ထားမှာဖြစ်ပါတယ်။ Reference ကတော့ Heap (non-pool) ကနေပဲယူမှာ ဖြစ်ပါတယ်။


4.png

"==" သည် Reference တူတာကိုသာစစ်ပြီး value တူမတူ မကြည့်ပါ။

 String str1 = "btt";  
 String str2 = "btt";  
 String str3 = new String("btt");
(str1 == str2)// true

str1 == str2 သည် String Literal များဖြစ်ပြီး Reference တူသောကြောင့် true အဖြေထွက်မည်။ (Reference တူသည်ဟု ‌ပြောခြင်းမှာ String Literal များဖြစ်ကြပြီး Value လည်းတူသောကြောင့်ဖြစ်သည်)

(str1 == str3) // false

Value တူသော်လည်း Reference မတူသောကြောင့် false ပြန်လိမ့်မည်။ (str1 သည် constant pool ထဲက Reference ဖြစ်ပြီး str3 သည် Heap ထဲက Reference ဖြစ်သောကြောင့်ဖြစ်သည်။

equals() method သည် Value content ‌‌ေ‌တွ တူရင်ရပြီဖြစ်လို့ Reference ကိုမကြည့်ပါ။

String str1 = "btt";  
String str2 = "btt";  
String str3 = new String("btt"); 

str1.equals(str2); // true
str1.equals(str3); // true

str1 နဲ့ str2 သည် value တူကြပြီး str1 နှင့် str3 သည်လည်း value တူကြသည်။ ဒါကြောင့် အားလုံး true ဖြစ်ကြပါတယ်။

ဒါကြောင့်မို့ String ‌‌တွေတူမတူစစ်တဲ့အခါ Content Value ‌‌တွေပဲ တူမတူ စစ်တာများတဲ့အတွက်ကြောင့် equals() method ကိုသာ သုံးသင့်ပါတယ်။

String သုံးနည်းမှာ String Literal နဲ့ New keyword ၂ ခုသာရှိတာမဟုတ်ပါဘူး။ StringBuffer နဲ့ StringBuilder စတဲ့ Mutable class ‌‌တွေလည်း ရှိပါသေးတယ်။ Immutable နဲ့ Mutable ကိုတော့ ‌နောက်မှဆက်ရှင်းပါမယ်။