Java String Builder class
Tags: java, beginners
Published: 2021-11-29 06:52:12

Hi guys!
ဒီနေ့ကျနော်ပြောပြပေးမှာက **StringBuilder class** အကြောင်းပါ။

**StringBuilder** class ကနာမ်မည်အတိုင်း string တွေကို build လုပ်ပေးပါတယ်။ **String** class နဲ့မတူတာက **String** မှာကြ သူက immutable ဖြစ်ပါတယ်။ ဆိုလိုချင်တာက create လုပ်ထားတဲ့ string တခုကို **String** class မှာပါတဲ့ method တွေနဲ့ character တွေကို lower and upper case ပြောင်းတာတို့ character တွေဖြတ်ထုတ်ပြစ်တာတို့ စတာတွေ လုပ်တဲ့အခါကြရင် မူရင်း string က ပြောင်းလဲသွားမှာမဟုတ်ပါဘူး။ နောက်ထပ် String အသစ်ကိုပဲ return ပြန်ပေးမှာပါ။အိုကေ အဲ့တာလေးစမ်းကြည့်ရအောင်။

source code:
{% replit @zukikazumi/StringBuilder %}

အပေါ်က source code မှာဆိုရင် str ကို `toUpperCase()` နဲ့သုံးပြီး ပြောင်းထားပေမယ့်လည်း မူရင်း str variable ကတော့ တန်ဖိုးပြောင်းသွားချင်းမရှိပါဘူး။ uppercase ပြောင်းထားတဲ့ string ကိုသိမ်းမယ်ဆိုရင်တော့ နောက်ထပ် variable အသစ်လိုပါလိမ့်မယ်။ ဘယ်လိုလုပ်လုပ် မူရင်း value ကိုပြောင်းလဲလို့မရတာမျိုးကို immutable ဖြစ်တယ်လို့ခေါ်ကြပါတယ်။

**StringBuilder** မှာကြတော့ mutable ဖြစ်ပါတယ်။ ဆိုလိုတာက မူရင်း string ကို တခုခု ပြောင်းလိုက်တာနဲ့ အဲ့ string ကို reference လုပ်ထားတဲ့ variable တွေရဲ့တန်ဖိုးတွေအကုန် ပြောင်းမှာပါ။ အဲ့အကြောင်းအောက်မှာဆက်ပြောပေးပါမယ်။ အဲ့တာဆို **StringBuilder** ကို create လုပ်ကြည့်ရအောင်။

create လုပ်နည်း လေးခုရှိပါတယ်။ ပထမတခုက default ပါ။ **StringBuilder** class ရဲ့ constructor ခေါ်လိုက်ရုံပါပဲ။ သူက capacity 16 ရှိတဲ့ object ကို return ပြန်ပေးမှာဖြစ်လို့ variable ကို ပြန်ခေါ်လိုက်ရင် **StringBuilder** အလွတ်(ဘာမှ မပါပေမယ့် capacity 16 ခုကိုတော့ယူထားပါတယ်) တခုကို ရလာမှာပါ။
eg code: `StringBuilder str = new StringBuilder();`
နောက်တနည်းကတော့ capacity ကို argument အနေနဲ့ထည့်ရမှာပါ။ ကျနော်တို့ ထည့်လိုက်တဲ့ capacity အတိုင်း **StringBuilder** object ထွက်လာမှာပါ။
eg code: `StringBuilder str1 = new StringBuilder(20);`
နောက်တနည်းကတော့ **String** ကို argument အနေနဲ့ထည့်ပေးရမှာပါ။ သူကတော့ ကျနော်တို့ထည့်ထားတဲ့ string value ပါတဲ့ **StringBuilder** object ကို return ပြန်ပေးမှာပါ။
eg code: `StringBuilder str2 = new StringBuilder("my string");`
နောက်တနည်းကတော့ **CharSequence** ကို argument အနေနဲ့ထည့်ပေးရမှာပါ။ **CharSequence** ဆိုတာ **String** က implements လုပ်ထားတဲ့ interface(interface အကြောင်းလည်းတင်ဖြစ်ဦးမယ်ထင်ပါတယ်) ဖြစ်တာမလို့ အပေါ်က **String** ကိုထည့်ပြီး create လုပ်တာနဲ့မကွာပါဘူး။အပေါ်ကပြောခဲ့တာတွေကို စမ်းကြည့်ရအောင်ဗျာ။

source code :
{% replit @zukikazumi/StringBuilderTest %}

အပေါ်က ရှင်းပြထားတာတွေကိုပဲရေးထားတာမလို့ code တွေကို ဖတ်ကြည့်ရင်တော့ နားလည်ကြမယ်လို့ထင်ပါတယ်။

ok, **StringBuilder** က mutable ဖြစ်တဲ့အကြောင်း ဆက်ရအောင်ဗျာ။

mutable, immutable အကြောင်းကအပေါ်မှာပြောထားပြီးပြီမလို့ example code လေးနဲ့ပဲရှင်းပြပေးပါမယ်။

example code:
```java
class StringBuilderDemo {

	public static void main(String[] args) {

		StringBuilder person1 = new StringBuilder("Maung"); //create a StringBuilder with defined name
		System.out.println("Person 1 is :" + person1); //"Maung"

		StringBuilder person2 = person1;

		StringBuilder person3 = person1.append(" Maung"); //initialize person2 with the value of changed person1 and it will get "Maung Maung"

		System.out.println("Person 3 is :" + person3);
		System.out.println("Person 1 is :" + person1); //that appen method also change person1 and 2
		System.out.println("Person 2 is :" + person2);
	}
}
```

အပေါ်က code မှာဆိုလို့ရှိရင် person 1 ကို "Maung" ဆိုပြီး **StringBuilder** အနေနဲ့ initialize လုပ်ထားတာပါ။ ပြီးတော့ person 2 ကိုလည်း person 1 ကိုပဲသုံးပြီး "Maung" အနေနဲ့ပဲ ထည့်ထားတာပါ။ အဲ့တော့ **StringBuilder** ကို person 1 and person 2 က reference လုပ်နေကြပါတယ်။ အဲ့အထိက ပြဿနာမဖြစ်သေးပါဘူး။ person 3 အတွက် initialize လုပ်တဲ့အခါမှာတော့ person 1 ကို `append();` method သုံးပြီး space တခုရယ် "Maung" ရယ်ထပ်ထည့်လိုက်တာကြောင့် person 2 က "Maung Maung" ဖြစ်သွားပေမယ့် အဲ့ **StrngBuilder** object ကိုမှီခိုနေတဲ့ person 1 နဲ့ person 2 ကလည်းပဲ "Maung Maung" ဆိုပြီးလိုက်ပြောင်းကုန်ကြပါတယ်။ 

အဲ့တာဆိုရင် **StringBuilder** က mutable ဖြစ်တဲ့အကြောင်းရယ် **StringBuilder** ကိုသုံးတဲ့အခါ သတိထားရမှာလေးတွေကို သိလောက်ပြီထင်ပါတယ်။
နောက်မှတွေ့ကြတာပေါ့။ BB