Kita dapat menentukan panjang ArrayList<E>
menggunakan metode publiknya size()
, seperti
ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();
Demikian pula kita dapat menentukan panjang suatu Array
objek menggunakan length
properti
String[] str = new String[10];
int size = str.length;
Sedangkan size()
metode ArrayList
didefinisikan di dalam ArrayList
kelas, di mana length
properti ini Array
didefinisikan?
Jawaban:
Array adalah objek khusus di Jawa, mereka memiliki atribut sederhana bernama
length
yangfinal
.Tidak ada "definisi kelas" dari sebuah array (Anda tidak dapat menemukannya dalam file .class apa pun), mereka adalah bagian dari bahasa itu sendiri.
Sumber:
sumber
ArrayList.size()
menyediakan jumlah objek yang sebenarnya disimpan dalam array sedangkanmyArray.length
([]
) menyediakan "kapasitas". Artinya, jika untukmyArray = new int[10];
, ia mengembalikan 10. Ini bukan jumlah objek yang Anda masukkan ke dalam array.List
karena itu menggunakan array dalam implementasinya.Ini "khusus" pada dasarnya, dengan instruksi bytecode sendiri:
arraylength
. Jadi metode ini:dikompilasi menjadi bytecode seperti ini:
Jadi itu tidak diakses seolah-olah itu adalah bidang normal. Memang, jika Anda mencoba untuk mendapatkannya seolah-olah itu adalah bidang normal, seperti ini, gagal:
Sayangnya, deskripsi JLS untuk setiap jenis array yang memiliki bidang akhir publik
length
agak menyesatkan :(sumber
int[]
ketika obat generik tidak berlaku untuk tipe primitif? (Dan, sih, obat generik tidak ada untuk waktu yang lama.) Anda bisa pergi tanpa array dengan menggunakan daftar tertaut untuk semua koleksi, tetapi itu akan sangat buruk untuk efisiensi.StringBuffer
Kelas itu sendiri, ya - karena kelas ini memiliki referensi kechar[]
(atau memang, setidaknya; saya tidak tahu apakah masih ada, begitu saja). Jadi, sementara aStringBuilder
bertanggung jawab untuk lebih banyak memori, ukuran dan tata letaknya langsung diperbaiki.Ini didefinisikan dalam spesifikasi bahasa Java :
Karena ada jumlah tipe array yang tidak terbatas (untuk setiap kelas ada tipe array yang sesuai, dan kemudian ada array multidimensi), mereka tidak dapat diimplementasikan dalam file kelas; JVM harus melakukannya dengan cepat.
sumber
Meskipun ini bukan jawaban langsung untuk pertanyaan, ini merupakan tambahan dari argumen
.length
vs..size()
Saya sedang meneliti sesuatu yang berkaitan dengan pertanyaan ini, jadi ketika saya menemukan itu, saya perhatikan bahwa definisi yang diberikan di sinitidak "tepat" benar.
Panjang bidang berisi jumlah tempat yang tersedia untuk meletakkan komponen, bukan jumlah komponen yang ada dalam array. Jadi itu mewakili total memori yang tersedia dialokasikan untuk array itu, bukan berapa banyak memori yang diisi.
Contoh:
Keluaran:
Namun,
.size()
propertiArrayList
tidak memberikan jumlah elemen dalam daftar:Keluaran:
sumber
null
dan elemen yang tidak nol. Tetapi perbedaannya tidak berhasil. Bagaimanapun, thesize()
(katakanlah) aList
dapat menyertakannull
nilai juga.size
berperilaku dinamis, sementara itulength
adalah properti statis ... fakta bahwa sisa ruang yang tidak terisi dalam sebuah array akan diinisialisasi ke " Nilai Non " (tergantung pada jenisnya) tidak benar-benar bertentangan dengan titik ini.itu adalah bidang final publik, yang berisi jumlah komponen array (panjangnya bisa positif atau nol)
Dengan demikian, array memiliki bidang dan metode publik yang sama dengan kelas berikut:
info lebih lanjut di
10.7 Anggota Array
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
sumber
Untuk menjawabnya apa adanya, di mana properti panjang array ini didefinisikan ? Secara khusus
Object header
.Mudah dilihat melalui JOL
Salah satu baris dari output ini adalah:
Biasanya Objek memiliki dua header (tanda dan klass), array memiliki satu lagi yang selalu menempati
4 bytes
panjangnya, sepertisize
sebuahint
.sumber
Panjang kata kunci bertindak seperti data yang diajukan didefinisikan. Saat menggunakan dalam sebuah array, kita dapat menggunakannya untuk mengakses berapa banyak elemen dalam sebuah array. Mengenai String [], kita dapat memanggil metode length () yang didefinisikan dalam kelas String. Berkenaan dengan ArrayList, kita dapat menggunakan metode size () yang didefinisikan dalam ArrayList. Perhatikan bahwa saat membuat daftar array dengan ArrayList <> (kapasitas), ukuran awal () dari daftar array ini adalah nol karena tidak ada elemen.
sumber