Perbandingan vektor dan arraylist java
Hari ini saya mempelajari kode sumber vektor dan arraylist, dan memperdalam pemahaman saya tentang dua kelas ini.
Ada tiga kelas yang diterapkan dalam antarmuka daftar: ArrayList, Vector, dan LinkedList. Saya tidak akan banyak bicara tentang LinkedList, umumnya digunakan untuk mempertahankan urutan penyisipan data.
ArrayList dan Vector keduanya diimplementasikan menggunakan array, dan ada tiga perbedaan utama:
1. Vektor multi-threaded dan aman, sedangkan arraylist tidak. Ini dapat dilihat dari kode sumber. Banyak metode dalam kelas vektor dimodifikasi dengan disinkronkan, yang mengarah pada efisiensi vektor yang tidak dapat dibandingkan dengan arraylist;
2. Keduanya menggunakan elemen penyimpanan ruang kontinu linier, tetapi ketika ruang tidak cukup, kedua kelas ditambahkan secara berbeda. Banyak netizen mengatakan bahwa vektor menggandakan ruang asli, dan arraylist meningkatkan ruang asli sebesar 50%. Bahkan, ini hampir sama. Namun, masih ada beberapa masalah yang dapat dilihat dari kode sumber, dan itu akan dianalisis dari kode sumber nanti.
3. Vektor dapat mengatur faktor pertumbuhan, tetapi arraylist tidak bisa. Ketika saya pertama kali melihat ini, saya tidak mengerti apa faktor tambahan itu. Namun, saya mengerti ini dengan membandingkan dua kode sumber. Pertama -tama mari kita lihat metode konstruksi dari dua kelas:
ArrayList memiliki tiga metode konstruksi:
Public ArrayList (int InitialCapacity) // Bangun daftar kosong dengan kapasitas awal yang ditentukan. Public ArrayList () // Bangun daftar kosong dengan kapasitas awal 10. Public ArrayList (Collection <? Extends E> C) // Bangun daftar elemen yang berisi koleksi yang ditentukan
Vektor memiliki empat konstruktor:
Vektor publik () // Bangun vektor kosong menggunakan peningkatan kapasitas awal dan kapasitas yang ditentukan sama dengan nol. Vektor publik (int initialcapacity) // Bangun vektor kosong untuk membuat ukuran array data internalnya, dan kenaikan kapasitas standarnya adalah nol. Vektor publik (pengumpulan <? Extends e> c) // Bangun elemen yang mengandung vektor dalam koleksi vektor publik yang ditentukan (int initialcapacity, int kapasitas intercrement) // Bangun vektor kosong menggunakan kapasitas awal yang ditentukan dan peningkatan kapasitas yang ditentukan
Vektor memiliki satu metode konstruksi lebih dari ArrayList. Itu benar, metode konstruksi vektor publik (int initialcapacity, int capityincrement). Kapasitas Increment adalah pertumbuhan kapasitas, yang merupakan faktor pertumbuhan yang disebutkan di atas, yang tidak tersedia di ArrayList.
Kemudian posting dua kelas untuk menambahkan analisis kode sumber (versi JDK1.7):
// ArrayList kelas menambahkan kode sumber: public boolean add (e e) {ensureCapacityinternal (ukuran + 1); // Menambah ModCount !! elementData [size ++] = e; Kembali Benar; } private void ensureCapacityInternal (int mincapacity) {modcount ++; // Overflow-Consent Code // Jika setelah menambahkan elemen, ukuran wadah baru lebih besar dari kapasitas wadah, maka nilainya tidak dapat disimpan. Ruang perlu diperluas jika (MINCAPASICASI - ELEMENTDDATA.Length> 0) tumbuh (MinCapacity); } private void grow (int mincapacity) {// overflow-konsisten kode int oldcapacity = elementData.length; int newcapacity = oldcapacity + (oldcapacity >> 1); // Ruang ekspansi meningkat sebesar 50% (yaitu, 1,5 kali aslinya) jika (Newcapacity - MinCapacity <0) // Jika wadah masih belum cukup setelah ekspansi, maka cukup atur kapasitas Minsn ke ukuran wadah newcapacity = mincapacity; if (newcapacity - max_array_size> 0) // Jika wadah yang diperluas terlalu besar, maka jalankan hugeCapacity newcapacity = hugeCapacity (mincapacity); // MinCapacity biasanya mendekati ukuran, jadi ini adalah win: elementData = arrays.copyof (elementData, newcapacity); } Tambahkan kode sumber ke kelas vektor:
public yang disinkronkan boolean add (e e) {modcount ++; EnsureCapacityHelper (ElementCount + 1); elementData [elementcount ++] = e; Kembali Benar; } private void ensureCapacityHelper (int mincapacity) {// overflow -consent code if (mincapacity - elementData.length> 0) Grow (mincapacity); } private void grow (int mincapacity) {// overflow-konsisten kode int oldcapacity = elementData.length; int newcapacity = oldcapacity + ((CapasityIncrement> 0)? CapasityIncrement: OldCapacity); /** Ekspansi kapasitas ini membutuhkan penilaian: Jika kenaikan kapasitas tidak diinisialisasi dengan 0, yaitu, inisialisasi konstruktor vektor publik (int initialkapacity, INT CapasityIncrement), maka kapasitas ekspansi kapasitas adalah (kapasitas tua+kapasitas), yang merupakan nilai kapasitas asli ditambah peningkatan kapasitas; Jika kenaikan kapasitas tidak ditetapkan, maka kapasitas setelah ekspansi adalah (Oldcapacity+Oldcapacity), yang dua kali lipat kapasitas asli. ? if (newcapacity - max_array_size> 0) newcapacity = hugeCapacity (mintcapacity); elementData = arrays.copyof (elementData, newcapacity); }Melalui analisis, itu harus dimengerti sekarang!
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!