CodeGym /وبلاگ جاوا /Random-FA /وکتور جاوا
John Squirrels
مرحله
San Francisco

وکتور جاوا

در گروه منتشر شد
احتمالاً قبلاً با آرایه‌هایی در جاوا برخورد کرده‌اید و می‌دانید که یکی از اشکالات اصلی آنها ثابت بودن اندازه است. هنگامی که یک آرایه با اندازه مشخصی ایجاد کردید، بعداً نمی توانید آن را تغییر دهید. چندین کلاس چارچوب Java Collection در زبان جاوا وجود دارد که این مشکل را حل می کند. یکی از آنها کلاس وکتور جاوا است. در این مقاله مورد بحث قرار خواهد گرفت.

کلاس وکتور چیست

همانطور که در مقدمه نوشتیم، کلاس Vector از Java Collection Framework مشکل اندازه استاتیک آرایه ها را برطرف می کند. جاوا وکتور نوعی آرایه پویا است و می تواند از نظر اندازه بزرگ یا کوچک شود. با استفاده از کلاس Vector collection، می‌توانیم گروهی از عناصر را به‌عنوان اشیاء ساده ذخیره کنیم و از طریق روش‌های مختلف آن‌ها را دستکاری کنیم. کلاس Vector از بسته java.util در دسترس است . بنابراین، اگر از قبل اندازه آرایه را نمی‌دانید، یا اگر به «آرایه‌ای» نیاز دارید که بتواند ابعاد آن را در طول عمر برنامه تغییر دهد، می‌توان از Vector در جاوا استفاده کرد. فوراً باید گفت که کلاس Vector در حال حاضر کاملاً قدیمی است و مجموعه های بعدی ظاهر شدند که می توانند در اکثر موارد جایگزین آن شوند. "آنالوگ" محبوب جاوا وکتور کلاس ArrayList است . مهم ترین تفاوت این کلاس ها با یکدیگر این است که Vector هماهنگ است، در حالی که ArrayList اینطور نیست. در مورد تفاوت های دیگر بین این دو کلاس و آنالوگ های مدرن تر کلاس Vector کمی بعد در بخش "کلاس Vector چه مشکلی دارد" صحبت خواهیم کرد .

روش های بردار جاوا

در اینجا روش های برداری جاوا آمده است :
  • 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 ظرفیت فعلی این بردار را برمی گرداند.

  • void clear() تمام عناصر را از این بردار حذف می کند.

  • Object clone() یک کلون از این بردار را برمی گرداند.

  • بولین حاوی(Object elem) تست می کند که آیا شی مشخص شده جزء این بردار است یا خیر.

  • اگر بردار حاوی تمام عناصر مجموعه مشخص شده باشد، boolean containAll(Collection c) true برمی گرداند.

  • void copyInto(Object[] anArray) اجزای این بردار را در آرایه مشخص شده کپی می کند.

  • Object elementAt(int index) مولفه را در ایندکس مشخص شده برمی گرداند.

  • Enumeration element() تعدادی از اجزای این بردار را برمی گرداند.

  • void sureCapacity (int minCapacity) ظرفیت این بردار را در صورت لزوم افزایش می دهد تا اطمینان حاصل شود که حداقل تعداد مؤلفه های ارائه شده توسط آرگومان حداقل ظرفیت را در خود نگه می دارد.

  • بولین برابر (Object o) شی مشخص شده را با این بردار مقایسه می کند.

  • شی firstElement() اولین جزء (عنصر در شاخص 0) این بردار را برمی گرداند.

  • Object get(int index) عنصر را در موقعیت مشخص شده در این بردار برمی گرداند.

  • int hashCode() مقدار کد هش را برای این بردار برمی گرداند.

  • int indexOf(Object elem) اولین رخداد آرگومان داده شده را جستجو می کند و برابری را با استفاده از روش برابر آزمایش می کند.

  • int indexOf(object elem، int index) اولین رخداد آرگومان داده شده را جستجو می کند، از شاخص شروع می شود، و برابری را با استفاده از روش برابر آزمایش می کند.

  • void insertElementAt(Object obj، int index) شی مشخص شده را به عنوان یک جزء در این بردار در شاخص مشخص شده وارد می کند.

  • boolean isEmpty() این بردار را برای مولفه های از دست رفته آزمایش می کند.

  • شی ()lastElement آخرین مولفه بردار را برمی گرداند.

  • int lastIndexOf(Object elem) اندیس آخرین رخداد شی مشخص شده در این بردار را برمی گرداند.

  • int lastIndexOf(عنصر شیء، نمایه int) شی مشخص شده را به عقب جستجو می کند و از نمایه مشخص شده شروع می شود و ایندکس را به آن برمی گرداند.

  • Object remove(int index) عنصر را در موقعیت مشخص شده در این بردار حذف می کند.

  • حذف boolean (Object o) اولین رخداد عنصر مشخص شده در این بردار را حذف می کند. اگر بردار عنصری نداشته باشد، تغییر نمی کند.

  • boolean removeAll(Collection c) تمام عناصر موجود در مجموعه مشخص شده را از بردار حذف می کند.

  • void removeAllElements() تمام اجزا را از بردار حذف می کند و اندازه آن را صفر می کند.

  • حذف عنصر بولی (Object obj) اولین (پایین ترین شاخص) وقوع آرگومان را از این بردار حذف می کند.

  • void removeElementAt(int index) یک عنصر را در ایندکس حذف می کند.

  • حفاظت شده void removeRange (int fromIndex, int toIndex) تمام عناصری را که فهرست آنها منحصراً بین fromIndex، inclusive و toIndex است، از این فهرست حذف می کند.

  • boolean retainAll (Collection c) فقط عناصر موجود در بردار را که در مجموعه مشخص شده وجود دارد، حفظ می کند.

  • مجموعه شی (شاخص int، عنصر شی) عنصر را در موقعیت مشخص شده در این بردار با عنصر مشخص شده جایگزین می کند.

  • void setElementAt(Object obj، int index) مولفه را در شاخص مشخص شده این بردار به عنوان شی داده شده تنظیم می کند.

  • void setSize(int newSize) اندازه این بردار را تعیین می کند.

  • int size() تعداد مؤلفه های این بردار را برمی گرداند.

  • فهرست زیر فهرست (int fromIndex, int toIndex) یک نمایش (نما) از بخشی از این لیست بین fromIndex، شامل و 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

