CodeGym /جاوا بلاگ /Random-UR /جاوا ویکٹر
John Squirrels
سطح
San Francisco

جاوا ویکٹر

گروپ میں شائع ہوا۔
شاید آپ جاوا میں پہلے ہی صفوں کو دیکھ چکے ہوں گے، اور آپ جانتے ہیں کہ ان کی اہم خامیوں میں سے ایک سائز کی مستقل مزاجی ہے۔ ایک بار جب آپ نے ایک مخصوص سائز کی ایک صف بنا لی ہے، تو آپ اسے بعد میں تبدیل نہیں کر سکتے۔ جاوا زبان میں جاوا کلیکشن فریم ورک کی کئی کلاسیں ہیں جو اس مسئلے کو حل کرتی ہیں۔ ان میں سے ایک جاوا ویکٹر کلاس ہے۔ اس پر اس مضمون میں بحث کی جائے گی۔

ویکٹر کلاس کیا ہے؟

جیسا کہ ہم نے دیباچے میں لکھا ہے، جاوا کلیکشن فریم ورک سے ویکٹر کلاس صفوں کے جامد سائز کے مسئلے کو ختم کرتی ہے۔ جاوا ویکٹر ایک قسم کی متحرک صف ہے اور سائز میں بڑھ سکتی ہے یا سکڑ سکتی ہے۔ ویکٹر کلیکشن کلاس کا استعمال کرتے ہوئے ، ہم عناصر کے ایک گروپ کو سادہ آبجیکٹ کے طور پر ذخیرہ کر سکتے ہیں اور مختلف طریقوں سے ان کو جوڑ سکتے ہیں۔ ویکٹر کلاس java.util پیکیج سے دستیاب ہے۔ اس طرح، جاوا میں ویکٹر استعمال کیا جا سکتا ہے اگر آپ کو پہلے سے سرنی کا سائز معلوم نہ ہو، یا اگر آپ کو کسی "سرنی" کی ضرورت ہو جو پروگرام کی زندگی بھر کے طول و عرض کو تبدیل کر سکے۔ یہ فوری طور پر کہا جانا چاہئے کہ ویکٹر کلاس پہلے سے ہی کافی پرانی ہے، اور بعد میں مجموعے شائع ہوئے جو اس کی زیادہ تر صورتوں میں جگہ لے سکتے ہیں۔ جاوا ویکٹر کا مقبول "ینالاگ" ArrayList کلاس ہے۔ ایک دوسرے سے ان کلاسوں کے درمیان سب سے اہم فرق یہ ہے کہ ویکٹر مطابقت پذیر ہے، جبکہ ArrayList نہیں ہے۔ ہم ان دو کلاسوں کے درمیان دیگر فرقوں اور ویکٹر کلاس کے مزید جدید اینالاگز کے بارے میں تھوڑی دیر بعد سیکشن "ویکٹر کلاس میں کیا خرابی ہے" میں بات کریں گے۔

جاوا ویکٹر کے طریقے

جاوا ویکٹر کے طریقے یہ ہیں:
  • void add(int index, Object element) ویکٹر کی مخصوص پوزیشن پر مخصوص عنصر داخل کرتا ہے۔

  • boolean add(Object o) مخصوص عنصر کو ویکٹر کے آخر میں شامل کرتا ہے۔

  • boolean addAll(Collection c) مخصوص مجموعہ کے تمام عناصر کو ویکٹر کے آخر میں شامل کرتا ہے، اس ترتیب میں کہ وہ مخصوص مجموعہ کے تکرار کرنے والے کے ذریعے واپس کیے جائیں۔

  • boolean addAll(int index, Collection c) مخصوص کلیکشن کے اندر تمام عناصر کو مخصوص پوزیشن پر ویکٹر میں داخل کرتا ہے۔

  • void addElement(Object obj) اس ویکٹر کے آخر میں مخصوص جز کو جوڑتا ہے، اس کے سائز میں ایک اضافہ کرتا ہے۔

  • int capacity() اس ویکٹر کی موجودہ صلاحیت واپس کرتا ہے۔

  • void clear() اس ویکٹر سے تمام عناصر کو ہٹاتا ہے۔

  • آبجیکٹ کلون () اس ویکٹر کا کلون لوٹاتا ہے۔

  • بولین پر مشتمل ہے (آبجیکٹ ایلیم) ٹیسٹ کرتا ہے کہ آیا مخصوص آبجیکٹ اس ویکٹر میں ایک جزو ہے۔

  • boolean containsAll(collection c) درست لوٹاتا ہے اگر ویکٹر میں مخصوص مجموعہ کے تمام عناصر شامل ہوں۔

  • void copyInto(Object[] anArray) اس ویکٹر کے اجزاء کو مخصوص صف میں کاپی کرتا ہے۔

  • آبجیکٹ elementAt(int index) مخصوص انڈیکس پر جز کو لوٹاتا ہے۔

  • گنتی عناصر () اس ویکٹر کے اجزاء کی گنتی لوٹاتا ہے۔

  • void sureCapacity(int minCapacity) اس ویکٹر کی صلاحیت کو بڑھاتا ہے، اگر ضروری ہو، اس بات کو یقینی بنانے کے لیے کہ یہ کم از کم صلاحیت کی دلیل کے ذریعے دیے گئے اجزاء کی تعداد کو رکھ سکتا ہے۔

  • boolean equals (Object 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) مخصوص آبجیکٹ کو بطور جزو اس ویکٹر میں مخصوص انڈیکس میں داخل کرتا ہے۔

  • boolean isEmpty() اس ویکٹر کو لاپتہ اجزاء کے لیے ٹیسٹ کرتا ہے۔

  • آبجیکٹ lastElement() ویکٹر کا آخری جزو لوٹاتا ہے۔

  • int lastIndexOf(Object elem) اس ویکٹر میں مخصوص آبجیکٹ کی آخری موجودگی کا انڈیکس لوٹاتا ہے۔

  • int lastIndexOf(Object elem, int index) مخصوص آبجیکٹ کے لیے پیچھے کی طرف تلاش کرتا ہے، مخصوص انڈیکس سے شروع ہوتا ہے، اور اس پر انڈیکس واپس کرتا ہے۔

  • آبجیکٹ ہٹانا(int index) عنصر کو اس ویکٹر میں مخصوص پوزیشن پر ہٹاتا ہے۔

  • boolean remove(Object o) اس ویکٹر میں مخصوص عنصر کی پہلی موجودگی کو ہٹاتا ہے۔ اگر ویکٹر میں عنصر شامل نہیں ہے، تو یہ تبدیل نہیں ہوتا ہے۔

  • boolean removeAll(collection c) ویکٹر سے تمام عناصر کو ہٹاتا ہے جو مخصوص مجموعہ میں موجود ہیں۔

  • void removeAllElements() ویکٹر سے تمام اجزاء کو ہٹاتا ہے اور اس کا سائز صفر پر سیٹ کرتا ہے۔

  • boolean removeElement(Object obj) اس ویکٹر سے دلیل کی پہلی (کم ترین انڈیکس) موجودگی کو ہٹاتا ہے۔

  • void removeElementAt (int index) انڈیکس پر ایک عنصر کو ہٹاتا ہے۔

  • محفوظ شدہ باطل ہٹانے کی حد (Index fromIndex, int toIndex) اس فہرست سے ان تمام عناصر کو ہٹاتی ہے جن کا انڈیکس fromIndex، inclusive، اور toIndex کے درمیان ہے، خصوصی طور پر۔

  • boolean retainAll(collection c) صرف ویکٹر میں موجود عناصر کو برقرار رکھتا ہے جو مخصوص مجموعہ میں موجود ہیں۔

  • آبجیکٹ سیٹ (انٹ انڈیکس، آبجیکٹ عنصر) اس ویکٹر میں مخصوص پوزیشن پر عنصر کو مخصوص عنصر سے بدل دیتا ہے۔

  • void setElementAt(Object obj, int index) اس ویکٹر کے مخصوص انڈیکس پر جزو کو بطور دی گئی آبجیکٹ سیٹ کرتا ہے۔

  • void setSize(int newSize) اس ویکٹر کا سائز سیٹ کرتا ہے۔

  • int size() اس ویکٹر میں اجزاء کی تعداد لوٹاتا ہے۔

  • فہرست ذیلی فہرست (Index fromIndex, int toIndex) اس فہرست کے حصے کی نمائندگی (منظر) کو fromIndex، inclusive، اور toIndex کے درمیان خصوصی طور پر لوٹاتی ہے۔

  • Object[] toArray() صحیح ترتیب میں اس ویکٹر کے تمام عناصر پر مشتمل ایک صف واپس کرتا ہے۔

  • آبجیکٹ[] toArray(Object[] a) درست ترتیب میں اس ویکٹر کے تمام عناصر پر مشتمل ایک صف واپس کرتا ہے۔ واپس کی گئی سرنی کی عملدرآمد کی قسم مخصوص صف کی قسم ہے۔

  • String 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 کو استعمال کرنے کی سفارش کی جاتی ہے (کولیکشن فریم ورک زیادہ موثر شریک)۔ آئیے اوپر کی مثال کو تھوڑا سا تبدیل کرتے ہیں، Vector کی بجائے 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 Vector سے بہتر ہے ۔ اس کے لیے تھریڈز کے بارے میں مزید معلومات درکار ہیں۔ ہم یہاں وجوہات کی فہرست دیتے ہیں۔ سب سے پہلے، اگرچہ ویکٹر کلاس مطابقت پذیر ہے، اسے مکمل طور پر تھریڈ سیف نہیں کہا جا سکتا، حالانکہ یہ عجیب لگتا ہے۔ حقیقت یہ ہے کہ ویکٹر ہر آپریشن کو ہم آہنگ کرتا ہے، نہ کہ پوری ویکٹر مثال کے طور پر۔ یہ ان پروگراموں میں ایک مسئلہ ہو سکتا ہے جہاں آپ کو انفرادی کارروائیوں کے بجائے آپریشن کے پورے سیٹ کو سنکرونائز کرنے کی ضرورت ہوتی ہے۔ کہیں، اگر ایک تھریڈ کسی ویکٹر پر اعادہ کر رہا ہے اور دوسرا تھریڈ ساختی طور پر ویکٹر کی مثال میں ترمیم کر رہا ہے، تو تکرار کنندہ ایک پھینک دے گا ConcurrentModificationException ۔ اس سے پتہ چلتا ہے کہ دو تھریڈز ایک ہی وقت میں ویکٹر مثال کے ساتھ کام کر سکتے ہیں اگر وہ مختلف آپریشنز کرتے ہیں۔ دوم، ویکٹر کلاس میں بہترین کارکردگی نہیں ہے کیونکہ اس کے آبجیکٹ میں قابل سائز صف اور ہم آہنگی ہے۔ اس امتزاج کا مطلب ہے بلاکنگ آپریشنز کے لیے اضافی اوور ہیڈ، چاہے ہم وقت سازی کی ضرورت ہو یا نہ ہو۔ یقینا، یہ کارکردگی کو متاثر کرتا ہے۔ اس کے علاوہ، ہر آپریشن پر ویکٹر کو سنکرونائز کرنا بھی کارکردگی پر منفی اثر ڈالتا ہے، کیونکہ ہم ہر آپریشن کے لیے بار بار ایک لاک حاصل کریں گے۔ اگر کلاس کی پوری مثال کو ہم آہنگ کیا جاتا ہے، تو تالا بھی ایک بار حاصل کیا جائے گا، جو بہت زیادہ موثر ہے۔ سوم، ویکٹر کچھ میراثی طریقوں کی حمایت کرتا ہے۔ مثال کے طور پر عناصر() ۔ یہ طریقہ ویکٹر کے اجزاء کی گنتی لوٹاتا ہے۔ پروگرامرز اکثر اوقات شمار کرنے کے لیے Iterator یا ListIterator کا استعمال کرتے ہیں، اور کئی وجوہات کی بنا پر۔ خاص طور پر، شمار میں ہٹانے () طریقہ کی وضاحت نہیں کی گئی ہے، جس کا مطلب ہے کہ فہرست کو تکرار کے دوران ساختی طور پر تبدیل نہیں کیا جا سکتا۔ اس کے علاوہ، ListIterator کے برعکس، Enumeration دو طرفہ رسائی کی پیشکش نہیں کرتا ہے۔ جیسا کہ آپ دیکھ سکتے ہیں، ویکٹر میں کافی مسائل ہیں۔ اگر آپ کو ابھی بھی فہرست انٹرفیس کے تھریڈ سیف نفاذ کی ضرورت ہو تو کیا ہوگا؟ اس صورت میں، ArrayList مدد نہیں کرے گا، لیکن آپ استعمال کر سکتے ہیں، مثال کے طور پر، CopyOnWriteArrayList کلاس Vector کے بجائے ؛ اسے ArrayList کے تھریڈ سیف ویرینٹ کے طور پر رکھا گیا ہے ۔ آپ مجموعے کا استعمال کرتے ہوئے ArrayList کو بھی سنکرونائز کر سکتے ہیں۔synchronizedList() طریقہ۔

ویکٹر میں واقعی کچھ مسائل ہیں... یہ اب بھی جاوا میں کیوں ہے اور اسے کیوں پڑھایا جانا چاہیے؟

سوال یہ پیدا ہوتا ہے کہ ہم ویکٹر کلاس کو کیوں پڑھ رہے ہیں؟ اور اسے ابھی تک جاوا سے کیوں نہیں ہٹایا گیا؟ حقیقت یہ ہے کہ جاوا پسماندہ مطابقت کے اصول کا دعویٰ کرتا ہے۔ اس کا مطلب یہ ہے کہ کئی سال پہلے لکھے گئے تمام پرانے کوڈ جاوا کے جدید ورژن کے ذریعے سمجھے جائیں گے۔ اس کے علاوہ، جاوا ماحول میں انٹرپرائز لیول کی بہت سی ایپلی کیشنز ہیں جو کئی دہائیوں سے سپورٹ کر رہی ہیں۔ یہ بہت ممکن ہے کہ آپ کو اپنے کام میں ایسے "ڈائیناسور" سے نمٹنا پڑے، اس لیے آپ کو حیرت کے لیے تیار رہنا ہوگا، جیسا کہ غیر موثر میراثی کلاسوں کے ساتھ کوڈ۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION