it-swarm-id.com

Masukkan di posisi mana saja di Java.util.List

Menurut dokumen Anda dapat menyisipkan objek posisi apa pun dalam Daftar:

Pengguna antarmuka ini memiliki kontrol yang akurat atas di mana dalam daftar setiap elemen dimasukkan.

(sumber: http://download.Oracle.com/javase/6/docs/api/Java/util/List.html )

Tetapi program berikut gagal dengan IndexOutOfBoundsException:

import Java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> myList = new ArrayList<String>();
        myList.add(0, "derp");
        myList.add(2, "herp");

        for (String s : myList) {
            System.out.println("Le string: " + s);
        }
    }
}

Ini tidak membantu mengatur kapasitas awal secara eksplisit, baik (yang masuk akal karena nilai default adalah 10).

Mengapa saya tidak bisa memasukkan objek di posisi apa pun asalkan indeksnya lebih rendah dari kapasitas? Apakah ukurannya selalu sama dengan jumlah elemen yang dimasukkan?

16
fiskeben

Anda dapat memasukkan objek pada posisi valid apa saja. Perhatikan Javadoc untuk add(int, E) :

Lempar:
IndexOutOfBoundsException - jika indeks di luar kisaran (index < 0 || index > size())

Dengan kata lain, memasukkan elemen selalu meningkatkan ukuran daftar dengan 1. Anda dapat memasukkan di kedua ujung, atau di tengah ... tetapi Anda tidak dapat memasukkan lampau akhir.

Kapasitas dari ArrayList secara efektif merupakan detail implementasi - ia mengontrol kapan array pendukung perlu diganti dengan yang lebih besar untuk mengatasi lebih banyak elemen. Size daftar adalah bagian penting di sini - daftar dengan kapasitas 100 tetapi ukuran 5 masih hanya daftar 5 elemen, dan memasukkan pada posisi 67 ke dalam daftar seperti itu tidak masuk akal.

24
Jon Skeet

Daftar kapasitas tidak sama dengan ukurannya.

Kapasitas adalah properti dari daftar yang didukung array (seperti ArrayList atau Vector), dan itu adalah ukuran yang dialokasikan dari array pendukung (yaitu, jumlah maksimum item yang dapat Anda masukkan sebelum perlu menumbuhkan struktur).

Ukurannya, seperti yang Anda katakan, adalah jumlah elemen yang ada dalam daftar.

Lalu, mengapa Anda tidak dapat memasukkan elemen di mana pun Anda inginkan asalkan ada ruang untuknya? Sederhana, karena antarmuka List tidak menentukan bagaimana objek didukung, dan Anda tidak dapat melakukannya dalam sesuatu seperti LinkedList; jadi perilaku homogen (dan benar) adalah untuk melemparkan pengecualian ketika itu terjadi.

Jadi, Anda memiliki dua opsi:

  • Inisialisasi daftar dengan benar dengan menambahkan nilai default hingga ukuran yang Anda inginkan.
  • Jika null adalah nilai default yang masuk akal untuk Anda, Anda dapat menggunakan array secara langsung.
2
fortran

myList.add (2, "herp") harus myList.add (1, "herp")

Karena meningkatkan ukuran Daftar adalah 1, bukan 2.

1
Yuhua Liu

ArrayList memiliki dua anggota: kapasitas dan ukuran

kapasitas adalah panjang array yang mendasarinya, ukuran adalah panjang array yang diwakili ArrayList

jadi Anda harus menambahkan data dalam daftar, sehingga ArrayList itu sendiri mendapatkan ukuran di mana Anda ingin memasukkan data

0
Hachi

Ukuran daftar adalah Selalu sama dengan jumlah elemen yang dimasukkan

Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

javadoc

0
pbanfi

myList.add(0, "herp") pertama akan dimasukkan kemudian akan memeriksa ukurannya. Kemudian, ukurannya adalah 1 tetapi Anda memasukkan pada posisi 2.