1. Gambaran keseluruhan
Dalam artikel ini, kita akan melihat kelas ArrayList dari Java Collections Framework. Kami akan membincangkan sifatnya, kes penggunaan biasa, serta kelebihan dan kekurangannya.
ArrayList berada di dalam Java Core Libraries, jadi anda tidak memerlukan perpustakaan tambahan. Untuk menggunakannya, tambah pernyataan import berikut:
import java.util.ArrayList;
List mewakili urutan nilai yang tertib di mana beberapa nilai mungkin berlaku lebih dari satu kali.
ArrayList adalah salah satu implementasi List yang dibina di atas array, yang dapat tumbuh dan mengecil secara dinamik semasa anda menambah / membuang elemen. Elemen dapat diakses dengan mudah oleh indeksnya mulai dari sifar. Pelaksanaan ini mempunyai sifat berikut:
- Capaian rawak mengambil O (1) masa
- Menambah elemen memerlukan masa tetap dilunaskan O (1)
- Memasukkan / Memadam mengambil O (n) masa
- Mencari memerlukan O (n) masa untuk susunan yang tidak disusun dan O (log n) untuk yang disusun
2. Buat ArrayList
ArrayList mempunyai beberapa pembina dan kami akan membentangkan semuanya dalam bahagian ini.
Pertama, perhatikan bahawa ArrayList adalah kelas generik, jadi anda boleh membuat parameter mengikut jenis yang anda mahukan dan penyusun akan memastikan bahawa, sebagai contoh, anda tidak akan dapat memasukkan nilai Integer ke dalam koleksi Strings . Anda juga tidak perlu membuang elemen semasa mengambilnya dari koleksi.
Kedua, adalah praktik yang baik untuk menggunakan Senarai antara muka generik sebagai jenis pemboleh ubah, kerana ia melepaskannya dari pelaksanaan tertentu.
2.1. Pembina Tanpa Arg Lalai
List list = new ArrayList(); assertTrue(list.isEmpty());
Kami hanya membuat contoh ArrayList kosong .
2.2. Pembina Menerima Kapasiti Permulaan
List list = new ArrayList(20);
Di sini anda tentukan panjang awal bagi array yang mendasari. Ini dapat membantu anda mengelakkan pengubahan saiz yang tidak perlu semasa menambahkan item baru.
2.3. Koleksi Menerima Pembina
Collection number = IntStream.range(0, 10).boxed().collect(toSet()); List list = new ArrayList(numbers); assertEquals(10, list.size()); assertTrue(numbers.containsAll(list));
Perhatikan, elemen contoh Koleksi digunakan untuk mengisi array yang mendasari.
3. Tambahkan Elemen ke ArrayList
Anda boleh memasukkan elemen sama ada di hujung atau pada kedudukan 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 boleh memasukkan 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. Mengulangi ArrayList
Terdapat dua jenis iterator yang tersedia: Iterator dan ListIterator .
Walaupun yang pertama memberi anda peluang untuk melintasi senarai dalam satu arah, yang kedua membolehkan anda melintasi kedua arah.
Di sini kami akan menunjukkan kepada anda hanya 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 boleh mencari, menambah atau membuang elemen menggunakan iterator.
5. Cari ArrayList
Kami akan menunjukkan bagaimana carian berfungsi 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 Senarai Tidak Disusun
Untuk mencari elemen, anda boleh menggunakan kaedah indexOf () atau lastIndexOf () . Mereka berdua menerima objek dan mengembalikan nilai int :
assertEquals(10, stringsToSearch.indexOf("a")); assertEquals(26, stringsToSearch.lastIndexOf("a"));
Sekiranya anda ingin mencari semua elemen yang memuaskan predikat, anda boleh menapis koleksi menggunakan Java 8 Stream API (baca lebih lanjut mengenainya di sini) menggunakan Predicate 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());
Anda juga boleh menggunakan loop for 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 Senarai Tersusun
Sekiranya anda mempunyai susunan yang disusun, maka anda mungkin menggunakan algoritma carian binari yang berfungsi lebih pantas daripada carian linear:
List copy = new ArrayList(stringsToSearch); Collections.sort(copy); int index = Collections.binarySearch(copy, "f"); assertThat(index, not(equalTo(-1)));
Perhatikan bahawa jika unsur tidak dijumpai 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 contoh ArrayList , cara menambahkan, mencari atau membuang elemen menggunakan pendekatan yang berbeza.
Seperti biasa, anda boleh menemui semua contoh kod di GitHub.