CodeGym /Java Blog /এলোমেলো /জাভা অ্যারেলিস্ট
John Squirrels
লেভেল 41
San Francisco

জাভা অ্যারেলিস্ট

এলোমেলো দলে প্রকাশিত
ওহে! পূর্ববর্তী পাঠে, আমরা অ্যারেগুলিতে গভীরভাবে ডুব দিয়েছি এবং অ্যারেগুলির সাথে কাজ করার সাধারণ উদাহরণগুলি পর্যালোচনা করেছি। এই পাঠে, আমরা জাভা অ্যারেলিস্টে একটি ঘনিষ্ঠ পর্যালোচনা করব। সাধারণভাবে, অ্যারেগুলি খুব সহজ। এবং, আপনি ইতিমধ্যেই লক্ষ্য করেছেন, আপনি তাদের সাথে অনেক কিছু করতে পারেন :) কিন্তু অ্যারেগুলির অনেকগুলি ত্রুটি রয়েছে।
  • সীমিত আকার। আপনি এটি তৈরি করার সময় আপনার অ্যারেতে কতগুলি উপাদান থাকতে হবে তা আপনাকে জানতে হবে। আপনি যদি অবমূল্যায়ন করেন, তাহলে আপনার কাছে পর্যাপ্ত স্থান থাকবে না। অত্যধিক মূল্যায়ন করুন, এবং অ্যারেটি অর্ধ-খালি থাকবে, যা খারাপও। সর্বোপরি, আপনি এখনও প্রয়োজনের চেয়ে বেশি মেমরি বরাদ্দ করছেন।

  • একটি অ্যারের উপাদান যোগ করার পদ্ধতি নেই। যেখানে আপনি একটি উপাদান যোগ করতে চান সেই অবস্থানের সূচীটি আপনাকে সর্বদা স্পষ্টভাবে নির্দেশ করতে হবে। আপনি যদি ভুলবশত আপনার প্রয়োজনীয় কিছু মান দ্বারা দখল করা একটি অবস্থানের জন্য সূচকটি নির্দিষ্ট করেন তবে এটি ওভাররাইট করা হবে।

  • একটি আইটেম মুছে ফেলার কোন পদ্ধতি নেই. একটি মান শুধুমাত্র "শূন্য আউট" হতে পারে।

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");

       cats[1] = null;

      
      
       System.out.println(Arrays.toString(cats));
   }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
আউটপুট: [Cat{name='Thomas'}, null, Cat{name='Lionel Messi'}] সৌভাগ্যবশত, Java এর নির্মাতারা অ্যারের সুবিধা এবং অসুবিধাগুলি সম্পর্কে ভাল জানেন, এবং তাই Java ArrayList নামে একটি খুব আকর্ষণীয় ডেটা কাঠামো তৈরি করেছেন । যতটা সম্ভব সহজভাবে বলতে গেলে, একটি জাভা অ্যারেলিস্ট হল একটি "স্যুপড আপ" অ্যারে যাতে প্রচুর নতুন বৈশিষ্ট্য রয়েছে।

কিভাবে একটি ArrayList তৈরি করবেন

এটি তৈরি করা খুব সহজ:

ArrayList<Cat> cats = new ArrayList<Cat>();
এখন আমরা Cat অবজেক্ট সংরক্ষণের জন্য একটি তালিকা তৈরি করেছি। মনে রাখবেন যে আমরা ArrayList এর আকার নির্দিষ্ট করছি না , কারণ এটি স্বয়ংক্রিয়ভাবে প্রসারিত হতে পারে। এটা কিভাবে সম্ভব? এটা বেশ সহজ, আসলে. এটি আপনাকে অবাক করে দিতে পারে, কিন্তু জাভাতে ArrayList একটি খুব সাধারণ অ্যারের উপরে তৈরি করা হয়েছে :) হ্যাঁ, এটিতে একটি অ্যারে রয়েছে এবং এখানেই আমাদের উপাদানগুলি সংরক্ষণ করা হয়। কিন্তু জাভাতে অ্যারেলিস্টের সেই অ্যারের সাথে কাজ করার একটি বিশেষ উপায় রয়েছে:
  • অভ্যন্তরীণ অ্যারে পূর্ণ হলে, ArrayList অভ্যন্তরীণভাবে একটি নতুন অ্যারে তৈরি করে। নতুন অ্যারের সাইজ পুরাতন অ্যারের গুন 1.5 প্লাস 1।

  • সমস্ত ডেটা পুরানো অ্যারে থেকে নতুনটিতে অনুলিপি করা হয়

  • পুরানো অ্যারে আবর্জনা সংগ্রহকারী দ্বারা পরিষ্কার করা হয়।
এই মেকানিজম জাভা অ্যারেলিস্টকে (একটি সাধারণ অ্যারের থেকে ভিন্ন) নতুন উপাদান যোগ করার জন্য একটি পদ্ধতি বাস্তবায়নের অনুমতি দেয়। এটা add()পদ্ধতি

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Behemoth"));
}
তালিকার শেষে নতুন আইটেম যোগ করা হয়. এখন অ্যারে উপচে পড়ার কোন ঝুঁকি নেই, তাই এই পদ্ধতিটি সম্পূর্ণ নিরাপদ। যাইহোক, ArrayList শুধুমাত্র তার সূচী দ্বারা একটি বস্তু খুঁজে পেতে পারে না, কিন্তু এর বিপরীতেও: এটি ArrayList এ একটি বস্তুর সূচী খুঁজে পেতে একটি রেফারেন্স ব্যবহার করতে পারে ! এটি হল indexOf() পদ্ধতির জন্য: আমরা যে বস্তুটি চাই তার একটি রেফারেন্স পাস করি এবং indexOf() তার সূচী প্রদান করে:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
আউটপুট: 0 এটা ঠিক। আমাদের থমাস অবজেক্ট প্রকৃতপক্ষে 0 এলিমেন্টে সংরক্ষিত আছে। অ্যারেগুলির শুধুমাত্র ত্রুটি নেই। তাদের প্রশ্নাতীত সুবিধাও রয়েছে। তাদের মধ্যে একটি সূচক দ্বারা উপাদান অনুসন্ধান করার ক্ষমতা. যেহেতু আমরা একটি সূচী নির্দেশ করি, অর্থাৎ একটি নির্দিষ্ট মেমরি ঠিকানার দিকে, এই পদ্ধতিতে একটি অ্যারে অনুসন্ধান করা খুব দ্রুত। ArrayListএটা কিভাবে করতে জানে! get () পদ্ধতি এটি প্রয়োগ করে:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
আউটপুট: Cat{name='Behemoth'} উপরন্তু, আপনি সহজেই খুঁজে পেতে পারেন যে ArrayList- এ একটি নির্দিষ্ট বস্তু রয়েছে কিনা। এটি ArrayList contains() পদ্ধতি ব্যবহার করে করা হয়:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   cats.remove(fluffy);
   System.out.println(cats.contains(fluffy));
}
পদ্ধতিটি পরীক্ষা করে যে ArrayList এর অভ্যন্তরীণ অ্যারেটিতে উপাদান রয়েছে কিনা এবং একটি বুলিয়ান (সত্য বা মিথ্যা) প্রদান করে। আউটপুট: মিথ্যা এবং সন্নিবেশ সম্পর্কে আরেকটি গুরুত্বপূর্ণ বিষয়। অ্যারেলিস্ট আপনাকে কেবল অ্যারের শেষে নয়, যে কোনও জায়গায় উপাদান সন্নিবেশ করতে একটি সূচক ব্যবহার করতে দেয়। এটির জন্য দুটি পদ্ধতি রয়েছে:
  • ArrayList add(int index, Cat element)
  • অ্যারেলিস্ট সেট (int সূচক, বিড়াল উপাদান)
আর্গুমেন্ট হিসাবে, এই উভয় পদ্ধতিই আপনি যেখানে সন্নিবেশ করতে চান সেই অবস্থানের সূচক এবং বস্তুরই একটি রেফারেন্স নেয়। পার্থক্য হল সেট() ব্যবহার করে সন্নিবেশ করা পুরানো মানকে ওভাররাইট করে। add() ব্যবহার করে সন্নিবেশ করালে প্রথমে একটি করে সমস্ত উপাদান [index] থেকে অ্যারের শেষ পর্যন্ত স্থানান্তরিত হয় এবং তারপরে খালি অবস্থানে নির্দিষ্ট বস্তু যোগ করে।

এখানে একটি উদাহরণ:


public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.set(0, lionel);// Now we have a list of 2 cats. Adding a 3rd using set

   System.out.println(cats.toString());
}
আউটপুট: [[Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, Cat{name='Behemoth'}] আমাদের কাছে ২টি বিড়ালের তালিকা ছিলতারপর আমরা সেট() পদ্ধতি ব্যবহার করে এলিমেন্ট 0 হিসাবে আরেকটি সন্নিবেশ করেছি । ফলস্বরূপ, পুরানো উপাদানটি একটি নতুন দ্বারা প্রতিস্থাপিত হয়েছে।

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.add(0, lionel);// Now we have a list of 2 cats. Adding a 3rd using add

   System.out.println(cats.toString());
}
এবং এখানে আমরা দেখছি যে add() ভিন্নভাবে কাজ করে। এটি সমস্ত উপাদানকে ডানদিকে নিয়ে যায় এবং তারপরে নতুন মানটিকে এলিমেন্ট 0 হিসাবে লেখে। আউটপুট: [Cat{name='Thomas'}, Cat{name='Behemoth'}] [Cat{name='Lionel Messi'}, বিড়াল{name='Thomas'}, Cat{name='Behemoth'}] তালিকাটি সম্পূর্ণরূপে পরিষ্কার করতে, আমরা clear() পদ্ধতি ব্যবহার করি:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   cats.clear();

   System.out.println(cats.toString());
}
আউটপুট: [] তালিকা থেকে সবকিছু মুছে ফেলা হয়েছে। যাইহোক, অনুগ্রহ করে মনে রাখবেন: অ্যারেগুলির বিপরীতে, ArrayList toString() পদ্ধতিকে ওভাররাইড করে এবং ইতিমধ্যেই স্ট্রিং হিসাবে যথাযথভাবে তালিকা প্রদর্শন করে। সাধারণ অ্যারের সাথে, আমাদের এর জন্য অ্যারে ক্লাস ব্যবহার করতে হয়েছিল । এবং যেহেতু আমি Arrays উল্লেখ করেছি: Java আপনাকে একটি অ্যারে এবং একটি ArrayList এর মধ্যে সহজে "সুইচ" করতে দেয় , অর্থাৎ একটিকে অন্যটিতে রূপান্তর করতে। এর জন্য অ্যারে ক্লাসে একটি Arrays.asList() পদ্ধতি রয়েছে আমরা একটি অ্যারে হিসাবে বিষয়বস্তু পেতে এবং আমাদের ArrayList কনস্ট্রাক্টরের কাছে পাঠাতে এটি ব্যবহার করি:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   Cat[] catsArray = {thomas, behemoth, lionel, fluffy};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
আউটপুট: [Cat{name='Thomas'}, Cat{name='Behemoth'}, Cat{name='Lionel Messi'}, Cat{name='Fluffy'}] আপনি বিপরীত দিকেও যেতে পারেন: পান একটি ArrayList অবজেক্ট থেকে একটি অ্যারে। আমরা toArray() পদ্ধতি ব্যবহার করে এটি করি:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   Cat[] catsArray = cats.toArray(new Cat[0]);

   System.out.println(Arrays.toString(catsArray));
}
দ্রষ্টব্য: আমরা toArray() পদ্ধতিতে একটি খালি অ্যারে পাস করেছি । এটি একটি ত্রুটি নয়। ArrayList ক্লাসের অভ্যন্তরে , এই পদ্ধতিটি এমনভাবে প্রয়োগ করা হয় যে একটি খালি অ্যারে পাস করলে এর কর্মক্ষমতা বৃদ্ধি পায়। শুধু ভবিষ্যতের জন্য এটি মনে রাখবেন (অবশ্যই, আপনি কিছু নির্দিষ্ট আকারের অ্যারে পাস করতে পারেন; এটিও কাজ করবে)। ওহ, আকার সম্পর্কে. তালিকার বর্তমান আকার আকার() পদ্ধতি ব্যবহার করে পাওয়া যাবে:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   System.out.println(cats.size());
}
এটি বোঝা গুরুত্বপূর্ণ যে একটি অ্যারের দৈর্ঘ্যের বৈশিষ্ট্যের বিপরীতে, ArrayList.size() পদ্ধতিটি উপাদানের প্রকৃত সংখ্যা প্রদান করে, মূল ক্ষমতা নয়। সর্বোপরি, ArrayList তৈরি করার সময় আমরা একটি আকার নির্দিষ্ট করিনি । যাইহোক, আপনি এটি নির্দিষ্ট করতে পারেন — ArrayList এর একটি উপযুক্ত কনস্ট্রাক্টর আছে। কিন্তু নতুন উপাদান যোগ করার ক্ষেত্রে, এটি তার আচরণ পরিবর্তন করে না:

public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>(2);// create an ArrayList with an initial capacity of 2


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Behemoth");
   Cat lionel = new Cat("Lionel Messi");
   Cat fluffy = new Cat ("Fluffy");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(lionel);
   cats.add(fluffy);

   System.out.println(cats.size());
}
কনসোল আউটপুট: 4 আমরা 2টি উপাদানের একটি তালিকা তৈরি করেছি, কিন্তু যখন আমাদের এটির প্রয়োজন হয় তখন এটি শান্তভাবে প্রসারিত হয়। আরেকটি বিবেচনা হল যে আমরা যদি প্রাথমিকভাবে একটি খুব ছোট তালিকা তৈরি করি তবে এটি আরও প্রায়ই প্রসারিত করতে হবে, যা কিছু সংস্থান ব্যবহার করবে। আমরা খুব কমই এই পাঠে একটি ArrayList থেকে উপাদানগুলি সরানোর প্রক্রিয়াটিকে স্পর্শ করেছি , অবশ্যই, এটি আমাদের মন স্খলিত হওয়ার কারণে নয়। আমরা এই বিষয়টিকে একটি পৃথক পাঠে রেখেছি যা আপনি পরে দেখা করবেন :) আপনি যা শিখেছেন তা আরও শক্তিশালী করার জন্য, আমরা আপনাকে আমাদের জাভা কোর্স থেকে একটি ভিডিও পাঠ দেখার পরামর্শ দিই
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION