JavaRush /Java Blog /Random-ID /Java ArrayList dalam gambar

Java ArrayList dalam gambar

Dipublikasikan di grup Random-ID
Halo! Perkuliahan hari ini ArrayList, di satu sisi, akan lebih sederhana, dan di sisi lain, lebih sulit dari perkuliahan sebelumnya. ArrayList yang berfungsi dalam gambar - 1Ini lebih sulit, karena hari ini kita akan melihat “di balik terpal” ArrayListdan mempelajari apa yang terjadi padanya selama pengoperasian. Di sisi lain, hampir tidak ada kode dalam kuliah ini - kebanyakan gambar dan penjelasan. Jadi, ayo :) Seperti yang sudah Anda ketahui, di dalam ArrayList'a terdapat array biasa yang berfungsi sebagai penyimpan data. Dalam kebanyakan kasus, kami tidak menentukan ukuran pasti dari daftar. Tetapi array internal harus mempunyai ukuran tertentu! Ini benar. Ukuran defaultnya adalah [10] .
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
ArrayList yang berfungsi dalam gambar - 2Pertama, mari kita lihat seperti apa penambahan elemen baru. Pertama-tama, pemeriksaan dilakukan untuk melihat apakah ada cukup ruang di array internal dan apakah elemen lain akan muat. Jika ada ruang, elemen baru ditambahkan ke akhir daftar. Saat kami mengatakan "sampai akhir", yang kami maksud bukan sel terakhir dari array (itu akan aneh). Ini mengacu pada sel di sebelah elemen terakhir saat ini. Indeksnya akan sama dengan cars.size(). Daftar kami saat ini kosong ( cars.size() = 0). Oleh karena itu, elemen baru akan ditambahkan ke sel dengan indeks 0.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
ArrayList yang berfungsi dalam gambar - 3Semuanya jelas di sini. Apa jadinya jika penyisipan dilakukan di tengah-tengah, yaitu di antara beberapa elemen?
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
   Car ferrari = new Car("Ferrari 360 Spider");
   Car bugatti = new Car("Bugatti Veyron");
   Car lambo = new Car("Lamborghini Diablo");
   Car ford = new Car("Ford Modneo");

   cars.add(ferrari);
   cars.add(bugatti);
   cars.add(lambo);

   cars.add(1, ford);//добавляем ford в ячейку 1, которая уже занята
}
Sekali lagi, pertama-tama ia memeriksa apakah ada cukup ruang dalam array. Jika ada cukup ruang, elemen digeser ke kanan dimulai dari sel tempat kita menyisipkan elemen baru. Kita paste ke sel dengan indeks 1. Artinya, elemen dari sel 3 disalin ke sel 4, elemen 2 ke sel 3, elemen 1 ke sel 2. ArrayList yang berfungsi dalam gambar - 4Setelah itu, elemen baru kita tempel ke tempatnya. Elemen sebelumnya ( bugatti) telah disalin dari sana ke lokasi baru. ArrayList yang berfungsi dalam gambar - 5Sekarang mari kita cari tahu bagaimana proses ini akan terjadi jika tidak ada ruang untuk menyisipkan ke dalam array. ArrayList yang berfungsi dalam gambar - 6Pertama, tentu saja dilakukan pengecekan untuk melihat apakah tersedia cukup ruang. Jika ternyata tidak ada cukup ruang, ArrayListarray baru dengan ukuran (ukuran OldArray * 1.5) + 1 dibuat di dalam 'a. Dalam kasus kami, array baru akan memiliki ukuran 16 sel. Semua elemen saat ini akan segera disalin ke sana. ArrayList berfungsi dalam gambar - 7Array lama akan dihapus oleh pengumpul sampah, dan hanya array baru yang diperluas yang akan tersisa. Sekarang ada ruang kosong untuk elemen baru. Kami menempelkannya ke sel 3, yang terisi. Sekarang prosedur yang biasa dimulai. Semua elemen yang dimulai dari indeks 3 digeser satu sel ke kanan, dan elemen baru ditambahkan secara diam-diam. ArrayList yang berfungsi dalam gambar - 8Dan sekarang penyisipannya berhasil! Kami memilah penyisipannya. Sekarang mari kita bicara tentang menghapus elemen . Seperti yang Anda ingat, saat bekerja dengan array, kami mengalami masalah: saat kami menghapusnya, “lubang” tetap ada di dalamnya. Satu-satunya solusi adalah menggeser elemen ke kiri setiap kali elemen tersebut dihapus, dan Anda harus menulis sendiri kode untuk pergeseran tersebut. ArrayListbekerja dengan prinsip yang sama, namun di dalamnya mekanisme ini sudah diterapkan secara otomatis. ArrayList yang berfungsi dalam gambar - 9Seperti inilah tampilannya: ArrayList yang berfungsi dalam gambar - 10Dan pada akhirnya kita mendapatkan hasil yang diinginkan: ArrayList yang berfungsi dalam gambar - 11Elemen lamboberhasil dihapus. Di sini kami melakukan penghapusan dari tengah. Jelas bahwa menghapus dari akhir daftar akan lebih cepat, karena elemen yang diinginkan dihapus tanpa menggeser elemen lainnya. Mari kita lihat lagi ukuran array internal dan penyimpanannya di memori. Perluasan array adalah proses yang membutuhkan sejumlah sumber daya tertentu. Oleh karena itu, Anda tidak boleh membuat ArrayListdengan ukuran default jika Anda tahu pasti bahwa ukuran tersebut akan memiliki setidaknya 100 elemen. Pada saat Anda memasukkan elemen ke-100, array internal akan berkembang 6 kali lipat , setiap kali mentransfer semua elemen.
  • dari 10 elemen menjadi 16
  • dari 16 elemen menjadi 25
  • dari 25 hingga 38
  • dari 38 menjadi 58
  • dari 58 menjadi 88
  • dari 88 hingga 133 (sesuai rumus (ukuran Array Lama * 1,5) + 1)
Tentu saja, ini cukup mahal dari segi sumber daya. Oleh karena itu, jika Anda sudah mengetahui beberapa (setidaknya perkiraan) jumlah elemen yang disimpan, lebih baik segera membuat daftar dengan array dengan ukuran tertentu:
ArrayList<Car> cars = new ArrayList<>(100);
Sekarang array yang terdiri dari 100 elemen akan segera dialokasikan ke memori, yang akan lebih efisien karena sumber daya tidak akan terbuang untuk ekspansi. Ada juga sisi lain dari mata uang tersebut. Ketika objek dihapus dari ArrayListarray internal, ukurannya tidak berkurang secara otomatis. Misalnya, kita mempunyai ArrayListarray internal yang terdiri dari 88 elemen, yang terisi penuh: ArrayList yang berfungsi dalam gambar - 13Selama operasi program, kita menghapus 77 elemen darinya, dan hanya 11 elemen yang tersisa di dalamnya: Sudahkah ArrayList yang berfungsi dalam gambar - 14Anda menebak apa masalahnya? Penggunaan memori yang tidak efisien tentunya! Kami hanya menggunakan 11 sel, sementara kami memiliki memori yang dialokasikan untuk 88 elemen - ini 8 kali lebih banyak dari yang kami butuhkan! Untuk melakukan optimasi dalam hal ini, Anda dapat menggunakan metode kelas khusus ArrayList- trimToSize(). Ini “memotong” panjang array internal ke jumlah elemen yang saat ini disimpan di dalamnya. ArrayList yang berfungsi dalam gambar - 15Sekarang memori dialokasikan sebanyak yang diperlukan! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION