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

জাভা ভেক্টর

এলোমেলো দলে প্রকাশিত
সম্ভবত আপনি ইতিমধ্যে জাভাতে অ্যারে জুড়ে এসেছেন, এবং আপনি জানেন যে তাদের প্রধান ত্রুটিগুলির মধ্যে একটি হল আকারের স্থায়িত্ব। একবার আপনি একটি নির্দিষ্ট আকারের একটি অ্যারে তৈরি করলে, আপনি পরে এটি পরিবর্তন করতে পারবেন না। জাভা ভাষায় বেশ কয়েকটি জাভা কালেকশন ফ্রেমওয়ার্ক ক্লাস রয়েছে যা এই সমস্যার সমাধান করে। তার মধ্যে একটি হল জাভা ভেক্টর ক্লাস। এটি এই নিবন্ধে আলোচনা করা হবে.

ভেক্টর ক্লাস কি

আমরা যেমন ভূমিকায় লিখেছি, জাভা কালেকশন ফ্রেমওয়ার্কের ভেক্টর ক্লাস অ্যারের স্ট্যাটিক সাইজের সমস্যা দূর করে। জাভা ভেক্টর হল এক ধরনের ডাইনামিক অ্যারে এবং আকারে বড় বা সঙ্কুচিত হতে পারে। ভেক্টর সংগ্রহের ক্লাস ব্যবহার করে , আমরা উপাদানগুলির একটি গ্রুপকে সাধারণ বস্তু হিসাবে সংরক্ষণ করতে পারি এবং বিভিন্ন পদ্ধতির মাধ্যমে তাদের পরিচালনা করতে পারি। ভেক্টর ক্লাস java.util প্যাকেজ থেকে পাওয়া যায়। সুতরাং, জাভাতে ভেক্টর ব্যবহার করা যেতে পারে যদি আপনি আগে থেকে অ্যারের আকার জানেন না, বা আপনার যদি এমন একটি "অ্যারে" প্রয়োজন হয় যা প্রোগ্রামের জীবনকাল ধরে মাত্রা পরিবর্তন করতে পারে। এটা অবিলম্বে বলা আবশ্যক যে ভেক্টরক্লাস ইতিমধ্যে বেশ পুরানো, এবং পরবর্তী সংগ্রহগুলি উপস্থিত হয়েছিল যা বেশিরভাগ ক্ষেত্রে এটি প্রতিস্থাপন করতে পারে। জাভা ভেক্টরের জনপ্রিয় "অ্যানালগ" হল ArrayList ক্লাস। একে অপরের থেকে এই শ্রেণীর মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য হল ভেক্টর সিঙ্ক্রোনাইজ করা হয়, যখন ArrayList নয়। আমরা এই দুটি শ্রেণীর মধ্যে অন্যান্য পার্থক্য এবং ভেক্টর শ্রেণীর আরও আধুনিক অ্যানালগ সম্পর্কে একটু পরে "ভেক্টর শ্রেণীর সাথে কী সমস্যা" বিভাগে কথা বলব ।

জাভা ভেক্টর পদ্ধতি

এখানে জাভা ভেক্টর পদ্ধতি আছে:
  • void add(int index, Object element) ভেক্টরের নির্দিষ্ট অবস্থানে নির্দিষ্ট উপাদান সন্নিবেশ করায়।

  • বুলিয়ান অ্যাড(অবজেক্ট o) ভেক্টরের শেষে নির্দিষ্ট উপাদান যোগ করে।

  • বুলিয়ান অ্যাডঅল(সংগ্রহ গ) নির্দিষ্ট সংগ্রহের সমস্ত উপাদানকে ভেক্টরের শেষে যোগ করে, যাতে নির্দিষ্ট সংগ্রহের পুনরাবৃত্তিকারী দ্বারা সেগুলি ফেরত দেওয়া হয়।

  • বুলিয়ান addAll(int index, Collection c) নির্দিষ্ট কালেকশনের মধ্যে সমস্ত উপাদানকে নির্দিষ্ট অবস্থানে ভেক্টরে সন্নিবেশ করায়।

  • void addElement(Object obj) এই ভেক্টরের শেষে নির্দিষ্ট কম্পোনেন্ট যোগ করে, এর আকার এক করে বাড়িয়ে দেয়।

  • int capacity() এই ভেক্টরের বর্তমান ক্ষমতা প্রদান করে।

  • void clear() এই ভেক্টর থেকে সমস্ত উপাদান সরিয়ে দেয়।

  • অবজেক্ট ক্লোন() এই ভেক্টরের একটি ক্লোন প্রদান করে।

  • বুলিয়ান ধারণ করে (বস্তু উপাদান) পরীক্ষা করে যে নির্দিষ্ট বস্তুটি এই ভেক্টরের একটি উপাদান কিনা।

  • বুলিয়ান containsAll(সংগ্রহ গ) সত্য প্রদান করে যদি ভেক্টরে নির্দিষ্ট সংগ্রহের সমস্ত উপাদান থাকে।

  • void copyInto(Object[] anArray) এই ভেক্টরের উপাদানগুলিকে নির্দিষ্ট অ্যারেতে কপি করে।

  • অবজেক্ট elementAt(int index) নির্দিষ্ট সূচকে উপাদান প্রদান করে।

  • গণনা উপাদান() এই ভেক্টরের উপাদানগুলির একটি গণনা প্রদান করে।

  • void sureCapacity(int minCapacity) এই ভেক্টরের ক্ষমতা বাড়ায়, যদি প্রয়োজন হয়, এটি নিশ্চিত করতে যে এটি ন্যূনতম ক্ষমতা যুক্তি দ্বারা প্রদত্ত উপাদানের সংখ্যা ধারণ করতে পারে।

  • বুলিয়ান সমান (অবজেক্ট o) এই ভেক্টরের সাথে নির্দিষ্ট বস্তুর তুলনা করে।

  • অবজেক্ট firstElement() এই ভেক্টরের প্রথম উপাদান (ইনডেক্স 0 এ উপাদান) প্রদান করে।

  • অবজেক্ট get(int index) এই ভেক্টরের নির্দিষ্ট অবস্থানে উপাদান প্রদান করে।

  • int hashCode() এই ভেক্টরের জন্য হ্যাশ কোড মান প্রদান করে।

  • int indexOf(Object elem) প্রদত্ত আর্গুমেন্টের প্রথম ঘটনার জন্য অনুসন্ধান করে, সমান পদ্ধতি ব্যবহার করে সমতার জন্য পরীক্ষা করে।

  • int indexOf(Object elem, int index) প্রদত্ত আর্গুমেন্টের প্রথম উপস্থিতির জন্য অনুসন্ধান করে, index থেকে শুরু করে, এবং equals পদ্ধতি ব্যবহার করে সমতার জন্য পরীক্ষা করে।

  • void insertElementAt(Object obj, int index) নির্দিষ্ট সূচকে এই ভেক্টরের মধ্যে একটি উপাদান হিসাবে নির্দিষ্ট বস্তু সন্নিবেশ করায়।

  • বুলিয়ান isEmpty() অনুপস্থিত উপাদানগুলির জন্য এই ভেক্টর পরীক্ষা করে।

  • অবজেক্ট lastElement() ভেক্টরের শেষ উপাদান প্রদান করে।

  • int lastIndexOf(Object elem) এই ভেক্টরে নির্দিষ্ট বস্তুর শেষ ঘটনার সূচী প্রদান করে।

  • int lastIndexOf(Object elem, int index) নির্দিষ্ট সূচী থেকে শুরু করে নির্দিষ্ট বস্তুর জন্য পিছনের দিকে অনুসন্ধান করে এবং এটিতে সূচী ফেরত দেয়।

  • অবজেক্ট রিমুভ (int index) এই ভেক্টরের নির্দিষ্ট অবস্থানে উপাদানটিকে সরিয়ে দেয়।

  • বুলিয়ান রিমুভ (অবজেক্ট o) এই ভেক্টরের নির্দিষ্ট উপাদানটির প্রথম উপস্থিতি সরিয়ে দেয়। যদি ভেক্টরে একটি উপাদান না থাকে তবে এটি পরিবর্তন হয় না।

  • বুলিয়ান রিমুভঅল(সংগ্রহ গ) নির্দিষ্ট সংগ্রহে থাকা ভেক্টর থেকে সমস্ত উপাদান সরিয়ে দেয়।

  • void removeAllElements() ভেক্টর থেকে সমস্ত উপাদান সরিয়ে দেয় এবং এর আকার শূন্যে সেট করে।

  • বুলিয়ান রিমুভ এলিমেন্ট (অবজেক্ট অবজেক্ট) এই ভেক্টর থেকে আর্গুমেন্টের প্রথম (সর্বনিম্ন সূচক) উপস্থিতি সরিয়ে দেয়।

  • void removeElementAt(int index) সূচকে একটি উপাদান সরিয়ে দেয়।

  • সুরক্ষিত অকার্যকর রিমুভ রেঞ্জ(Index থেকে int, int toIndex) এই তালিকা থেকে এমন সমস্ত উপাদান সরিয়ে দেয় যার সূচী index, inclusive এবং toIndex এর মধ্যে একচেটিয়াভাবে।

  • বুলিয়ান রিটেনঅল(সংগ্রহ গ) শুধুমাত্র ভেক্টরের উপাদানগুলিকে ধরে রাখে যা নির্দিষ্ট সংগ্রহে রয়েছে।

  • অবজেক্ট সেট(int index, Object element) এই ভেক্টরের নির্দিষ্ট অবস্থানে থাকা উপাদানটিকে নির্দিষ্ট এলিমেন্ট দিয়ে প্রতিস্থাপন করে।

  • void setElementAt(Object obj, int index) এই ভেক্টরের নির্দিষ্ট সূচকে কম্পোনেন্টটিকে প্রদত্ত অবজেক্ট হিসেবে সেট করে।

  • void setSize(int newSize) এই ভেক্টরের আকার সেট করে।

  • int size() এই ভেক্টরের উপাদানের সংখ্যা প্রদান করে।

  • তালিকা সাবলিস্ট (ইনডেক্স থেকে int, int toIndex) একচেটিয়াভাবে fromIndex, index এবং toIndex এর মধ্যে এই তালিকার অংশের একটি উপস্থাপনা (দর্শন) প্রদান করে।

  • Object[] toArray() সঠিক ক্রমে এই ভেক্টরের সমস্ত উপাদান সম্বলিত একটি অ্যারে প্রদান করে।

  • Object[] toArray(Object[] a) সঠিক ক্রমে এই ভেক্টরের সমস্ত উপাদান সম্বলিত একটি অ্যারে প্রদান করে; রিটার্ন করা অ্যারের এক্সিকিউশন টাইপ হল নির্দিষ্ট অ্যারের টাইপ।

  • স্ট্রিং toString() এই ভেক্টরের একটি স্ট্রিং উপস্থাপনা প্রদান করে যাতে প্রতিটি উপাদানের একটি স্ট্রিং উপস্থাপনা থাকে।

  • void trimToSize() এই ভেক্টরের ক্ষমতাকে ভেক্টরের বর্তমান আকারে ছাঁটাই করে।

জাভা ভেক্টর উদাহরণ


import java.util.Vector;

public class VectorExample {

   public static void main(String[] args) {
       Vector vector = new Vector();
       System.out.println("the size of the empty vector = " +  vector.size());
       //adding some vector elements
       vector.add("Johnny");
       vector.add("Ivy");
       vector.add("Ricky");
       System.out.println(vector); 
       
       //adding more vector elements       
       vector.add("Johnny");
       vector.add("Paul");
       System.out.println(vector);
       System.out.println("the size of the vector = " +  vector.size());
       System.out.println("the first element of the vector = " + vector.firstElement());

       //here the program will print out the first appearance of "Johnny" element
       System.out.println(vector.indexOf("Johnny"));
       //program will print out the first appearance of "Johnny" element starting from the element 1
       System.out.println(vector.indexOf("Johnny", 1));
       vector.clear(); //deleting all vector elements
       System.out.println("the size of the vector after clear method = " +  vector.size());

   }
}
এই প্রোগ্রামের আউটপুট এখানে নিচে:
খালি ভেক্টরের আকার = 0 [জনি, আইভি, রিকি] [জনি, আইভি, রিকি, জনি, পল] ভেক্টরের আকার = 5 ভেক্টরের প্রথম উপাদান = জনি 0 3 পরিষ্কার হওয়ার পরে ভেক্টরের আকার পদ্ধতি = 0

ভেক্টর ক্লাসের সাথে ভুল কি?

জাভা ভেক্টর ক্লাসের ডকুমেন্টেশন অনুসারে , আপনার প্রোগ্রামে থ্রেড-সেফ ইমপ্লিমেন্টেশনের প্রয়োজন না হলে, ভেক্টর (সংগ্রহ ফ্রেমওয়ার্ক আরও কার্যকর অংশগ্রহণকারী) এর জায়গায় অ্যারেলিস্ট ব্যবহার করার পরামর্শ দেওয়া হয়। ভেক্টরের পরিবর্তে ArrayList ক্লাস ব্যবহার করে উপরের উদাহরণটি একটু পরিবর্তন করা যাক ।

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {

       public static void main(String[] args) {
           List vector = new ArrayList();
           //Vector vector = new Vector();
           System.out.println("the size of the empty vector = " +  vector.size());
           vector.add("Johnny");
           vector.add("Ivy");
           vector.add("Ricky");
           System.out.println(vector);
           vector.add("Johnny");
           vector.add("Paul");
           System.out.println(vector);
           System.out.println("the size of the vector = " +  vector.size());
           //System.out.println("the first element of the vector = " + vector.firstElement());

           //here the program will print out the first appearance of "Johnny" element
           System.out.println(vector.indexOf("Johnny"));
           //program will print out the first appearance of "Johnny" element starting from the element 1
           //System.out.println(vector.indexOf("Johnny", 1));
           vector.clear();
           System.out.println("the size of the vector after clear method = " +  vector.size());

       }
   }
