CodeGym /مدونة جافا /Random-AR /جافا المتجهات
John Squirrels
مستوى
San Francisco

جافا المتجهات

نشرت في المجموعة
ربما تكون قد صادفت بالفعل مصفوفات في Java، وأنت تعلم أن أحد عيوبها الرئيسية هو ثبات الحجم. بمجرد إنشاء مصفوفة بحجم معين، لا يمكنك تغيير ذلك لاحقًا. هناك العديد من فئات إطار عمل Java Collection في لغة Java التي تحل هذه المشكلة. واحد منهم هو Java Vector Class. سيتم مناقشتها في هذه المقالة.

ما هي فئة المتجهات

كما كتبنا في المقدمة، فإن فئة Vector من Java Collection Framework تحل مشكلة الحجم الثابت للمصفوفات. يعد Java Vector نوعًا من المصفوفة الديناميكية ويمكن أن ينمو حجمه أو يتقلص. باستخدام فئة مجموعة المتجهات ، يمكننا تخزين مجموعة من العناصر ككائنات بسيطة ومعالجتها من خلال الأساليب المختلفة. فئة Vector متاحة من الحزمة java.util . وبالتالي، يمكن استخدام Vector في Java إذا كنت لا تعرف حجم المصفوفة مسبقًا، أو إذا كنت بحاجة إلى "مصفوفة" يمكنها تغيير الأبعاد على مدار عمر البرنامج. يجب أن يقال على الفور أن فئة Vector قديمة بالفعل، وظهرت مجموعات لاحقة يمكن أن تحل محلها في الغالبية العظمى من الحالات. "التناظرية" الشائعة لـ Java Vector هي فئة ArrayList . الفرق الأكثر أهمية بين هذه الفئات عن بعضها البعض هو أن Vector متزامن، في حين أن ArrayList ليس كذلك. سنتحدث عن الاختلافات الأخرى بين هاتين الفئتين ونظائرها الأكثر حداثة لفئة Vector لاحقًا في قسم "ما الخطأ في فئة Vector".

طرق جافا المتجهات

فيما يلي طرق Java Vector :
  • تقوم إضافة باطلة (مؤشر int، عنصر الكائن) بإدراج العنصر المحدد في الموضع المحدد للمتجه.

  • إضافة منطقية (Object o) تضيف العنصر المحدد إلى نهاية المتجه.

  • يضيف boolean addAll(Collection c) جميع العناصر الموجودة في المجموعة المحددة إلى نهاية المتجه، بالترتيب الذي يتم إرجاعها بواسطة مكرر المجموعة المحدد.

  • يقوم boolean addAll(int Index, Collection c) بإدراج جميع العناصر الموجودة داخل المجموعة المحددة في المتجه في الموضع المحدد.

  • يضيف void addElement(Object obj) المكون المحدد إلى نهاية هذا المتجه، مما يزيد حجمه بمقدار واحد.

  • int سعة () ترجع السعة الحالية لهذا المتجه.

  • يزيل void Clear() كافة العناصر من هذا المتجه.

  • يقوم Object clone() بإرجاع نسخة من هذا المتجه.

  • يحتوي boolean على (Object elem) لاختبار ما إذا كان الكائن المحدد مكونًا في هذا المتجه.

  • boolean يحتوي على الكل (Collection c) يُرجع صحيحًا إذا كان المتجه يحتوي على جميع عناصر المجموعة المحددة.

  • voidcopyInto(Object[] anArray) ينسخ مكونات هذا المتجه إلى المصفوفة المحددة.

  • يقوم Object elementAt(int Index) بإرجاع المكون في الفهرس المحدد.

  • تقوم عناصر التعداد () بإرجاع تعداد مكونات هذا المتجه.

  • يزيد voidsureCapacity(int minCapacity) من سعة هذا المتجه، إذا لزم الأمر، للتأكد من أنه يمكنه الاحتفاظ على الأقل بعدد المكونات التي توفرها وسيطة الحد الأدنى للسعة.

  • منطقي يساوي (Object o) يقارن الكائن المحدد بهذا المتجه.

  • يقوم Object firstElement() بإرجاع المكون الأول (العنصر الموجود في الفهرس 0) لهذا المتجه.

  • يقوم الكائن get(int Index) بإرجاع العنصر في الموضع المحدد في هذا المتجه.

  • يقوم int hashCode() بإرجاع قيمة رمز التجزئة لهذا المتجه.

  • يبحث int IndexOf(Object elem) عن التواجد الأول للوسيطة المحددة، ويختبر المساواة باستخدام طريقة التساوي.

  • يبحث int IndexOf(Object elem, int Index) عن التواجد الأول للوسيطة المحددة، بدءًا من الفهرس، واختبار المساواة باستخدام طريقة التساوي.

  • يقوم void InsertElementAt(Object obj, int Index) بإدراج الكائن المحدد كمكون في هذا المتجه في الفهرس المحدد.

  • يختبر التابع boolean isEmpty() هذا المتجه بحثًا عن المكونات المفقودة.

  • يقوم Object lastElement() بإرجاع العنصر الأخير من المتجه.

  • int lastIndexOf(Object elem) يُرجع فهرس آخر تواجد للكائن المحدد في هذا المتجه.

  • int lastIndexOf(Object elem, int Index) يبحث بشكل عكسي عن الكائن المحدد، بدءًا من الفهرس المحدد، ويعيد الفهرس إليه.

  • إزالة الكائن (مؤشر int) يزيل العنصر في الموضع المحدد في هذا المتجه.

  • إزالة منطقية (Object o) تزيل التواجد الأول للعنصر المحدد في هذا المتجه. إذا كان المتجه لا يحتوي على عنصر، فإنه لا يتغير.

  • boolean RemoveAll(Collection c) يزيل جميع العناصر من المتجه الموجود في المجموعة المحددة.

  • يزيل التابع void RemoveAllElements() كافة المكونات من المتجه ويضبط حجمه على الصفر.

  • إزالة منطقية (Object obj) تزيل التواجد الأول (أدنى مؤشر) للوسيطة من هذا المتجه.

  • يزيل void RemoveElementAt(int Index) عنصرًا في الفهرس.

  • إزالة الفراغ المحمي (int fromIndex, int toIndex) يزيل من هذه القائمة جميع العناصر التي يقع فهرسها بين fromIndex، شاملاً، وtoIndex، حصريًا.

  • يحتفظ boolean keepAll(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) يُرجع مصفوفة تحتوي على كافة عناصر هذا المتجه بالترتيب الصحيح؛ نوع تنفيذ المصفوفة التي تم إرجاعها هو نوع المصفوفة المحددة.

  • تقوم 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

ما هو الخطأ في فئة المتجهات؟

وفقًا لوثائق فئة Java Vector ، إذا لم تكن بحاجة إلى تنفيذ آمن لمؤشر الترابط في برنامجك، فمن المستحسن استخدام ArrayList بدلاً من Vector (مشارك أكثر فعالية في إطار العمل Collection). دعنا نغير المثال أعلاه قليلاً، باستخدام فئة 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 طريقة إزالة () محددة، مما يعني أنه لا يمكن تعديل القائمة هيكليًا أثناء التكرار. أيضًا، على عكس ListIterator، لا يوفر Enumeration وصولاً ثنائي الاتجاه. كما ترون، فإن Vector لديه عدد لا بأس به من المشاكل. ماذا لو كنت لا تزال بحاجة إلى تنفيذ آمن لمؤشر الترابط لواجهة القائمة؟ في هذه الحالة، لن يساعد ArrayList ، ولكن يمكنك، على سبيل المثال، استخدام فئة CopyOnWriteArrayList بدلاً من Vector ؛ تم وضعه كمتغير آمن لمؤشر الترابط من ArrayList . يمكنك أيضًا مزامنة ArrayList باستخدام Collectionsطريقة القائمة المتزامنة () .

يواجه Vector بالفعل بعض المشكلات... لماذا لا يزال موجودًا في Java ولماذا يجب تدريسه؟

السؤال الذي يطرح نفسه: لماذا ندرس فئة المتجهات أصلاً؟ ولماذا لم تتم إزالته من جافا حتى الآن؟ الحقيقة هي أن Java تعترف بمبدأ التوافق مع الإصدارات السابقة. وهذا يعني أن جميع التعليمات البرمجية القديمة المكتوبة منذ سنوات عديدة سوف تفهمها الإصدارات الحديثة من Java. بالإضافة إلى ذلك، هناك عدد لا بأس به من التطبيقات على مستوى المؤسسة في بيئة Java التي تم دعمها لعقود من الزمن. من الممكن تمامًا أن تضطر إلى التعامل مع مثل هذا "الديناصور" في عملك، لذلك عليك أن تكون مستعدًا للمفاجآت، مثل التعليمات البرمجية ذات الفئات القديمة غير الفعالة.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION