Panduan untuk Java ArrayList

1. Ikhtisar

Pada artikel ini, kita akan melihat kelas ArrayList dari Java Collections Framework. Kami akan membahas propertinya, kasus penggunaan umum, serta kelebihan dan kekurangannya.

ArrayList berada di dalam Pustaka Inti Java, jadi Anda tidak memerlukan pustaka tambahan apa pun. Untuk menggunakannya cukup tambahkan pernyataan import berikut:

import java.util.ArrayList;

Daftar mewakili urutan nilai yang berurutan di mana beberapa nilai dapat muncul lebih dari satu kali.

ArrayList adalah salah satu implementasi List yang dibangun di atas sebuah array, yang mampu berkembang dan menyusut secara dinamis saat Anda menambahkan / menghapus elemen. Elemen dapat dengan mudah diakses oleh indeksnya mulai dari nol. Implementasi ini memiliki properti berikut:

  • Akses acak membutuhkan O (1) waktu
  • Menambahkan elemen membutuhkan waktu konstan diamortisasi O (1)
  • Memasukkan / Menghapus membutuhkan O (n) waktu
  • Pencarian membutuhkan waktu O (n) untuk array yang tidak disortir dan O (log n) untuk array yang diurutkan

2. Buat ArrayList

ArrayList memiliki beberapa konstruktor dan kami akan menyajikan semuanya di bagian ini.

Pertama, perhatikan bahwa ArrayList adalah kelas generik, sehingga Anda dapat membuat parameter dengan tipe apa pun yang Anda inginkan dan kompilator akan memastikan bahwa, misalnya, Anda tidak akan dapat menempatkan nilai Integer di dalam kumpulan Strings . Selain itu, Anda tidak perlu memasukkan elemen saat mengambilnya dari koleksi.

Kedua, merupakan praktik yang baik untuk menggunakan List antarmuka generik sebagai tipe variabel, karena ini memisahkannya dari implementasi tertentu.

2.1. Konstruktor No-Arg Default

List list = new ArrayList(); assertTrue(list.isEmpty());

Kami hanya membuat instance ArrayList kosong .

2.2. Konstruktor Menerima Kapasitas Awal

List list = new ArrayList(20);

Di sini Anda menentukan panjang awal larik yang mendasari. Ini dapat membantu Anda menghindari pengubahan ukuran yang tidak perlu saat menambahkan item baru.

2.3. Konstruktor Menerima Koleksi

Collection number = IntStream.range(0, 10).boxed().collect(toSet()); List list = new ArrayList(numbers); assertEquals(10, list.size()); assertTrue(numbers.containsAll(list));

Perhatikan, elemen dari instance Collection digunakan untuk mengisi array yang mendasarinya.

3. Tambahkan Elemen ke ArrayList

Anda dapat memasukkan elemen di akhir atau di posisi tertentu:

List list = new ArrayList(); list.add(1L); list.add(2L); list.add(1, 3L); assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list));

Anda juga dapat menyisipkan koleksi atau beberapa elemen sekaligus:

List list = new ArrayList(Arrays.asList(1L, 2L, 3L)); LongStream.range(4, 10).boxed() .collect(collectingAndThen(toCollection(ArrayList::new), ys -> list.addAll(0, ys))); assertThat(Arrays.asList(4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo(list));

4. Iterasi Selama ArrayList

Ada dua jenis iterator yang tersedia: Iterator dan ListIterator .

Meskipun yang pertama memberi Anda kesempatan untuk melintasi daftar dalam satu arah, yang terakhir memungkinkan Anda untuk melintasi daftar itu di kedua arah.

Di sini kami hanya akan menampilkan ListIterator :

List list = new ArrayList( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); ListIterator it = list.listIterator(list.size()); List result = new ArrayList(list.size()); while (it.hasPrevious()) { result.add(it.previous()); } Collections.reverse(list); assertThat(result, equalTo(list));

Anda juga dapat mencari, menambah atau menghapus elemen menggunakan iterator.

5. Cari ArrayList

Kami akan mendemonstrasikan bagaimana pencarian bekerja menggunakan koleksi:

List list = LongStream.range(0, 16) .boxed() .map(Long::toHexString) .collect(toCollection(ArrayList::new)); List stringsToSearch = new ArrayList(list); stringsToSearch.addAll(list);

5.1. Mencari Daftar yang Tidak Diurutkan

Untuk menemukan elemen Anda dapat menggunakan metode indexOf () atau lastIndexOf () . Keduanya menerima objek dan mengembalikan nilai int :

assertEquals(10, stringsToSearch.indexOf("a")); assertEquals(26, stringsToSearch.lastIndexOf("a"));

Jika Anda ingin menemukan semua elemen yang memenuhi predikat, Anda dapat memfilter koleksi menggunakan Java 8 Stream API (baca lebih lanjut di sini) menggunakan Predikat seperti ini:

Set matchingStrings = new HashSet(Arrays.asList("a", "c", "9")); List result = stringsToSearch .stream() .filter(matchingStrings::contains) .collect(toCollection(ArrayList::new)); assertEquals(6, result.size());

Juga dimungkinkan untuk menggunakan for loop atau iterator:

Iterator it = stringsToSearch.iterator(); Set matchingStrings = new HashSet(Arrays.asList("a", "c", "9")); List result = new ArrayList(); while (it.hasNext()) { String s = it.next(); if (matchingStrings.contains(s)) { result.add(s); } }

5.2. Mencari Daftar yang Disortir

Jika Anda memiliki array yang diurutkan, maka Anda dapat menggunakan algoritma pencarian biner yang bekerja lebih cepat daripada pencarian linier:

List copy = new ArrayList(stringsToSearch); Collections.sort(copy); int index = Collections.binarySearch(copy, "f"); assertThat(index, not(equalTo(-1)));

Perhatikan bahwa jika elemen tidak ditemukan maka -1 akan dikembalikan.

6. Remove Elements from the ArrayList

In order to remove an element, you should find its index and only then perform the removal via remove() method. An overloaded version of this method, that accepts an object, searches for it and performs removal of the first occurrence of an equal element:

List list = new ArrayList( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); Collections.reverse(list); list.remove(0); assertThat(list.get(0), equalTo(8)); list.remove(Integer.valueOf(0)); assertFalse(list.contains(0));

But be careful when working with boxed types such as Integer. In order to remove a particular element, you should first box int value or otherwise, an element will be removed by its index.

You may as well use the aforementioned Stream API for removing several items, but we won't show it here. For this purpose we will use an iterator:

Set matchingStrings = HashSet(Arrays.asList("a", "b", "c", "d", "e", "f")); Iterator it = stringsToSearch.iterator(); while (it.hasNext()) { if (matchingStrings.contains(it.next())) { it.remove(); } }

7. Summary

In this quick article, we had a look at the ArrayList in Java.

Kami menunjukkan cara membuat instance ArrayList , cara menambahkan, menemukan, atau menghapus elemen menggunakan pendekatan yang berbeda.

Seperti biasa, Anda dapat menemukan semua contoh kode di GitHub.