Java ArrayList vs Vector

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan memberi tumpuan kepada perbezaan antara ArrayList dan Vector kelas . Mereka berdua tergolong dalam Java Collections Framework dan melaksanakan antara muka java.util.List .

Walau bagaimanapun, kelas ini mempunyai perbezaan yang signifikan dalam pelaksanaannya.

2. Apa yang berbeza?

Sebagai permulaan yang cepat, mari kita bentangkan perbezaan utama ArrayList dan Vector. Kemudian, kita akan membincangkan beberapa perkara dengan lebih terperinci:

  • penyegerakan - Perbezaan utama pertama antara kedua-duanya. Vektor disegerakkan dan ArrayList tidak.
  • pertumbuhan saiz - Perbezaan lain antara keduanya adalah cara mereka mengubah ukuran sambil mencapai kapasiti mereka. The Vector beregu saiznya. Sebaliknya, ArrayList meningkat hanya dengan separuh panjangnya
  • iterasi - Dan Vektor boleh menggunakan Iterator dan Enumerasi untuk melintasi elemen. Sebaliknya, ArrayList hanya boleh menggunakan Iterator .
  • prestasi - Terutama kerana penyegerakan, operasi Vektor lebih perlahan jika dibandingkan dengan ArrayList
  • framework - Juga, ArrayList adalah sebahagian daripada kerangka Koleksi dan diperkenalkan di JDK 1.2. Sementara itu, Vector hadir di Java versi sebelumnya sebagai kelas warisan.

3. Vektor

Oleh kerana kami sudah mempunyai panduan lengkap mengenai ArrayList, kami tidak akan membincangkan API dan keupayaannya di sini. Sebaliknya, kami akan membentangkan beberapa butiran teras mengenai Vektor .

Ringkasnya , yang Vector adalah lokasi resizable . Ia boleh tumbuh dan menyusut semasa kita menambah atau membuang unsur-unsurnya.

Kita boleh membuat vektor dengan cara biasa:

Vector vector = new Vector();

Pembina lalai membuat Vektor kosong dengan kapasiti awal 10.

Mari tambah beberapa nilai:

vector.add("baeldung"); vector.add("Vector"); vector.add("example");

Dan akhirnya, mari kita ulangi nilai dengan menggunakan antara muka Iterator :

Iterator iterator = vector.iterator(); while (iterator.hasNext()) { String element = iterator.next(); // ... }

Atau, kita dapat melintasi Vektor menggunakan Penghitungan :

Enumeration e = vector.elements(); while(e.hasMoreElements()) { String element = e.nextElement(); // ... }

Sekarang, mari kita terokai beberapa ciri unik mereka dengan lebih mendalam.

4. Serentak

Kami telah menyebut bahawa ArrayList dan Vector berbeza dalam strategi serentak mereka, tetapi mari kita lihat lebih dekat. Sekiranya kita menyelami tandatangan kaedah Vektor , kita akan melihat bahawa masing-masing mempunyai kata kunci yang diselaraskan:

public synchronized E get(int index)

Ringkasnya, ini bermakna hanya satu utas yang dapat mengakses vektor tertentu pada satu masa .

Sungguh, bagaimanapun, penyegerakan peringkat operasi ini tetap perlu dilampirkan dengan penyegerakan kita sendiri untuk operasi kompaun.

Oleh itu, ArrayList mengambil pendekatan yang berbeza. Kaedahnya tidak diselaraskan dan kebimbangan itu dipisahkan menjadi kelas yang dikhaskan untuk bersamaan.

Sebagai contoh, kita boleh menggunakan CopyOnWriteArrayList atau Collections.synchronizedList untuk mendapatkan kesan yang serupa dengan Vector :

vector.get(1); // synchronized Collections.synchronizedList(arrayList).get(1); // also synchronized

5. Persembahan

Seperti yang telah kita bincangkan di atas, Vektor diselaraskan yang menyebabkan kesan langsung terhadap prestasi .

Untuk melihat perbezaan prestasi antara operasi Vektor berbanding ArrayList , mari tulis ujian penanda aras JMH yang mudah.

Pada masa lalu, kami telah melihat kerumitan waktu operasi ArrayList , jadi mari kita tambahkan kes ujian untuk Vector.

Pertama , mari kita menguji kaedah get () :

@Benchmark public Employee testGet(ArrayListBenchmark.MyState state) { return state.employeeList.get(state.employeeIndex); } @Benchmark public Employee testVectorGet(ArrayListBenchmark.MyState state) { return state.employeeVector.get(state.employeeIndex); }

Kami akan mengkonfigurasi JMH untuk menggunakan tiga utas dan 10 lelaran pemanasan.

Dan, mari kita laporkan mengenai purata masa setiap operasi pada tahap nanodetik:

Benchmark Mode Cnt Score Error Units ArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns/op ArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns/op

Kita dapat melihat bahawa ArrayList # get berfungsi kira-kira tiga kali lebih cepat daripada Vector # get .

Sekarang, mari kita bandingkan hasil operasi mengandung () :

@Benchmark public boolean testContains(ArrayListBenchmark.MyState state) { return state.employeeList.contains(state.employee); } @Benchmark public boolean testContainsVector(ArrayListBenchmark.MyState state) { return state.employeeVector.contains(state.employee); }

Dan cetak hasilnya:

Benchmark Mode Cnt Score Error Units ArrayListBenchmark.testContains avgt 20 8.665 ± 1.159 ns/op ArrayListBenchmark.testContainsVector avgt 20 36.513 ± 1.266 ns/op

Seperti yang dapat kita lihat, untuk operasi mengandung () , masa prestasi untuk Vector jauh lebih lama daripada ArrayList .

6. Ringkasan

Dalam artikel ini, kami melihat perbezaan antara kelas Vektor dan ArrayList di Java. Selain itu, kami juga mempersembahkan ciri-ciri Vektor dengan lebih terperinci.

Seperti biasa, kod lengkap untuk artikel ini terdapat di GitHub.