Anda dapat mengatur ukuran awal untuk ArrayList dengan melakukan
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Namun, Anda tidak bisa melakukannya
arr.add(5, 10);
karena menyebabkan pengecualian di luar batas.
Apa gunanya mengatur ukuran awal jika Anda tidak dapat mengakses ruang yang Anda alokasikan?
Fungsi add didefinisikan add(int index, Object element)
jadi saya tidak menambahkan ke indeks 10.
set/add
item n-1 .ArrayList
. Saya, secara pribadi, ingin metode yang memungkinkan saya untuk mengatur ukuran sedemikian rupa sehingga saya dapat menempatkan sesuatu pada indeks tertentu. Metode ini tampaknya tidak ada.Jawaban:
Anda mengacaukan ukuran daftar array dengan kapasitasnya:
Saat Anda menelepon
new ArrayList<Integer>(10)
, Anda mengatur kapasitas awal daftar , bukan ukurannya. Dengan kata lain, ketika dibangun dengan cara ini, daftar array mulai kosong.Salah satu cara untuk menambahkan sepuluh elemen ke daftar array adalah dengan menggunakan loop:
Setelah melakukan ini, Anda sekarang dapat memodifikasi elemen di indeks 0..9.
sumber
while(arr.size() < 10) arr.add(0);
Ini dapat bermanfaat untuk mengatakan, ukurannya harus setidaknya10
. mis. sehingga Anda dapat menggunakanarr.set(9, n);
Jika Anda ingin daftar dengan ukuran yang telah ditentukan, Anda juga dapat menggunakan:
sumber
List
penuh dengan nol. Dengan Guava kita bisa melakukanInts.asList(new int[10])
yang akan menginisialisasi daftar kita dengan0
s. Bersihkan pola, terima kasih untuk contohnya.ArrayList
adalah implementasi dariList
antarmuka danArrays.asList
mengembalikan sebuahArrayList
. Saya sarankan Anda mencari polimorfisme.UnsupportedOperationException
jika Anda ingin menggunakan Collections.fill (daftar, obj); untuk mengisi daftar dengan objek yang diulang atau Anda dapat menggunakan
salinan baris 10 kali 0 ke ArrayList Anda
sumber
Kapasitas suatu
ArrayList
tidak sama dengan ukurannya . Ukuran sama dengan jumlah elemen yang terkandung dalamArrayList
(danList
implementasi lainnya ).The kapasitas hanya panjang array yang mendasari yang digunakan untuk internaly menyimpan unsur-unsur
ArrayList
, dan selalu lebih besar atau sama dengan ukuran dari daftar.Saat memanggil
set(index, element)
daftar, iniindex
berkaitan dengan jumlah aktual elemen daftar (= ukuran) (yang merupakan nol dalam kode Anda, oleh karenaAIOOBE
itu dilemparkan), bukan dengan panjang array (= kapasitas) (yang merupakan detail implementasi spesifik keArrayList
).The
set
metode adalah umum untuk semuaList
implementasi, sepertiLinkedList
, yang tidak benar-benar dilaksanakan oleh sebuah array, tetapi sebagai rantai terkait entri.Sunting : Anda sebenarnya menggunakan
add(index, element)
metode ini, bukanset(index, element)
, tetapi prinsipnya sama di sini.sumber
Jika Anda ingin menambahkan elemen dengan indeks, Anda bisa menggunakan array.
sumber
10 adalah kapasitas awal AL, bukan ukuran (yaitu 0). Anda harus menyebutkan kapasitas awal ke beberapa nilai tinggi ketika Anda akan memiliki banyak elemen, karena itu menghindari overhead dari peningkatan kapasitas saat Anda terus menambahkan elemen.
sumber
Saya kira jawaban yang tepat untuk pertanyaan Anda adalah:
Mengatur ukuran awal pada ArrayList mengurangi nr. alokasi memori internal kali harus terjadi. Daftar ini didukung oleh sebuah array. Jika Anda menentukan kapasitas awal yaitu 0, sudah pada penyisipan pertama elemen array internal harus diubah ukurannya. Jika Anda memiliki gagasan perkiraan tentang berapa banyak elemen yang akan disimpan oleh daftar Anda, pengaturan kapasitas awal akan mengurangi angka. alokasi ulang memori yang terjadi saat Anda menggunakan daftar.
sumber
Ini mungkin membantu seseorang -
sumber
Terlambat dalam hal ini, tetapi setelah Java 8 , saya pribadi menemukan pendekatan berikut dengan
Stream
API lebih ringkas dan dapat menjadi alternatif untuk jawaban yang diterima .Sebagai contoh,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
di mana ukuran yang
size
diinginkanList
dan tanpa kerugian yang disebutkan di sini , semua elemen dalamList
diinisialisasi sebagai0
.(Saya melakukan pencarian cepat dan tidak melihat
stream
jawaban yang diposting - jangan ragu untuk memberi tahu saya jika jawaban ini berlebihan dan saya dapat menghapusnya)sumber
Saat ini tidak ada elemen dalam daftar Anda sehingga Anda tidak dapat menambahkan ke indeks 5 daftar ketika itu tidak ada. Anda mengacaukan kapasitas daftar dengan ukurannya saat ini.
Panggil saja:
untuk menambahkan Integer ke ArrayList Anda
sumber
Meskipun daftar array Anda memiliki kapasitas 10, daftar sebenarnya tidak memiliki elemen di sini. Metode add digunakan untuk menyisipkan elemen ke daftar nyata. Karena tidak memiliki elemen, Anda tidak dapat memasukkan elemen ke indeks 5.
sumber
Jika Anda ingin menambahkan 10 item ke Anda,
ArrayList
Anda dapat mencobanya:Jika Anda sudah mendeklarasikan variabel ukuran array, Anda akan menggunakan variabel
size
alih-alih angka '10'sumber
Saya dihadapkan dengan masalah yang sama, dan hanya mengetahui arrayList adalah implementasi array-resizable dari antarmuka Daftar, saya juga berharap Anda dapat menambahkan elemen ke titik mana pun, tetapi setidaknya memiliki opsi untuk menentukan ukuran awal. Bagaimanapun, Anda dapat membuat array terlebih dahulu dan mengonversinya menjadi daftar seperti:
atau
sumber
ArrayList myList = new ArrayList (10);
/ * Menyatakan kapasitas awal dari arraylist hanyalah menghemat waktu pergeseran secara internal; ketika kita menambahkan elemen secara internal itu memeriksa kapasitas untuk meningkatkan kapasitas, Anda bisa menambahkan elemen pada 0 indeks awalnya lalu 1 dan seterusnya. * /
sumber
Dua sen saya menyala
Stream
. Saya pikir lebih baik digunakandengan fleksibilitas untuk menempatkan nilai awal apa pun.
sumber