JavaRush /Java Blog /Random-ID /Kelas ArrayList di Java

Kelas ArrayList di Java

Dipublikasikan di grup Random-ID
Halo! Dalam kuliah sebelumnya, kita memeriksa secara rinci struktur data seperti array dan melihat contoh umum cara bekerja dengannya. Namun struktur data ini memiliki sejumlah kelemahan. Jawabannya di Java adalah munculnya ArrayList. Sederhananya, ArrayList di Java adalah array yang “ditingkatkan” dengan banyak fitur baru.Daftar Array Kelas - 1

Apa perbedaan Java Arraylist dengan array biasa?

Secara umum, array cukup mudah digunakan dan, seperti yang telah Anda ketahui, Anda dapat melakukan banyak hal dengannya :) Namun, array juga memiliki sejumlah kelemahan.
  • Ukuran terbatas. Anda perlu mengetahui pada tahap pembuatan array berapa banyak sel yang harus ditampungnya. Jika Anda meremehkan jumlah yang dibutuhkan, tidak akan ada cukup ruang. Jika Anda melebih-lebihkannya, arraynya akan tetap setengah kosong, dan itu tidak terlalu buruk. Lagi pula, ternyata Anda juga akan mengalokasikan lebih banyak memori untuk itu daripada yang diperlukan.
  • Array tidak memiliki metode untuk menambahkan elemen. Anda selalu harus secara eksplisit menentukan indeks sel tempat Anda ingin menambahkan elemen. Jika Anda secara tidak sengaja menentukan sel yang sudah terisi dengan nilai yang diinginkan, sel tersebut akan ditimpa.
  • Tidak ada metode untuk menghapus suatu elemen. Nilainya hanya bisa “dinolkan”.
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");

       cats[1] = null;



       System.out.println(Arrays.toString(cats));
   }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
Kesimpulan:

[Cat{name='Томас'}, null, Cat{name='Фorпп Маркович'}]
Semua kekurangan ini dapat dihilangkan dengan menggunakan ArrayList. Itu dibuat dengan sangat sederhana:
ArrayList<Cat> cats = new ArrayList<Cat>();
Sekarang kita telah membuat daftar untuk menyimpan objek Cat. Perhatian:kami tidak menentukan ukuran ArrayList karena dapat diperluas secara otomatis. Bagaimana ini mungkin? Dengan mudah. Anda akan terkejut, tetapi ArrayList didasarkan pada array biasa :) Ya, di dalamnya terdapat array tempat elemen kita disimpan. Tapi ArrayList memiliki mekanisme khusus untuk bekerja dengannya:
  • Ketika array internal ini penuh, ArrayList membuat array baru di dalamnya. Ukurannya = (ukuran array lama * 1,5) +1.
  • Semua data disalin dari array lama ke array baru
  • Array lama dihapus oleh pengumpul sampah.
Berkat mekanisme ini, ArrayList (sebagai lawan dari array) mengimplementasikan metode untuk menambahkan elemen baru. Ini adalah sebuah metode add().
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Hippopotamus"));
}
Elemen baru ditambahkan ke akhir daftar. Sekarang tidak ada risiko meluap, jadi mekanisme ini sepenuhnya aman. Omong-omong, ArrayList tidak hanya dapat mencari objek berdasarkan indeks, tetapi juga sebaliknya - ia dapat menemukan indeks suatu objek di ArrayList dengan mengacu pada objek tersebut! Untuk melakukan ini, ia mengimplementasikan metode indexOf(): Kami meneruskan ke dalamnya tautan ke objek yang diinginkan, dan indexOf()ia mengembalikan indeksnya kepada kami:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
Kesimpulan:

0
Benar sekali, objek tersebut thomassebenarnya disimpan di dalam sel 0. Array tidak hanya memiliki kekurangan, tetapi juga kelebihan yang tidak diragukan lagi. Salah satunya adalah mencari elemen berdasarkan indeks. Karena kita menunjuk ke suatu indeks, yaitu ke alamat tertentu di memori, pencarian array seperti itu sangat cepat. ArrayList di Java juga bisa melakukan ini! Untuk melakukan hal ini, ia mengimplementasikan metode get():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
Kesimpulan:

Cat{name='Бегемот'}
Selain itu, Anda juga dapat dengan mudah mengetahui apakah ArrayList berisi objek tertentu atau tidak. Ini dilakukan dengan menggunakan metode contains():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.remove(pushok);
   System.out.println(cats.contains(pushok));
}
Metode ini memeriksa apakah elemen terdapat dalam array internal ArrayList, dan mengembalikan hasilnya dalam bentuk boolean- trueatau false. Kesimpulan:

false
Dan satu hal penting lainnya tentang penyisipan. ArrayList memungkinkan Anda memasukkan data tidak hanya di akhir array, tetapi juga ke sel mana pun berdasarkan indeks. Ada dua metode untuk ini:
  • add(int index, Cat element)
  • set(int index, Cat element)
Untuk keduanya, Anda meneruskan indeks sel yang ingin Anda sisipkan, dan link ke objek itu sendiri. Perbedaannya adalah menempelkan melalui set()akan menimpa nilai lama yang disimpan dalam sel. Dan memasukkan melalui add()yang pertama akan menggeser semua elemen mulai dari [index]akhir array, dan menambahkan objek yang Anda perlukan ke sel kosong yang dihasilkan. Berikut ini contohnya:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.set(0, philipp);//Now we have a list of 2 cats. We add the 3rd via set:

   System.out.println(cats.toString());
}
Kesimpulan:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Бегемот'}]
Kami memiliki daftar 2 kucing, kami memasukkan satu lagi melalui metode set()ke dalam sel 0. Hasilnya, nilai lama yang disimpan di sel ini diganti dengan yang baru.
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.add(0, philipp);//Now we have a list of 2 cats. Add the 3rd via add

   System.out.println(cats.toString());
}
Tapi cara add()kerjanya berbeda. Dia menggeser semua elemen ke kanan dan kemudian menulis nilai baru ke dalam sel 0. Kesimpulan:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фorпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
Untuk menghapus daftar sepenuhnya, gunakan metode clear():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.clear();

   System.out.println(cats.toString());
}
Kesimpulan:

[]
Semua konten telah dihapus dari daftar. Ngomong-ngomong, perhatikan: tidak seperti array, di ArrayList metode toString() diganti dan segera menampilkan daftar dalam format string. Dalam kasus array, kami harus menggunakan kelas Arrays untuk ini. Dan karena kita ingat Array: di Java Anda dapat dengan mudah "beralih" antara array dan ArrayList, yaitu mengonversi satu array ke array lainnya. Kelas Arrays memiliki metode untuk ini, Arrays.asList(). Dengan bantuannya, kami mendapatkan konten array sebagai daftar dan meneruskannya ke konstruktor ArrayList kami:
public static void main(String[] args) {

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   Cat[] catsArray = {thomas, behemoth, philipp, pushok};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
Kesimpulan:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фorпп Маркович'}, Cat{name='Пушок'}]
Anda dapat melakukan yang sebaliknya - mendapatkan array dari objek ArrayList. Untuk melakukannya, gunakan metode toArray():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat[] catsArray = cats.toArray(new Cat[0]);

   System.out.println(Arrays.toString(catsArray));
}
Harap dicatat: kami meneruskan array kosong ke metode toArray(). Itu bukan kesalahan. Di dalam kelas ArrayList, metode ini diimplementasikan sedemikian rupa sehingga meneruskan array kosong akan meningkatkan kinerjanya. Untuk saat ini, ingatlah ini untuk masa depan (tetapi Anda juga dapat mentransfer ukuran tertentu, itu akan berhasil). Berbicara tentang ukuran. Ukuran daftar saat ini dapat ditemukan menggunakan metode size():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Penting untuk dipahami di sini bahwa, tidak seperti lengthproperti array, metode ArrayList.size() mengembalikan jumlah elemen secara tepat, dan bukan kapasitas awal, karena kami tidak menentukannya saat membuat ArrayList. Omong-omong, secara umum dimungkinkan untuk menunjukkannya. ArrayList memiliki konstruktor yang sesuai. Namun perilakunya dalam hal penambahan elemen baru tidak akan berubah:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>(2);//create an ArrayList with an initial capacity of 2


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Hippopotamus");
   Cat philipp = new Cat("Philip Markovich");
   Cat pushok = new Cat("Fluff");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Keluaran konsol:

4
Kami membuat daftar dengan 2 elemen, tetapi ketika kami membutuhkannya, daftar itu mudah diperluas. Hal lainnya adalah jika pada awalnya kita membuat daftar yang sangat kecil, maka operasi perluasan harus dilakukan lebih sering, dan ini menghabiskan sejumlah sumber daya. Dalam kuliah ini, kita hampir tidak membahas proses penghapusan elemen dari ArrayList. Tentu saja hal ini bukan karena kelupaan. Topik ini telah dipisahkan menjadi kuliah tersendiri, yang dapat Anda baca lebih lanjut :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION