1. Bagaimana ArrayListstrukturnya

ArrayListadalah kelas Java yang paling umum digunakan untuk menyimpan elemen. Jadi bagaimana cara ArrayListkerjanya dan mengapa semua orang sangat menyukainya?

Struktur ArrayListsederhana dan cerdik. Setiap ArrayListobjek berisi dua bidang:

  • Array elemen
  • Variabel size, yang menyimpan jumlah elemen dalam daftar

Secara internal, sebuah ArrayListobjek berisi array paling biasa! Tapi itu belum semuanya. Ada juga variabel ukuran , yang menyimpan panjang daftar. Begini Cara kerjanya:

Awalnya, panjang array di dalam list adalah 10. Dan variabelnya sizeadalah 0.

Jika Anda menambahkan elemen ke daftar, itu akan disimpan di sel ke-0 dari array, dan sizeakan bertambah menjadi 1.

Jika Anda menambahkan satu elemen lagi, itu akan disimpan di sel pertama, dan sizeakan bertambah 1 lagi dan menjadi sama dengan dua.

Jika Anda menambahkan elemen lain saat tidak ada lagi ruang di dalam array, maka hal berikut akan terjadi di dalam add()metode:

  1. Array baru dibuat dengan panjang satu setengah kali dari yang sebelumnya
  2. Semua elemen dari array lama disalin ke dalam array baru.
  3. Di ArrayListobjek, referensi ke larik baru menggantikan referensi ke larik lama .
  4. Elemen yang diteruskan disimpan di sel ke-10 dari array baru.
  5. Variabel ukuran bertambah 1 dan sekarang akan sama dengan 11

Hal serupa terjadi saat menambahkan (memasukkan) elemen di tengah daftar. Elemen yang ada digeser 1 ke kanan, dan elemen yang diteruskan ditulis ke sel array yang baru dibebaskan.

Sekarang kita akan mempertimbangkan skenario paling dasar yang melibatkan daftar:


2. Menambahkan elemen ke anArrayList

Mari kita lihat apa yang terjadi di dalam daftar ketika elemen ditambahkan ke dalamnya. Segera setelah objek ArrayList dibuat, kami memiliki sesuatu seperti ini di memori:

Menambahkan elemen ke ArrayList

Kami memiliki ArrayListobjek yang berisi dua bidang (dua variabel): wadah (array data) dan jumlah elemen yang disimpan ( size). Variabel datamenyimpan referensi ke wadah (array) yang dapat menyimpan 10 elemen.

Jika kami memutuskan untuk menambahkan angka 5 ke array, kami mendapatkan gambar berikut:

Menambahkan elemen ke ArrayList 2

Array sekarang menyimpan elemen 5, dan size == 1.

Jika seseorang memanggil size()metode pada ArrayListobjek kita sekarang, nilai kembaliannya adalah jumlah elemen yang disimpan dalam daftar: 1. Jumlah elemen dalam daftar tidak sama dengan kapasitas penyimpanan array.

Baik kapasitas penyimpanan saat ini maupun array itu sendiri tidak akan pernah dapat diakses (terlihat) di luar objek ArrayList. Ini adalah dan akan selalu menjadi ArrayListdata internal.

Mari tambahkan 7 angka lagi ke daftar: 10, 20, 30, 40, 50, 60, 70.

Sekarang memori akan terlihat seperti ini:

Menambahkan elemen ke ArrayList

Jika Anda memanggil size()metode sekarang, itu akan mengembalikan angka 8, yang merupakan jumlah elemen baru dalam daftar. Nilai ini tidak ada hubungannya dengan ukuran array internal.

Penting:

Ada satu penyederhanaan berlebihan dalam gambar ini.

Kelas ArrayListtidak dapat menyimpan tipe primitif, sehingga menggunakan Integertipe daripada int. Wadah tidak secara langsung menyimpan nilai {5, 10, 20, 30, 40, 50, 60, 70}, melainkan referensi ke Integerobjek. Semua sel kosong di dalam wadah menyimpan null.



3. Menambah panjang daftar

Mari kita lihat apa yang terjadi di dalam daftar ketika tidak ada lagi sel kosong di dalam larik internalnya.

Misalkan kita memiliki daftar 10 elemen:

Menambah panjang daftar

Kami memutuskan untuk menambahkan angka 100 ke dalamnya. Inilah yang terjadi dalam add()metode:

Langkah 1 — Buat larik baru:

Menambah panjang daftar 2

Langkah 2 — Salin semua elemen dari larik lama ke larik baru:

Menambah panjang daftar 2

Langkah 3 — Ganti larik lama (ubah referensi ke ArrayListlarik internal objek):

Menambah panjang daftar3

Langkah 4 — Tambahkan nomor baru, yang merupakan hasil kerja keras kami:

Menambah panjang daftar 4