مشکل کلاس Vector چیست؟

با توجه به مستندات کلاس Java Vector ، در صورتی که نیازی به پیاده سازی thread-safe در برنامه خود ندارید، توصیه می شود از ArrayList به جای Vector (شرکت کننده موثرتر Collection Framework) استفاده کنید. بیایید مثال بالا را کمی تغییر دهیم و از کلاس ArrayList به جای Vector استفاده کنیم .

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 است . این نیاز به دانش بیشتری در مورد، مثلاً، موضوعات دارد. ما دلایل را در اینجا لیست می کنیم. اولاً، اگرچه کلاس Vector همگام است، اما نمی توان آن را کاملاً ایمن نامید، اگرچه عجیب به نظر می رسد. واقعیت این است که Vector هر عملیات را همگام می کند، نه کل نمونه Vector را. این می تواند در برنامه هایی که در آن شما نیاز به همگام سازی کل مجموعه عملیات به جای عملیات فردی دارید، مشکل ساز باشد. مثلاً، اگر یک رشته در حال تکرار بر روی یک بردار باشد و یک رشته دیگر از نظر ساختاری نمونه ای از بردار را تغییر دهد، تکرارکننده یک ConcurrentModificationException را پرتاب می کند . به نظر می رسد که دو رشته می توانند همزمان با یک نمونه Vector کار کنند اگر عملیات متفاوتی را انجام دهند. ثانیاً، کلاس Vector بهترین عملکرد را ندارد زیرا اشیاء آن دارای یک آرایه قابل تغییر اندازه و همگام سازی هستند. این ترکیب به معنای سربار اضافی برای مسدود کردن عملیات است، چه نیاز به همگام سازی باشد یا خیر. مطمئناً این روی عملکرد تأثیر می گذارد. علاوه بر این، همگام سازی بردار در هر عملیات نیز تأثیر منفی بر عملکرد دارد، زیرا ما بارها و بارها برای هر عملیات یک قفل خواهیم داشت. اگر کل نمونه کلاس هماهنگ می شد، قفل نیز یک بار بدست می آمد که بسیار کارآمدتر است. ثالثاً، Vector از برخی روش های قدیمی پشتیبانی می کند. برای مثال عناصر() . این روش شمارشی از اجزای بردار را برمی گرداند. برنامه نویسان اغلب از Iterator یا ListIterator برای Enumeration و به دلایلی استفاده می کنند. به طور خاص، Enumeration دارای یک متد remove() تعریف نشده است، به این معنی که لیست را نمی توان از نظر ساختاری در طول تکرار تغییر داد. همچنین برخلاف ListIterator، Enumeration دسترسی دو طرفه را ارائه نمی دهد. همانطور که می بینید، Vector مشکلات زیادی دارد. اگر هنوز نیاز به اجرای یک رابط لیست با موضوعی ایمن دارید، چه؟ در این مورد، ArrayList کمکی نمی کند، اما می توانید به عنوان مثال از کلاس CopyOnWriteArrayList به جای Vector استفاده کنید . آن را به عنوان یک نوع رشته ایمن از ArrayList قرار داده است . همچنین می توانید ArrayList را با استفاده از مجموعه ها همگام سازی کنیدمتد synchronizedList()

راستی وکتور مشکلاتی داره...چرا هنوز جاوا هست و چرا باید آموزش داده بشه؟

این سوال پیش می آید: اصلاً چرا کلاس Vector را مطالعه می کنیم ؟ و چرا هنوز از جاوا حذف نشده؟ واقعیت این است که جاوا اصل سازگاری با عقب را ادعا می کند. این بدان معنی است که تمام کدهای قدیمی که سال ها پیش نوشته شده اند توسط نسخه های مدرن جاوا قابل درک خواهند بود. علاوه بر این، تعداد کمی از برنامه های کاربردی در سطح سازمانی در محیط جاوا وجود دارد که برای چندین دهه پشتیبانی می شوند. کاملاً ممکن است که در کار خود مجبور به مقابله با چنین "دایناسوری" باشید، بنابراین باید برای شگفتی‌ها، مانند کد با کلاس‌های قدیمی بی‌اثر، آماده باشید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION