Java ArrayList vs Vector

1. Ikhtisar

Dalam tutorial ini, kita akan fokus pada perbedaan antara ArrayList dan Vector kelas . Keduanya termasuk dalam Java Collections Framework dan mengimplementasikan antarmuka java.util.List .

Namun, kelas-kelas ini memiliki perbedaan yang signifikan dalam penerapannya.

2. Apa yang Berbeda?

Sebagai permulaan cepat, mari kita sajikan perbedaan utama ArrayList dan Vector. Kemudian, kami akan membahas beberapa poin lebih detail:

  • sinkronisasi - Perbedaan besar pertama antara keduanya. Vektor disinkronkan dan ArrayList tidak.
  • pertumbuhan ukuran - Perbedaan lain antara keduanya adalah cara mereka mengubah ukuran sambil mencapai kapasitasnya. The Vector ganda ukurannya. Sebaliknya, ArrayList hanya bertambah setengah dari panjangnya
  • iterasi - Dan Vektor dapat menggunakan Iterator dan Enumerasi untuk melintasi elemen. Di sisi lain, ArrayList hanya dapat menggunakan Iterator .
  • kinerja - Sebagian besar karena sinkronisasi, operasi Vektor menjadi lebih lambat jika dibandingkan dengan ArrayList
  • framework - Selain itu, ArrayList adalah bagian dari framework Koleksi dan diperkenalkan di JDK 1.2. Sementara itu, Vektor hadir di versi Java sebelumnya sebagai kelas warisan.

3. Vektor

Karena kami sudah memiliki panduan lengkap tentang ArrayList, kami tidak akan membahas API dan kemampuannya di sini. Di sisi lain, kami akan menyajikan beberapa detail inti tentang Vektor .

Sederhananya , sebuah Vector adalah array resizable . Itu bisa tumbuh dan menyusut saat kita menambah atau menghapus elemen.

Kita dapat membuat vektor dengan cara yang khas:

Vector vector = new Vector();

Konstruktor default membuat Vektor kosong dengan kapasitas awal 10.

Mari tambahkan beberapa nilai:

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

Dan terakhir, mari kita ulangi nilai-nilai dengan menggunakan antarmuka Iterator :

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

Atau, kita dapat melintasi Vektor menggunakan Pencacahan :

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

Sekarang, mari jelajahi beberapa fitur unik mereka secara lebih mendalam.

4. Konkurensi

Kami telah menyebutkan bahwa ArrayList dan Vector berbeda dalam strategi konkurensi, tetapi mari kita lihat lebih dekat. Jika kita menyelami tanda tangan metode Vector , kita akan melihat bahwa masing-masing memiliki kata kunci yang disinkronkan:

public synchronized E get(int index)

Sederhananya, ini berarti hanya satu utas yang dapat mengakses vektor tertentu dalam satu waktu .

Sungguh, bagaimanapun, sinkronisasi tingkat operasi ini tetap perlu di-overlay dengan sinkronisasi kita sendiri untuk operasi gabungan.

Jadi sebaliknya, ArrayList mengambil pendekatan yang berbeda. Metodenya tidak disinkronkan dan perhatian itu dipisahkan menjadi kelas yang dikhususkan untuk konkurensi.

Misalnya, kita dapat menggunakan CopyOnWriteArrayList atau Collections.synchronizedList untuk mendapatkan efek yang mirip dengan Vector :

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

5. Kinerja

Seperti yang telah kita bahas di atas, Vektor disinkronkan yang menyebabkan dampak langsung pada kinerja .

Untuk melihat perbedaan kinerja antara operasi Vector versus ArrayList , mari kita tulis pengujian benchmark JMH sederhana.

Di masa lalu, kita telah melihat kompleksitas waktu dari operasi ArrayList , jadi mari tambahkan kasus uji untuk Vector.

Pertama , mari kita uji metode 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 iterasi pemanasan.

Dan, mari kita laporkan waktu rata-rata per operasi pada tingkat 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 bahwa ArrayList # get bekerja sekitar tiga kali lebih cepat daripada Vector # get .

Sekarang, mari bandingkan hasil dari operasi contains () :

@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 bisa kita lihat, untuk operasi contains () , waktu kinerja untuk Vektor jauh lebih lama daripada ArrayList .

6. Ringkasan

Pada artikel ini, kita telah melihat perbedaan antara kelas Vector dan ArrayList di Java. Selain itu, kami juga menyajikan fitur Vektor dengan lebih detail.

Seperti biasa, kode lengkap untuk artikel ini tersedia di GitHub.