Sepertinya arraylist
tidak melakukan tugasnya untuk mengatur:
// presizing
ArrayList<Integer> list = new ArrayList<Integer>(60);
Setelah itu ketika saya mencoba mengaksesnya:
list.get(5)
Alih-alih mengembalikan 0 itu melempar IndexOutOfBoundsException: Indeks 5 dari batas untuk panjang 0 .
Apakah ada cara untuk menginisialisasi semua elemen ke 0 dengan ukuran yang tepat seperti apa yang dilakukan C ++?
java
collections
Embun beku
sumber
sumber
Jawaban:
Bilangan bulat yang diteruskan ke konstruktor mewakili kapasitas awalnya , yaitu jumlah elemen yang dapat dipegang sebelum perlu mengubah ukuran array internal (dan tidak ada hubungannya dengan jumlah awal elemen dalam daftar).
Untuk menginisialisasi daftar dengan 60 nol Anda lakukan:
Jika Anda ingin membuat daftar dengan 60 objek berbeda , Anda bisa menggunakan Stream API dengan
Supplier
sebagai berikut:sumber
ArrayList
, dan sebaliknya hanya memprogram untukList
. Itu keputusan yang tersisa untuk OP, tentu saja.nCopies
tidak dapat diubah, jadi membuat yang baruArrayList
mungkin merupakan ide yang bagus.nCopies
objek yang kompleks, koleksi tidak dibuat dengan 60 objek yang berbeda, tetapi 60 kali dengan objek yang sama. Jadi hanya gunakan ini untuk primitif.nCopies
berguna dengan jenis referensi: objek tidak berubah seperti string, pola null-objek, konstanta enum, ... Pokoknya, saya memperbarui jawaban dengan solusi untuk membuat 60 objek yang berbeda.sumber
IndexOutOfBoundsException
denganList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
Arrays.asList
menghasilkan aList
yang tidak mengizinkan penambahan atau penghapusan, jadi itu tidak persis sama dengan apa yang diinginkan OP. Ini akan bekerja jika semua yang perlu Anda lakukan adalahset
, tetapi Anda mungkin lebih baik menggunakan array saja.60 yang Anda lewati hanyalah kapasitas awal untuk penyimpanan internal. Ini adalah petunjuk tentang seberapa besar Anda pikir itu mungkin, namun tentu saja itu tidak dibatasi oleh hal itu. Jika Anda perlu menetapkan nilai, Anda harus mengaturnya sendiri, misalnya:
sumber
Implementasi Java 8 (Daftar diinisialisasi dengan
60
nol) :new int[N]
- Membuat array yang diisi dengan nol & panjang Nboxed()
- setiap elemen dikotakkan ke Integercollect(Collectors.toList())
- Mengumpulkan elemen aliransumber
Tidak seperti itu. ArrayList hanya menggunakan array sebagai respentasi internal. Jika Anda menambahkan lebih dari 60 elemen maka array yang mendasari akan ditampilkan. Bagaimana pun Anda dapat menambahkan elemen ke array ini sebanyak RAM yang Anda miliki.
sumber