JavaRush /مدونة جافا /Random-AR /قائمة المصفوفات في جافا

قائمة المصفوفات في جافا

نشرت في المجموعة
عند التطوير، غالبًا ما يكون من الصعب التنبؤ بحجم المصفوفات المطلوبة. ولذلك، فإن وظيفة تخصيص الذاكرة ديناميكيًا أثناء تشغيل البرنامج ضرورية لكل لغة برمجة. المصفوفة الديناميكية هي تلك التي يمكن أن يتغير حجمها أثناء تنفيذ البرنامج. في Java، هناك فئة ArrayList لهذا الغرض .

ما هي فئة ArrayList؟

ArrayList هو تطبيق مصفوفة قابلة للتغيير لواجهة القائمة، وهي جزء من Collection Framework، وهي المسؤولة عن القائمة (أو المصفوفة الديناميكية) الموجودة في حزمة java.utils. تنفذ هذه الفئة جميع عمليات القائمة الاختيارية وتوفر طرقًا للتحكم في حجم المصفوفة المستخدمة لتخزين القائمة. يعتمد ArrayList على فكرة المصفوفة الديناميكية. وهي إمكانية إضافة العناصر وإزالتها، مع الزيادة أو النقصان حسب الحاجة.

ماذا يخزن ArrayList؟

الأنواع المرجعية فقط، وأي كائنات، بما في ذلك فئات الجهات الخارجية. سلاسل، وتدفقات الإخراج، ومجموعات أخرى. تُستخدم فئات الغلاف لتخزين أنواع البيانات البدائية.

منشئو قائمة ArrayList

  1. قائمة المصفوفة ()

    مُنشئ فارغ بسعة صفيف داخلية أولية = 10.

    ArrayList<String> list = new ArrayList<>();

    يُنصح بالإشارة إلى نوع القيم المخزنة بين قوسين. في المثال أعلاه - String.

  2. ArrayList(المجموعة <؟ تمتد E> ج)

    يقبل المنشئ مجموعة أخرى، وينشئ مصفوفة جديدة بعناصر المجموعة التي تم تمريرها:

    ArrayList<String> list2 = new ArrayList<>(list);

    سيكون ترتيب العناصر في القائمة الجديدة هو نفس الترتيب الأصلي.

  3. ArrayList (السعة الأولية int)

    معلمة المنشئ هي قيمة الحجم الأولي للصفيف الداخلي.

    ArrayList<String> list2 = new ArrayList<>(10000);

    إذا نفدت المساحة في قائمة ArrayList الأساسية عند إضافة عناصر جديدة، فسيتم إنشاء مصفوفة جديدة أكبر ويتم نسخ البيانات إليها. إذا كنت تعلم مسبقًا عند كتابة التعليمات البرمجية الخاصة بك أنه سيتم معالجة عدد كبير من العناصر في المصفوفة، فيجب عليك تحديد قيمة أكبر لأغراض التحسين.

طرق قائمة المصفوفات

    فيما يلي الطرق الرئيسية لـ ArrayList.

  • إضافة (ه ه)

    إضافة عنصر جديد إلى نهاية القائمة. إرجاع booleanالقيمة ( صحيح - النجاح، خطأ - غير مضاف):

    ArrayList<String> list = new ArrayList<>();
    list.add("Hello");
  • إضافة (مؤشر كثافة العمليات، عنصر E)

    يضيف عنصرا elementفي فهرس الموضع. عند الإضافة، يتم إزاحة جميع العناصر الموجودة على يمين الفهرس المحدد بمقدار موضع واحد إلى اليمين:

    list.add(0, "Amigo");

    مفيد جدًا عندما تحتاج إلى إدراج عنصر في أي مكان في القائمة، ولكن بالنسبة لعمليات الإدراج المتكررة في بداية ومنتصف ArrayList قد لا يكون خيارًا جيدًا للغاية - يجب عليك البحث في LinkedList.

  • addAll(مجموعة <؟ تمتد E> مجموعة)

    إضافة كافة عناصر المجموعة إلى القائمة بالترتيب الذي تظهر به في المجموعة.

  • addAll(int فهرس، المجموعة <؟ تمتد E> المجموعة)

    Добавление всех элементов collection в список начиная с индекса index. При этом все элементы сдвинутся вправо на количество элементов в списке collection:

    ArrayList<String> secondList = new ArrayList<>();
    secondList.addAll(list);
    System.out.println("First addition: " + secondList);
    secondList.addAll(1, list);
    System.out.println("Second addition in the middle: " + secondList);

    Вывод:

    
    Первое добавление: [Amigo, Hello]
    Второе добавление в середину: [Amigo, Amigo, Hello, Hello]

    Методы addAll() также возвращают boolean-результат добавления элементов.

  • clear()

    Удаление всех элементов из списка.

  • clone()

    returns an object-копию массива:

    ArrayList<String> copyOfSecondList = (ArrayList<String>) secondList.clone();
    secondList.clear();
    System.out.println(copyOfSecondList);

    Вывод:

    
    [Amigo, Amigo, Hello, Hello]

    Следует обратить внимание, что метод clone() возвращает Object, так что после его вызова потребуется сделать приведение к необходимому классу.

    При клонировании создается новый независимый an object. В примере показано, How очищение клонированного an object не сказалось на составе его клона.

  • contains(Object o)

    Проверка наличие an object в списке, возвращает boolean-meaning.

    System.out.println(copyOfSecondList.contains("Hello"));
    System.out.println(copyOfSecondList.contains("Check"));

    Вывод:

    
    true
    false
  • ensureCapacity(int minCapacity)

    Увеличивает размер внутреннего массива, чтобы в него поместилось количество элементов, переданных в minCapacity. Если массив достаточно вместителен, ниHowие преобразования не производятся.

    Этот метод полезен, когда возникает потребность вместить большое количество элементов в несколько итераций. Например, при создании списка емкость его внутреннего массива — 10. При загрузке данных по сети они обрабатываются асинхронно порциями и результаты помещаются в массив. Если ожидается доставка 10 000 элементов, может быть неэффективно просто добавлять эти данные каждый раз: достаточно будет в начале обработки вызвать метод ensureCapaciry(10000) и записывать туда данные по мере необходимости.

  • forEach(Consumer<? super E> action)

    Обработать в цикле ArrayList можно стандартными способами, цикл for:

    // First way
    for(int i = 0; i< secondList.size(); i++) {
       System.out.println(secondList.get(i));
    }
    И цикл for-each:
    // Second way
    for(String s : secondList) {
       System.out.println(s);
    }

    В классе ArrayList есть метод для обработки каждого element, который называется также, forEach. В качестве аргумента передается реализация интерфейса Consumer, в котором нужно переопределить метод accept():

    secondList.forEach(new Consumer<String>() {
       @Override
       public void accept(String s) {
           System.out.println(s);
       }
    });

    Вывод:

    
    Amigo
    Amigo
    Hello
    Hello

    Метод accept принимает в качестве аргумента очередной элемент того типа, который хранит в себе ArrayList. Пример для Integer:

    ArrayList<Integer> integerList = new ArrayList<>();
    integerList.forEach(new Consumer<Integer>() {
       @Override
       public void accept(Integer integer) {
           System.out.println(integer);
       }
    });

    Метод action() будет выполнен для каждого element.

  • get(int index)

    returns элемент, который расположен в указанной позиции списка.

    Если index < 0 or index >= максимального количества элементов списка, будет выброшено исключение IndexOutOfBoundsException.

    Это основной метод получения element из списка, время извлечения element по индексу всегда будет одинаковым, независимо от размера ArrayList.

  • indexOf(Object o)

    Метод возвращает индекс первого вхождения element в списке. Если element не существует в списке, метод вернет -1.

  • isEmpty()

    Метод возвращает true, если список пустой, false в обратном случае.

    Если в списке содержатся только элементы null, метод вернет false. Иными словами, null элементы также учитываются этим методом.

  • iterator()

    returns итератор для списка для последующего использования в цикле or при любой другой обработке.

    مكرر لـ ArrayList - سريع الفشل. هذا يعني أنه إذا تغيرت المجموعة أثناء التكرار، فسيتم طرح ConcurrentModificationException. يمكنك قراءة المزيد عن الفشل السريع وعكسه، الأمان من الفشل، هنا .

  • lastIndexOf (الكائن س)

    وظيفة هذه الطريقة مشابهة لوظيفة indexOf()، والفرق هو أنه يتم إرجاع فهرس العنصر الأخير في القائمة.

    إذا لم يتم العثور على العنصر، فسيتم أيضًا إرجاع -1.

  • إزالة (مؤشر كثافة العمليات)

    يزيل العنصر الموجود في موضع الفهرس المحدد. بعد الحذف، ينقل جميع العناصر إلى اليسار لملء المساحة المحررة.

    إذا كان هناك عدد من عناصر القائمة index<0أو >=عددها، فسيتم طرح استثناء IndexOutOfBoundsException. ونتيجة لذلك، تقوم الطريقة بإرجاع العنصر الذي تمت إزالته.

  • إزالة (الكائن س)

    تقوم الطريقة بإزالة العنصر الذي تم تمريره من القائمة o. في حالة وجود عنصر في القائمة، تتم إزالته ويتم نقل جميع العناصر إلى اليسار. إذا كان العنصر موجودًا في القائمة وتمت إزالته بنجاح، فستُرجع الطريقة true، وإلا فستُرجع false .

  • إزالة الكل (المجموعة <؟> ج)

    إذا كنت بحاجة إلى إزالة عدة عناصر، فلا يجب عليك القيام بذلك في حلقة مشروطة: يعد استخدام الطريقة أكثر ملاءمة وأمانًا removeAll(). يقبل مجموعة من العناصر التي سيتم إزالتها من القائمة.

    يجب أن تحتوي المجموعة على عناصر من نفس النوع الذي تخزنه القائمة المستهدفة. وإلا سيتم طرحه بعيدا ClassCastException. ستعود الطريقة صحيحة إذا تم تعديل القائمة نتيجة لاستدعاء الطريقة.

  • مجموعة (مؤشر كثافة العمليات، عنصر E)

    يستبدل العنصر الموجود في الموضع المحدد indexبالعنصر الذي تم تمريره element. يجب أن يكون الفهرس أيضًا أكبر من الصفر وأقل من فهرس العنصر الأخير، وإلا فسيتم طرح استثناء IndexOutOfBoundsException.

  • مقاس()

    أفضل طريقة (الوحيدة تقريبًا) لمعرفة حجم المصفوفة.

  • فرز (المقارنة <؟ سوبر E> ج)

    فرز القائمة وفقا لقاعدة معينة. قاعدة الفرز هي واجهة تم تنفيذها Comparatorبطريقة تم تجاوزها compareTo().

    يعد التجاوز ضروريًا إذا كانت المجموعة تحتوي على كائنات من فئتها الخاصة. عند العمل مع الفئات القياسية ( Integer، Stringوما إلى ذلك)، compareTo()يكون التجاوز مطلوبًا فقط للفرز غير القياسي.

  • لمجموعة()

    تحويل القائمة إلى مصفوفة ثابتة. لاحظ أن الطريقة تقوم بإرجاع مجموعة من الكائنات ( Object[]). إذا كنت بحاجة إلى تحويل قائمة إلى مصفوفة من الكائنات من نوع معين، فيمكنك تمرير مصفوفة سيتم نقل عناصر القوائم إليها كمعلمة للطريقة.

    مثال:

    String[] array = new String[secondList.size()];
    secondList.toArray(array);
    for(int i = 0; i< array.length; i++) {
       System.out.println(array[i]);
    }

    خاتمة:

    
    Amigo
    Amigo
    Hello
    Hello
يتم تعلم أساليب ArrayList في Java في دورة JavaRush. يتم التعارف الأول في المستوى السابع من مهمة Java Syntax، في محاضرة "ArrayList Class" . على نفس المستوى ، توجد مجموعات من المهام - واحد واثنان ، حيث تحتاج إلى استخدام أساليب ArrayList، ويتم تقديم أمثلة إضافية للعمل مع ArrayList والأدوية العامة، ويتم شرح الفرق بين ArrayList وLinkedList. يعد هذا موضوعًا واسعًا للدراسة، لذلك، بشكل أو بآخر، يتم الرجوع إلى Arraylist in Java (أساليب هذا الفصل ليست سوى جزء من مجموعة المعرفة الكاملة التي تستحق الخوض فيها) في الدورة على المستويات التالية التدريب - الأساسي، المجموعات، تعدد العمليات. نحن نؤمن بأن الممارسة اليومية لكتابة التعليمات البرمجية هي المفتاح الرئيسي للنجاح في البرمجة. ولذلك فإن 80% من JavaRush يتكون من مهام عملية ومشاريع صغيرة ومهام ألعاب. كل هذا عبارة عن مئات الساعات من البرمجة التي ستساعد في تحسين مهاراتك.

روابط لمزيد من القراءة

  1. مقالة مفصلة عن المصفوفات الديناميكية ، أو بشكل أكثر دقة حول ArrayListو LinkedList، التي تؤدي دورها في لغة جافا.
  2. مقالة حول إزالة العناصر من ArrayList .
  3. محاضرة عن العمل مع ArrayList بالرسوم البيانية والصور .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION