ما هي فئة ArrayList؟
ArrayList هو تطبيق مصفوفة قابلة للتغيير لواجهة القائمة، وهي جزء من Collection Framework، وهي المسؤولة عن القائمة (أو المصفوفة الديناميكية) الموجودة في حزمة java.utils. تنفذ هذه الفئة جميع عمليات القائمة الاختيارية وتوفر طرقًا للتحكم في حجم المصفوفة المستخدمة لتخزين القائمة. يعتمد ArrayList على فكرة المصفوفة الديناميكية. وهي إمكانية إضافة العناصر وإزالتها، مع الزيادة أو النقصان حسب الحاجة.ماذا يخزن ArrayList؟
الأنواع المرجعية فقط، وأي كائنات، بما في ذلك فئات الجهات الخارجية. سلاسل، وتدفقات الإخراج، ومجموعات أخرى. تُستخدم فئات الغلاف لتخزين أنواع البيانات البدائية.منشئو قائمة ArrayList
-
قائمة المصفوفة ()
مُنشئ فارغ بسعة صفيف داخلية أولية = 10.
ArrayList<String> list = new ArrayList<>();
يُنصح بالإشارة إلى نوع القيم المخزنة بين قوسين. في المثال أعلاه -
String
. -
ArrayList(المجموعة <؟ تمتد E> ج)
يقبل المنشئ مجموعة أخرى، وينشئ مصفوفة جديدة بعناصر المجموعة التي تم تمريرها:
ArrayList<String> list2 = new ArrayList<>(list);
سيكون ترتيب العناصر في القائمة الجديدة هو نفس الترتيب الأصلي.
-
ArrayList (السعة الأولية int)
معلمة المنشئ هي قيمة الحجم الأولي للصفيف الداخلي.
ArrayList<String> list2 = new ArrayList<>(10000);
إذا نفدت المساحة في قائمة 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
orindex >=
максимального количества элементов списка, будет выброшено исключение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.
روابط لمزيد من القراءة
- مقالة مفصلة عن المصفوفات الديناميكية ، أو بشكل أكثر دقة حول
ArrayList
وLinkedList
، التي تؤدي دورها في لغة جافا. - مقالة حول إزالة العناصر من ArrayList .
- محاضرة عن العمل مع ArrayList بالرسوم البيانية والصور .
GO TO FULL VERSION