August 11, 2012

Collections Framework

အကယ်၍ စာဖတ်သူသည် Basic Programming နှင့် Easy Java ခေါင်းစဉ်အောက်ရှိ သင်ခန်းစာများအား လေ့လာခဲ့ပါက၊ Java ပရိုဂရမ်မင်း၏ အခြေခံ ရေးသားပုံနှင့် Object Oriented ရဲ့ သဘောတရားများအား နားလည်ခဲ့ပြီ ဖြစ်ပါလိမ့်မည်။ အပြင်လောကနှင့် နှိုင်းယှဉ်မည် ဆိုပါက စကားစတတ်ခါစ ကလေးတစ်ယောက် ဖြစ်ပြီဟု ဆိုရမည် ဖြစ်သည်။ စကား တတ်ပြီ ဖြစ်သော်လည်း စာကားလုံးမကြွယ်သေးပေ။ ရိုးရှင်းသော ပရိုဂရမ် အတိုလေးများအား ရေးနိုင် ဖတ်နိုင်ပြီ ဖြစ်ပါလိမ့်မည်။ ထိုမှတဆင့် စကားလုံးကြွယ်သော လူကြီးတစ်ယောက်ဖြစ်ရန် ဆက်လက်လေ့လာရန် လိုအပ်ပါသေးသည်။

အပလီကေးရှင်းတစ်ခုအား တည်ဆောက်ရာတွင် ဖိုင်အသွင်းအထုတ်များ၊ အချက်အလက်များအား အစဉ်ပြေပြေ အသုံးပြုနိုင်ရန် အတွက် ကော်လက်ရှင်များနှင့် အင်တာနက်နှင့် Thread များအား အသုံးပြုရန် လိုအပ်သည့်အခါများ ရှိလာပါလိမ့်မည်။ ထိုအခါမျိုးတွင် ပရိုဂရမ်မင်းဘာသာရပ် တွင် ပံ့ပိုးပေးထားသော API များအား အသုံးပြု၍သော်၎င်း၊ အကယ်၍ ပံ့ပိုးထားခြင်း မရှိပါက မိမိကိုယ်တိုင်ရေးသား၍သော်၎င်း ပြဿနာများအား ဖြေရှင်းရန် လိုအပ်ခဲ့ပေသည်။

ယနေ့ခေတ် အသုံးများသော ပရိုဂရမ်မင်းဘာသာရပ် အတော်များများသည် အခြေခံ Input / Output နှင့် Data Collection များအပြင် အသုံးဝင်သော API များအား ပြင်ဆင်ထားလေ့ရှိပါသည်။ ထိုအထဲတွင် နှစ်ရှည်လများ Open Source အနေဖြင့် အသုံးများခဲ့သော Java ဘာသာရပ်တွင် အသုံးဝင်သော API များနှင့် Utility Framework များစွာကို Java Run TimeEnvironment အတွင်းတွင် အသင့်ပြင်ဆင်ထားခဲ့ပါသည်။

ကျွှန်တော်တို့ Java ဘာသာရပ်တွင် အချက်အလက်များအား အသုံးပြုရန် ပြင်ဆင်ထားသော Utility Class များမှ တဆင့် လေ့လာသွားပါဦးမည်။ java.util နှင့် java.text package ၏ အောက်တွင် အသုံးများသော ကလပ်စ်နှင့် အင်တာဖေစ်များအား စုစည်း ရေးသားထားလေ့ ရှိပါသည်။ ယခုတစ်ခေါက်တွင် Collection Framework နှင့် ပတ်သက်၍ လေ့လာ ရေးသားသွားပါမည်။


Collection Framework

ပရိုဂရမ်တစ်ခုတွင် အချက်အလက်များအား မည်သည့်ပုံစံဖြင့် အသုံးပြုမည်ဆိုသည့် အချက်သည် လွန်စွာအရေးကြီး လှပါသည်။ Java ပရိုဂရမ်မင်းဘာသာရပ်တွင်လည်း အချက်အလက်များအား အစဉ်ပြေစွာ အသုံးပြုနိုင်ရန် ပုံစံအမျိုးမျိုး ဖြင့် အသုံးပြုလာကြ၏။ ကနဦး Java အား လေ့လာရာတွင် အတွေ့များမည်ဖြစ်သော Vector များမှ အစ Array ဟု ခေါ်သော ကိန်းစဉ်များ၊ အချက်အလက်များအား အစုလိုက်အဝေးလိုက် အသုံးပြုနိုင်သော List များ၊ အမည်နှင့် တန်ဖိုးအား ပူးတွဲထားသော Dictionary ပုံစံများ၊ အစရှိသည့် အော့ဘဂျက်များအား အသုံးပြုလာခဲ့ ကြ၏။

Java 2 ဟု ခေါ်သော Java SE 1.4 အရောက်တွင် Collections Framework ကို စတင် ဖြည့်စွက်လာခဲ့ပါသည်။ Collection ဆိုသည်မှာ အချက်အလက်များအား အစုလိုက် ဖော်ပြ အသုံးပြုနိုင်သော Object များကို ရည်ညွှန်းပါသည်။ Collection Framework ဆိုသည်မှာအချက်အလက်အစုအဝေးအား အသုံးပြုနိုင်သော၊ ထိမ်းသိမ်းနိုင်သော နည်းလမ်းများအား ပေါင်းစုထားသော အာကီတက်ချာ တစ်မျိုးပင် ဖြစ်၏။


အသုံးပြုခြင်း၏ အကျိုးကျေးဇူးများ

Collection Framework အား အသုံးပြုခြင်း အားဖြင့် ရရှိနိုင်သော အကျိုးကျေးဇူးများမှာ အောက်ပါအတိုင်း ဖြစ်၏။
  • ပရိုဂရမ်များအား ရေးသားရာတွင် သက်သာစေခြင်း
    အသုံးပြုနိုင်သော အချက်အလက် ဖွဲ့စည်းပုံနှင့် အလဂိုရီဇင်အား အသင့် ပြင်ဆင်ထားပါသဖြင့် ပရိုဂရမ်များအား အသစ်ထပ်မံ ရေးသားချင်းမှ သက်သာစေနိုင်ပါသည်။
  • Performance အား တိုးတက်စေနိုင်ခြင်း
    Collection Framework တွင် အသုံးပြုနိုင်သော Data ဖွဲ့စည်းပုံနှင့် အဆင့်မြင့် အလဂိုရီဇင်များအား ပံ့ပိုးထားပါသည်။ ထို့အပြင် အင်တာဖေစ်များအား Implement လုပ်ထားသော ကလပ်စ်များသည်လည်း တစ်ခုနှင့် တစ်ခု အပြန်အလှန် ပြောင်းလည်း အသုံးပြုနိုင်ရန် ရည်ရွယ်၍ တည်ဆောက်ထားပါသဖြင့်၊ နှစ်သက်ရာ အလဂိုရီဇင်သုံး ကလပ်စ်များအား ပြောင်းလည်း အသုံးပြုသွားရုံဖြင့် တစ်ဆင့်ထက်တဆင့် Performance တိုးတက်အောင် ရေးသားနိုင်ပါသည်။
  • ပတ်သက်ခြင်းမရှိသော ပရိုဂရမ်များ အကြားတွင် အပြန်အလှန် ဆက်သွယ် အသုံးပြုစေနိုင်ခြင်း
    Collection များအား API များ၏ ကြားခံ အင်တာဖေစ် အနေဖြင့် အသုံးပြုခြင်းအားဖြင့် ဘုံသုံးဘာသာရပ် တစ်ခုကို ဖြစ်တည်စေနိုင်ပါသည်။
  • API အား လေ့လာရန် အချိန်အား သက်သာစေခြင်း
    ဤကဲ့သို့ ကော်လက်ရှင်များအား စုစည်းထားခြင်း အားဖြင့်၊ အသုံးပြုခါနီးမှ လေ့လာရသည့် အချိန်အား သက်သာစေနိုင်ပါသည်။
  • API အား ရေးသားရန် အချိန်အား သက်သာစေခြင်း
    ပြင်ဆင်ထားသော API အား အသုံးပြုခြင်းအားဖြင့်၊ မိမိကိုယ်တိုင် ရေးသားရမည့် အချိန်ကို သက်သာစေနိုင်ပါသည်။
  • ဆော့ဖ်ဝဲများအား ပြန်လည်အသုံးချနိုင်စေရန် အထောက်အကူပြုနိုင်ခြင်း
    ကော်လက်ရှင်နှင့် အလဂိုရီဇင်များ အပြင်၊ ၎င်းတို့အား အသုံးပြုနိုင်သော Utility များအား ပံ့ပိုးထားခြင်း အားဖြင့် ဆော့ဖ်ဝဲများအား ပြန်လည် အသုံးပြုရာတွင် အထောက်အကူပြုစေနိုင်ပါသည်။


ပါဝင်သော အစိတ်အပိုင်းများ

ကော်လက်ရှင် ဖရိမ်ဝက်တွင် ပါဝင်သော အစိတ်အပိုင်းများမှာ အောက်ပါအတိုင်း ဖြစ်ကြပါသည်။
  • ကော်လက်ရှင် အင်တာဖေစ်
    Set, List နှင့် Map အစရှိသော ကော်လက်ရှင်များအား ဆိုလိုခြင်း ဖြစ်ပြီး၊ ကော်လက်ရှင် ဖရိမ်ဝက်သည် အစရှိသည့် အင်တာဖေစ်များအား အခြေခံ၍ဖွဲ့စည်း ထားပါသည်။
  • General Implementations
    ကော်လက်ရှင် အင်တာဖေစ်များအား ပံ့ပိုးထားသော အခြေခံ ကလက်စ်များ ဖြစ်ကြ၏။
  • Legacy Implementations
    Vector နှင့် HashTable များကဲ့သို့ ယခင်က ကော်လက်ရှင်ကလပ်စ်များအား ပြန်လည်ပြုပြင်၍ Collection Interface အား ပံ့ပိုးထားခြင်း ဖြစ်၏။
  • အထူး ပံ့ပိုးမှု့များ (Special Implementations)
    အခြေအနေတစ်ခုအတွက် သီးခြားပံ့ပိုးထားသော ကလပ်စ်များ ဖြစ်ကြ၏။ ၎င်းတို့အား အသုံးပြုခြင်း အားဖြင့် သီးခြားအသုံးပြုပုံ၊ ကန့်သတ်ချက်များနှင့် လုပ်ဆောင်ချက်များအား လုပ်ဆောင်စေနိုင်ပါသည်။
  • Concurrent Implementations
    အပြိုင်အလုပ်လုပ်စေနိုင်သော Concurrent အပလီကေးရှင်းများအတွက် ပံ့ပိုးထားသော ကော်လက်ရှင် ကလပ်စ်များ ဖြစ်ကြ၏။
  • Wrapper Implementations
    ကော်လက်ရှင် အင်တာဖေစ်များအပြင်၊ Synchronization ကဲ့သို့ အခြားသော ဖန်ရှင်များအား အသုံးပြုရန် ပံ့ပိုးထားသော ကလပ်စ်များ ဖြစ်ကြ၏။
  • Convenience Implementations
    Performance မြင့်မားစေရန် ကော်လက်ရှင်ဖရိမ်ဝက်၏ လုပ်ဆောင်ချက်များအား အနည်းဆုံး ပံ့ပိုးထားသော ကလပ်စ်များ ဖြစ်ကြ၏။
  • Abstract Implementations
    အသုံးပြုသူက စိတ်ကြိုက်ပြုပြင် အသုံးပြုနိုင်ရန် ရည်ရွယ်၍၊ ကော်လက်ရှင်အင်တာဖေစ်၏ အချို့သော အခြေခံ လုပ်ဆောင်ချက်များအား ဖြည့်စွက်ရေးသားထားသော Abstract ကလပ်စ်များ ဖြစ်ကြ၏။
  • အလဂိုရီဇင်
    ကော်လက်ရှင် ဖရိမ်ဝက်တွင် လစ်များအား အစီအစဉ်ပြောင်းခြင်း ကဲ့သို့ ကော်လက်ရှင်များအား အမျိုးမျိုးအသုံးပြုနိုင်သော Static Method များလည်း ပါဝင်ပါသည်။
  • Infrastructure
    ကော်လက်ရှင် အင်တာဖေစ်များအား အဓိကထားပံ့ပိုးပေးနိုင်သော အင်တာဖေစ်များဖြင့် ဖွဲ့စည်းထား၏။
  • Array Utilities
    ကနဦးပုံစံ ကိန်းစဉ် (Primitive Type Array) များနှင့် ကိုးကားပုံစံ ကိန်းစဉ် (Reference Type Array) များအား အသုံးချနိုင်သော Utility Function များဖြစ်ကြ၏။ တိတိကျကျဆိုရမည် ဆိုလျှင် ၎င်းတို့သည် Collection Framework ၏ အစိတ်အပိုင်းတစ်ခုဟု ဆိုရန်ခက်ခဲသော်လည်း၊ Collection Framework နှင့် အတူ Java Platform အပေါ်တွင် ဖြည့်စွက်ခဲ့ပြီး၊ Collection Framework က အသုံးပြုသော Infrastructure အပေါ်တွင် မှီခို၍ တည်ဆောက်ထားပါသည်။


Collection Interfaces

Java ဘာသာရပ်တွင် Collection Framework အား Interface များအား အခြေခံ၍ ဖွဲ့စည်း တည်ဆောက် ထားပါသည်။ Collection Framework တွင်ပါဝင်သော အခြေခံ Interface များမှာ အောက်ပါအတိုင်း ဖြစ်ပါသည်။


Collection Framework သည် အခြေခံအားဖြင့် အုပ်စုနှစ်ခုဖြင့် ဖွဲ့စည်းထားပြီး၊ ၎င်းတို့မှာ Collection Interface မှ ဆင်းသက်လာသော အင်တာဖေစ် အုပ်စုနှင့်၊ Map Interface မှ ဆင်းသက်လာသော အုပ်စုတို့ ဖြစ်ကြပါသည်။

Collection အင်တာဖေစ်မှ ဆင်းသက်လာသော အင်တာဖေစ်များမှာ အောက်ပါအတိုင်း ဖြစ်ကြ၏။

Map အင်တာဖေစ်မှ ဆင်းသက်လာသော အင်တာဖေစ်များမှာ အောက်ပါအတိုင်း ဖြစ်ကြ၏။
Collection အင်တာဖေစ်၏ javadoc တွင် လုပ်ဆောင်ချက် ရှင်းလင်းချက်များ၌ (optional operation) ရေးသားထားသည်ကို မကြာခဏ တွေ့ရတတ်ပါသည်။ လိုအပ်မှသာ ပြည့်စွက်ရေးသားရန် လိုသော လုပ်ဆောင်ချက်များ ဖြစ်ကြ၏။ ဖြည့်စွက်ရေးသားထားပုံ အပေါ်မှုတည်၍ အချို့သော လုပ်ဆောင်ချက်များအား ရေးသားထားခြင်း မရှိသည့်အခါများ ရှိတတ်ပါသည်။ ဖြည့်စွက်ရေးသားထားခြင်း မရှိသည့် လုပ်ဆောင်ချက် များအား ခေါ်ယူ အသုံးပြုမိပါက UnsuportedOperationException ကို ဖြစ်ပေါ်စေမည် ဖြစ်သည်။ ထို့ကြောင့် ဖြည့်စွက်ရေးသားထားသော ကလပ်စ်၏ Document (javadoc) များတွင် ပံ့ပိုးပေးထားသော Optional Operation များ အကြောင်းကို ဖော်ပြရန်လိုအပ်ပါသည်။ ဤကဲ့သို့ အသုံးပြုပုံကို နားလည်လွယ်ကူစေရန် အတွက် ဘာသာရပ်ဆိုင်ရာ ဝေါဟာရ အချို့ကို ဖြည့်စွက်ခဲ့၏။
  • ပြုပြင်ပြောင်းလည်းခြင်း ဆိုင်ရာ လုပ်ဆောင်ချက်များ ဖြစ်ကြသော add, remove နှင့် clear အစရှိသည့် လုပ်ဆောင်ချက်များအား ပြုလုပ်နိုင်သော ကော်လက်ရှင်အား unmodifiable ဟု ခေါ်ဆိုပါသည်။ တဖန် modifiable မဟုတ်သော Collection များအား modifiable ဟု ခေါ်ဆို၏။
  • Collection Object အတွင်းရှိ မည်သည့် ပြောင်းလည်းချက်မျိုးမဆို မမြင်နိုင်ဘူးဟု အာမှခံနိုင်သော Collections များအား immutable ဟု ခေါ်ဆို၏။ တဖန် immutable မဟုတ်သော Collection များသည် mutable များ ဖြစ်ကြပါသည်။
  • List Object တစ်ခု အတွင်းရှိ Object များအား ပြောင်းလည်းနိုင်သော်လည်း Object များ၏ အရေအတွက်ကို ပြောင်းလည်းနိုင်ခြင်း မရှိသော List များအား fixed-size ဟု ခေါ်ဆိုပါသည်။ တဖန် fixed-size မဟုတ်သော List များအား variable-size ဟု ခေါ်ဆိုပါသည်။
  • Index များဖြင့် ဆက်သွယ်ထားသော Element များအား လျှင်မြန်စွာ (သတ်မှတ်ထားသော အတိုင်းအတာတစ်ခု အတွင်း) ဆက်သွယ်နိုင်သော List များအား random access list ဟု ခေါ်ဆို၏။ တဖန် index လုပ်ထားသော Element များ အဖြစ် အသုံးပြုခြင်း မရှိသော List များအား sequential list ဟု ခေါ်ပါသည်။ List တစ်ခုသည် Random access လားဟု သိရှိစေနိုင်သည်မှာ RandomAccess Marker အင်တာဖေစ် ပင်ဖြစ်၏။ ထိုကဲ့သို့ မိမိ အသုံးပြုနေသော List သည် Random Access လား Sequential Access လားဟု ခွဲခြားသိရှိခြင်းအားဖြင့် သဘောသဘာဝ အပေါ်မှုတည်၍ အခြေခံ အလဂိုရီဇင်များအား ပြုလည်းစေနိုင်ပြီး၊ Performance အား တိုးတက်စေရန် စီမံနိုင်မည် ဖြစ်သည်။


ကော်လက်ရှင်များအား ပံ့ပိုးခြင်း


ကော်လက်ရှင် ဖရိမ်ဝက်တွင် ကော်လက်ရှင် အင်တာဖေစ်များအား အပြင်၊ ၎င်းတို့အား ပံ့ပိုးထားသော ကလပ်စ်များလည်း ပါဝင်၏။ General Implementations များတွင် ပါဝင်သော ကလပ်စ်များအား ၎င်းတို့၏ အမည်ကို ကြည့်ခြင်းအားဖြင့် မည်သို့အသုံးပြုနိုင်သည်ကို သိရှိနိုင်မည် ဖြစ်သည်။ General Implementations ရှိ ကလပ်စ်များ၏ အမည်မှာ များသောအားဖြင့် <Implementation-style><Interface> ဟု ရေးသားလေ့ ရှိသောကြောင့် ဖြစ်၏။ General Implementations တွင် ပါဝင်သော ကလပ်စ်များမှာ အောက်ပါအတိုင်း ဖြစ်၏။

Interface Hash Table Resizable Array Balanced Tree Linked List Hash Table + Linked List
Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Deque ArrayDeque LinkedList
Map HashMap TreeMap LinkedHashMap

အထက်ပါ ကလပ်စ်များသည် optional operations များအားလည်း ပံ့ပိုးပေးထားပြီး၊ အသုံးပြုနိုင်သော Element များအပေါ်တွင်လည်း သက်မှတ်ချက်၊ တားဆီးချက်များမရှိပါ။ တဖန် ၎င်းတို့သည် unsynchronized များဖြစ်ကြ၏။ သို့ရာတွင် Collection Framework တွင်ပါဝင်သော static factory ၏ synchronization wrappers အား အသုံးပြုခြင်းအားဖြင့် unsynchronized collection များအား synchronied ဖြစ်အောင် ပြုလုပ်ပေးနိုင်၏။ Implementations အသစ်များအားလုံးတွင် fail-fast iterators ကို အသုံးပြုထားပြီး၊ ၎င်းသည် ပြိုင်တူပြောင်းလည်းချက်များအား ပြုလုပ်သည်ကို သိရှိနိုင်ပြီး၊ လျှင်မြန်သပ်ရပ်စွာ အမှားကို ဖော်ပြပေးနိုင်၏။ မလိုလားအပ်သော လုပ်ဆောင်ချက် အမှားများအား ဖြစ်ပေါ်စေခြင်း ရှိနိုင်မည် မဟုတ်ပေ။

AbstractCollection, AbstractSet, AbstractList, AbstractSequentialList နှင့် AbstractMap ကလပ်စ်များသည် အဓိက အင်တာဖေစ်များ၏ အခြေခံလုပ်ဆောင်ချက်များအား ပံ့ပိုးထားပြီး၊ ဖြည့်စွက်ရေးသားသူကို ၎င်းတို့အား ထပ်မံရေးသားခြင်းမှ သက်သာစေနိုင်ပါသည်။ ၎င်းကလပ်စ် များ၏ Documents များတွင်မည်သည့် လုပ်ဆောင်ချက်များအား ပံ့ပိုးထားပြီးဖြစ်ပြီး၊ မည်သည့် လုပ်ဆောင်ချက်များအား ဖြည့်စွက်ရေးသားရန် လိုသည် ဆိုသည်ကို လွယ်ကူစွာ သိရှိနိုင်ပါသည်။ ဤကဲ့သို့ အခြေခံ လုပ်ဆောင်ချက်များအား ရေးသားပြီး ဖြစ်သော Abstract Class များအားဖြည့်စွက်ရေးသား ခြင်းအားဖြင့်၊ မိမိရေးသားသော သီခြားကလပ်စ် များ၏ အခြေခံလုပ်ဆောင်ချက် Performance ကို တိုးမြင့်စေနိုင်ပါသည်။


ကိုးကား
http://docs.oracle.com/javase/7/docs/technotes/guides/collections/overview.html


ဆက်ပါဦးမည်။ လေးစားစွာဖြင့်။
မင်းလွင် 

1 comment:

  1. Dear Sayar,
    I can't find the course of "Easy Java" in your blog that you prefer for new programmer to learn. Please, show me a link to reach this course.
    Thanks

    ReplyDelete