কালেকশন ফ্রেমওয়ার্ক কি?
কালেকশন মানেই তো বুঝছেন এইখানে কিছু একটার কালেকশন থাকবে, ঐযে ঈদের আগে বাজারে গেলে দোকানদার চিল্লা চিল্লি করে না, নতুন কালেকশন এসেছে, শুধু মাত্র আপনার জন্যই ঐরকম টাইপ আর কি। দোকানদারের কাছে নতুন জামা কাপড়ের কালেকশন থাকে।
তো এই জাভা ফ্রেমওয়ার্কের মধ্যে কিসের কালেকশন থাকবে?
এর কাছে কিছু গুরুত্বপূর্ণ ক্লাস , আর ইন্টারফেসের কালেকশন থাকবে। যেমনঃ
ইন্টারফেস ক্লাস
1.
List কে implement করে ->
1. ArrayList
2. LinkedList
3. Stack4. Vector
2. Set কে implement করে -> 1. HashSet
2. LinkedHashSet
3. TreeSet
3. Queue কে implement করে -> 1. Deque(Interface)
2. PriorityQueue
4. Deque কে implement করে -> 1. LinkedList
তো এই জিনিসগুলো জাভার মধ্যে কেন এলো? এগুলা ছাড়াও ত দিব্বি আমাদের কাজ চলছিল। এগুলার প্রয়োজন টা বুঝাই,
আমাদের তো ডেটা নিয়েই কাজ করতে হয়, ডেটা হ্যান্ডেল করার কিছু নির্দিষ্ট প্রসেস আছে যেগুলার মাধ্যমে আমরা অনেক সহজেই ডেটা আক্সেস করতে পারি, চেঞ্জ করতে পারি ইত্যাদি ডেটা নিয়ে যতরকমের কাজ আছে সব করতে পারি, তো ধরেন আপনি যখন বড় কোনো প্রজেক্ট নিয়ে কাজ করবেন তখন প্রজেক্ট নিয়ে চিন্তা বাদ দিয়ে বার বার এই ধরনের কোড লিখা লাগবে, তো যাতে আপনি প্রজেক্ট নিয়েই ভালমতো চিন্তা করতে পারেন, আপনার সময় এইদিকে নষ্ট না হয়, তাই জাভা এই কোড গুলা লিখে দিয়েছে আপনার জন্য।
আবার,
ধরেন আপনাকে বলা হলো একটা ভ্যারিয়েবল এর মধ্যে ১০ রাখো, আপনি কি করবেন?
int x=10;
রেখে দিলেন,
এখন আবার বলা হলো এই রকম ভ্যারিয়েবল আমার দশ হাজারটা লাগবে, আপনি কি করবেন?
int x[ ] =new int[10000];
তো আপনি একটা আর্যে ঘোষণা করলেন দশ হাজার সাইজের, কিন্তু যিনি ব্যবহার করছেন দেখা গেল তার মাত্র ২টা আর্যে দরকার পড়ল , তাহলে আপনার নয় হাজার নইশত আটানব্বই( ৯৯৯৮) এত গুলা আর্যে হুদাই মেমরি দখল করে জায়গা নষ্ট
করল, (৯৯৯৮ * ৪ বাইট) এত গুলা মেমরি স্পেশ নষ্ট হচ্ছে এভাবে,
ঘটনা এমনও হতে পারত, মেমরি যাতে নষ্ট না হয় তাই আপনি ১০০ সাইজের আর্যে ঘোষণা করলেন, কিন্তু তখন আপনার দরকার পড়ছে ৫০০ সাইজের তখন ArrayIndexOutOfBounds এক্সেপশন দেখাবে।
তাই আমাদের এমন কিছু দরকার যেখানে আর্যের সাইজ ডাইনামিক্যালি চেঞ্জ হবে, মানে রানটাইমে আমাদের যত সাইজের আর্যের দরকার হবে ততটুক মেমরি ই দখল করবে,
আবার আমরা ইচ্ছে মত ডেটা add(), remove(), get() করতে পারব এমন কিছু।
উপরের সমস্যাকে মাথায় রেখেই ডাইনামিক আর্যে হিসেবে List, Set , Queue ইত্যাদি এসেছে। তো ডাইনামিক আর্যে পাইলাম ভাল কথা, কিন্তু এতকিছু কি এগুলা? কেমন জানি ভয়ানক সব নাম এদের, আচ্ছা আপনি বলেন ডাইনামিক আর্যে দিয়ে কি শুধু ডেটা add(), remove(), sort() এগুলাই করবো? বার বার শুধু add() করবো আর remove() করবো add() করবো আর remove() করবো? নাহ ।
সাধারন আর্যেকে আমরা যখন যেভাবে দরকার সেভাবে ( sort করি, কোনো element remove করি, যেকোনো index এর ভ্যালু প্রিন্ট করি, আর্যের ভ্যালুগুলা রিভার্স অর্ডারে প্রিন্ট করি, সাব আর্যে বানাই distinct element খুজে বের করি ইত্যাদি ) ব্যবহার করি, তাহলে এই ডাইনামিক আর্যেকে কেন নয়? এটাকে ব্যবহারের বিভিন্ন উপায় Set, List, Queue ইত্যাদি ইত্যাদি এগুলার মধ্যে দেয়া আছে। আমরা কি কি করতে পারি এগুলাই শিখবো কালেকশন ফ্রেমওয়ার্কের মধ্যে।
অন্য বেশি কিছু কাজের সুবিধা পাইলে খারাপ কি? এই যে উপরে এতগুলা class , এতগুলা Interface দেখছেন এদের আলাদা আলদা সুবিধা আছে, এদের বেশির ভাগ ই আমাদের “ডেটা স্ট্রাকচার” কোর্সে কোড ইমপ্লিমেন্ট করা শিখানো হবে,
আমরা যখন কোনো কাজ করব তখন যাতে আমদের মেইন কাজ বাদ দিয়ে এই একই কোড বার বার না লিখতে হয়, তাই জাভা আমাদের সময় বাচানোর জন্য এগুলা লিখেই দিয়েছে, আমরা শুধু কল করব আর ইউজ করব।
এদের নাম লিখেই আমরা এদের ব্যবহার করতে পারব, কিন্তু এদের কোড ইমপ্লিমেন্টেশনে কিছু পার্থ্যক্য আছে, আপনার যখন যে কাজের প্রয়োজন হবে তখন ঐটা করার জন্য কোন কালেকশন ইউজ করলে বেশি ভাল হবে, বেশি ফাস্ট হবে এগুলা চিন্তা করে আপনি ইউজ করবেন। এগুলা আমাদের আপাতত জানার দরকার নাই। টপিকগুলা আলাদা ভাবে পড়ব তখন জেনে নিব।
পার্থক্য বলতে কি রকম? যেমনঃ আপনার প্রোগ্রামে যদি ভ্যালু add(), remove(), add( index, value), এই টাইপের কাজ বেশি করতে হয় তাহলে আপনি ইউজ করবেন LinkedList ।
আর যদি বারবার ডেটাকে Access করতে হয় তখন ইউজ করবেন ArrayList । (কেন করবেন এগুলা ArrayList , LinkedList পড়ার সময় জানবো in sha Allah )
LinkedList কে এমন ভাবে বানানো হয়েছে , যাতে আপনি যখন add(), remove() করবেন তখন তাঁর কমপ্লেক্সিটি অন্যদের তুলনায় কম হয়।
একইভাবে অন্যদের ক্ষেত্রেও , তাই কখন কোনটা ইউজ করবেন এটা ঠিক করার জন্য আপনাকে এদের কমপ্লেক্সিটি জানতে হবে।
List ইন্টারফেসকে যারা ইমপ্লিমেন্ট করেছে( ArrayList, LinkedList etc) তাদের মধ্যে একই ভ্যালু অনেকবার থাকতে পারবে,( মানে duplicate ভ্যালু allowed)
List1 = 1 ,2 ,3 ,2 ,4 ,5 ,3 ,2 // 2, 3, occurring more than once
কিন্তু যারা Set কে implement করবে তাদের( HashSet, LinkedHashSet, TreeSet ) মধ্যে Duplicate value থাকতে পারবে না।
এইরকম একেকজন একেকরকম সুবিধা নিয়ে তৈরী, তাই নামগুলা দেখে ভয় পাইয়েন না, প্রথম প্রথম ঝামেলা মনে হতে পারে, পরে সব ক্লিয়ার হয়ে যাবে in sha Allah।
আচ্ছা আরেকটা উদাহরণ দিয়ে আরেকটু ক্লিয়ার করার চেষ্টা করি,
ধরেন একটা ArrayList create করলেন এর মধ্যে আপনার পছন্দের কিছু Song এর নাম রাখলেন,
List<String> ar=new ArrayList<>();
ar.add(“Tumi Asmane thako provu”);
ar.add(“Meherban”);
ar.add(“Ami Jodi konodin”);
এখন আপনি চান এগুলা Alphabetical order এ sort করতে, (মানে প্রথমে যার নামের শুরু A দিয়ে সে থাকবে, এর পর B দিয়ে, C দিয়ে ... এভাবে) কিন্তু ArrayList এর মধ্যে sort করার কোনো মেথড নাই,
ArrayList ই কিন্তু কালেকশনের একমাত্র কালেকশনের অবজেক্ট না, আপনি খুজছেন যে sort করার মত কিছু আছে নাকি কালেকশন ইন্টারফেসের মধ্যে, তখন আপনি TreeSet নামক ক্লাসের সন্ধান পাবেন
TreeSet:- ইনপুট যেভাবেই দেন ,প্রিন্ট করার সময় সর্ট করেই আউটপুট দিবে, আর ডুপ্লিকেট ভ্যালু নিবে না।
LinkedList:- ভ্যালু add, remove, নির্দিষ্ট কোনো ইনডেক্সে ভ্যালু add এগুলা efficiently করে।
HashMap:- ক্লাসে যেমন আপনার রোল ধরে ডাকলে আপনি “ইয়েস স্যার” বলে চিল্লাইতেন এটাও এমন, ভ্যালু এর সাথে এক্সট্রা একটা key ভ্যালু নিবে, key ধরে ডাক দিবেন ভ্যালু দিয়ে দিবে।
HashSet:- ডুপ্লিকেট ভ্যালু নিবে না, ভ্যালু জলদি খুজে দিবে।
LinkedHashMap:- এটা HashMap এর মতোই , কিন্তু ভিতরের কনফিগারেশন LinkedList এর মতো।
ও হ্যাঁ, উপরের ArrayList কে sort করার জন্য Collections.sort(ar); লাইনটা লিখে দিলেই সর্ট হয়ে যাবে ।
পরের পোষ্ট গুলাই টপিক ওয়াইজ এগুলা জানার চেষ্টা করব ইনশাআল্লাহ ।
ছবিঃ javatpoint
Comments
Post a Comment