আমরা vector.indexOf("Johnny", 1) দিয়ে লাইনটি মন্তব্য করেছি , কারণ ArrayList ক্লাসে এই বৈচিত্রের ক্ষেত্রে এমন কোনো পদ্ধতি নেই । একই কারণে, vector.firstElement() লাইনটি মন্তব্য করা হয়েছে। অন্যান্য সমস্ত ক্ষেত্রে, প্রোগ্রামটি প্রথমটির মতো একই ফলাফল তৈরি করে। অবশ্যই, এই ধরনের উদাহরণে, কেন ArrayList ভেক্টরের চেয়ে ভাল তা স্পষ্ট নয় । এটি সম্পর্কে আরও জ্ঞান প্রয়োজন, বলুন, থ্রেড. আমরা এখানে কারণ তালিকাভুক্ত. প্রথমত, যদিও ভেক্টর ক্লাসটি সিঙ্ক্রোনাইজ করা হয়েছে, এটিকে সম্পূর্ণরূপে থ্রেড-নিরাপদ বলা যাবে না, যদিও এটি অদ্ভুত বলে মনে হচ্ছে। আসল বিষয়টি হল ভেক্টর প্রতিটি অপারেশনকে সিঙ্ক্রোনাইজ করে, সম্পূর্ণ ভেক্টর নয়উদাহরণ নিজেই। এটি এমন প্রোগ্রামগুলিতে একটি সমস্যা হতে পারে যেখানে আপনাকে পৃথক অপারেশনের পরিবর্তে অপারেশনগুলির সম্পূর্ণ সেট সিঙ্ক্রোনাইজ করতে হবে। বলুন, যদি একটি থ্রেড একটি ভেক্টরের উপর পুনরাবৃত্তি করে এবং অন্য একটি থ্রেড ভেক্টরের একটি উদাহরণকে কাঠামোগতভাবে পরিবর্তন করে, তাহলে পুনরাবৃত্তিকারী একটি ConcurrentModificationException নিক্ষেপ করবে । দেখা যাচ্ছে যে দুটি থ্রেড একই সময়ে একটি ভেক্টর ইনস্ট্যান্সের সাথে কাজ করতে পারে যদি তারা বিভিন্ন অপারেশন করে। দ্বিতীয়ত, ভেক্টরক্লাসের সর্বোত্তম কর্মক্ষমতা নেই কারণ এর অবজেক্টগুলির একটি পরিবর্তনযোগ্য অ্যারে এবং সিঙ্ক্রোনাইজেশন রয়েছে। এই সংমিশ্রণের অর্থ হল ব্লকিং অপারেশনের জন্য অতিরিক্ত ওভারহেড, সিঙ্ক্রোনাইজেশন প্রয়োজন বা না হোক। অবশ্যই, এটি কর্মক্ষমতা প্রভাবিত করে। উপরন্তু, প্রতিটি অপারেশনে ভেক্টর সিঙ্ক্রোনাইজ করা কর্মক্ষমতার উপর নেতিবাচক প্রভাব ফেলে, যেহেতু আমরা প্রতিটি অপারেশনের জন্য বারবার একটি লক অর্জন করব। যদি ক্লাসের পুরো উদাহরণটি সিঙ্ক্রোনাইজ করা হয়, তাহলে লকটিও একবার অর্জিত হবে, যা অনেক বেশি কার্যকর। তৃতীয়ত, ভেক্টর কিছু উত্তরাধিকার পদ্ধতি সমর্থন করে। উদাহরণস্বরূপ উপাদান(). এই পদ্ধতিটি ভেক্টরের উপাদানগুলির একটি গণনা প্রদান করে। প্রোগ্রামাররা প্রায়শই ইটারেটার বা লিস্টআইটারেটর ব্যবহার করে গণনার জন্য এবং বিভিন্ন কারণে। বিশেষ করে, গণনার একটি রিমুভ() পদ্ধতি সংজ্ঞায়িত নেই , যার অর্থ হল পুনরাবৃত্তির সময় তালিকাটি কাঠামোগতভাবে পরিবর্তন করা যাবে না। এছাড়াও, ListIterator এর বিপরীতে, গণনা দ্বিমুখী অ্যাক্সেস অফার করে না। আপনি দেখতে পাচ্ছেন, ভেক্টরের বেশ কয়েকটি সমস্যা রয়েছে। আপনার যদি এখনও তালিকা ইন্টারফেসের একটি থ্রেড-নিরাপদ বাস্তবায়নের প্রয়োজন হয়? এই ক্ষেত্রে, ArrayList সাহায্য করবে না, তবে আপনি ব্যবহার করতে পারেন, উদাহরণস্বরূপ, ভেক্টরের পরিবর্তে CopyOnWriteArrayList ক্লাস ; এটি ArrayList- এর একটি থ্রেড-সেফ বৈকল্পিক হিসেবে অবস্থান করছে. আপনি ArrayList Collections synchronizedList() পদ্ধতি ব্যবহার করে সিঙ্ক্রোনাইজ করতে পারেন।

ভেক্টরের সত্যিই কিছু সমস্যা আছে... কেন এটি এখনও জাভাতে রয়েছে এবং কেন এটি শেখানো উচিত?

প্রশ্ন উঠছে: কেন আমরা ভেক্টর ক্লাস অধ্যয়ন করছি? এবং কেন এটি এখনও জাভা থেকে সরানো হয়নি? আসল বিষয়টি হ'ল জাভা পশ্চাদপদ সামঞ্জস্যের নীতিটি স্বীকার করে। এর মানে হল যে অনেক বছর আগে লেখা সমস্ত পুরানো কোড জাভার আধুনিক সংস্করণ দ্বারা বোঝা যাবে। এছাড়াও, জাভা পরিবেশে বেশ কয়েকটি এন্টারপ্রাইজ-স্তরের অ্যাপ্লিকেশন রয়েছে যা কয়েক দশক ধরে সমর্থিত। এটা খুবই সম্ভব যে আপনাকে আপনার কাজে এই ধরনের একটি "ডাইনোসর" মোকাবেলা করতে হবে, তাই আপনাকে বিস্ময়ের জন্য প্রস্তুত থাকতে হবে, যেমন অকার্যকর উত্তরাধিকার ক্লাস সহ কোড।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION