Apa perbedaan antara ArrayList dan Vector?

352

Apa perbedaan antara dua struktur data ArrayList dan Vector , dan di mana Anda harus menggunakan masing-masing?

KushalP
sumber
5
Saya tidak melihat duplikat yang tepat di sini.
Jeff Atwood
2
Nah, Anda dapat membuat vektor di java juga - Vector v = new Vector(3, 2);
sgsi
Tidak pernah digunakan Vector, penggunaan ArrayListatau LinkedListatauArrayDeque

Jawaban:

365

Perbedaan

  • Vektor disinkronkan, ArrayLists tidak.
  • Metode Pertumbuhan Data

Gunakan ArrayLists jika tidak ada persyaratan khusus untuk menggunakan Vektor.

Sinkronisasi

Jika beberapa utas mengakses ArrayList secara bersamaan, maka kita harus menyinkronkan secara eksternal blok kode yang memodifikasi daftar baik secara struktural atau hanya memodifikasi suatu elemen. Modifikasi struktural berarti penambahan atau penghapusan elemen dari daftar. Pengaturan nilai elemen yang ada bukanlah modifikasi struktural.

Collections.synchronizedList biasanya digunakan pada saat pembuatan daftar untuk menghindari akses tidak disinkronkan tidak disengaja ke daftar.

Referensi

Pertumbuhan data

Secara internal, ArrayList dan Vector memegang konten mereka menggunakan Array. Ketika sebuah elemen dimasukkan ke dalam ArrayList atau Vektor, objek perlu memperluas array internal jika kehabisan ruang. A Vector default untuk menggandakan ukuran array, sedangkan ArrayList meningkatkan ukuran array sebesar 50 persen.

Referensi

Sev
sumber
7
@Rei Persis apa yang dia katakan: Banyak utas ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
RecursiveExceptionException
Bagaimana dengan MEMBACA dari ArrayList dengan cara multithreaded? Apakah itu aman?
Xunie
@Xunie Membaca dari ArrayList atau kelas koleksi lainnya tidak pernah menjadi masalah. Masalah muncul ketika Anda menambahkan atau menghapus atau mengubah nilai yang ada ke ArrayList atau koleksi.
sainath reddy
85

Seperti yang dikatakan dalam dokumentasi, a Vectordan a ArrayListhampir setara. Perbedaannya adalah bahwa akses ke a Vectordisinkronkan, sedangkan akses ke ArrayListtidak. Artinya, hanya satu utas yang dapat memanggil metode pada Vectorsuatu waktu, dan ada sedikit overhead dalam memperoleh kunci; jika Anda menggunakan ArrayList, ini tidak terjadi. Secara umum, Anda ingin menggunakan ArrayList; dalam kasing tunggal itu pilihan yang lebih baik, dan kasing multi-ulir, Anda mendapatkan kontrol yang lebih baik atas penguncian. Ingin mengizinkan bacaan bersamaan? Baik. Ingin melakukan satu sinkronisasi untuk sepuluh penulisan? Juga baik-baik saja. Memang membutuhkan sedikit lebih banyak perawatan pada Anda, tetapi kemungkinan apa yang Anda inginkan. Perhatikan juga bahwa jika Anda memiliki ArrayList, Anda dapat menggunakanCollections.synchronizedListberfungsi untuk membuat daftar yang disinkronkan, sehingga membuat Anda setara dengan Vector.

Antal Spector-Zabusky
sumber
53

Vectoradalah kelas rusak yang bukan threadsafe, meskipun sedang "disinkronkan" dan hanya digunakan oleh siswa dan pemrogram berpengalaman lainnya.

ArrayList adalah implementasi daftar masuk yang digunakan oleh para profesional dan pemrogram berpengalaman.

Profesional yang menginginkan implementasi Threadsafe List menggunakan a CopyOnWriteArrayList.

Bohemian
sumber
10
disinkronkan tetapi tidak threadsafe? apa artinya? [Saya pemula]
Dineshkumar
13
@Dineshkumar Vectoritu dimaksudkan untuk menjadi benang, namun memiliki cacat desain yang membuatnya * tidak sebenarnya thread, Ini pada dasarnya adalah kelas ditinggalkan. Untuk beberapa alasan, universitas dll belum pernah mendengar tentang berita ini dan masih menganjurkan penggunaannya.
Bohemian
1
@Dineshkumar melihat pertanyaan ini
Bohemian
3
@Dineshkumar maaf - itu bukan tautan yang bagus inilah jawaban yang pasti . Singkatnya, sinkronisasi tidak berguna.
Bohemian
7
Fakta menyenangkan: Stack of Java1.7 menggunakan kelas Vector.
Tobi
26

ArrayList lebih baru dan 20-30% lebih cepat.

Jika Anda tidak membutuhkan sesuatu yang terlihat jelas Vector, gunakanArrayList

Oli
sumber
32
Bisakah Anda mendukung klaim dengan memberikan bukti 20-30% faster?
pengguna
5
@ Pengguna Pada saat itu hanya pengalaman pribadi dari clunking aroun array besar. Lebih dari tiga tahun sekarang, saya tidak bisa mengarahkan Anda ke apa yang saya bicarakan, tetapi ada banyak tolok ukur di luar sana. Tidak sampai threading di mana Anda melihat lompatan terbesar tetapi di sini adalah satu: javacodegeeks.com/2010/08/...
Oli
20-30% hanya cocok, jika Anda membaca DAN menulis ke Vector / Arraylist, karena fungsi pertumbuhan akan membuat dampak terbesar. Jika Anda memiliki tolok ukur yang hanya menulis sekali dan kemudian melakukan pembacaan hanya akan memberikan hasil yang berbeda
Tobi
2
Harap berikan bukti ke data Anda
wiredmark
Karena vektor disinkronkan dan arraylist tidak disinkronkan, itu mungkin menjadi alasan, arraylist lebih cepat daripada vektor.
MEMINTA
23

Ada 2 perbedaan utama antara Vector dan ArrayList.

  1. Vektor disinkronkan secara default, dan ArrayList tidak. Catatan: Anda dapat membuat ArrayList juga disinkronkan dengan mengirimkan objek arraylist ke metode Collections.synchronizedList (). Berarti disinkronkan: dapat digunakan dengan banyak utas tanpa efek samping apa pun.

  2. ArrayLists tumbuh sebesar 50% dari ukuran sebelumnya ketika ruang tidak cukup untuk elemen baru, sedangkan Vector akan tumbuh sebesar 100% dari ukuran sebelumnya ketika tidak ada ruang untuk elemen baru yang masuk.

Selain ini, ada beberapa perbedaan praktis di antara mereka, dalam hal upaya pemrograman:

  1. Untuk mendapatkan elemen di lokasi tertentu dari Vector, kami menggunakan fungsi elementAt (int index). Nama fungsi ini sangat panjang. Di tempat ini di ArrayList kita mendapatkan (int index) yang sangat mudah diingat dan digunakan.
  2. Demikian pula untuk mengganti elemen yang sudah ada dengan elemen baru dalam Vector, kami menggunakan metode setElementAt (), yang lagi-lagi sangat panjang dan dapat mengganggu programmer untuk menggunakan berulang kali. Di tempat ArrayList ini memiliki metode add (int index, object) yang mudah digunakan dan diingat. Seperti ini mereka memiliki lebih banyak nama programmer yang ramah dan mudah digunakan di ArrayList.

Kapan harus menggunakan yang mana?

  1. Cobalah untuk menghindari penggunaan Vektor sepenuhnya. ArrayLists dapat melakukan semua yang dapat dilakukan oleh Vector. Lebih dari ArrayLists secara default tidak disinkronkan. Jika Anda mau, Anda bisa menyinkronkannya kapan pun Anda butuhkan dengan menggunakan Collections util class.
  2. ArrayList mudah diingat dan menggunakan nama fungsi.

Catatan : meskipun arraylist bertambah 100%, Anda dapat menghindari ini dengan metode ensurecapacity () untuk memastikan bahwa Anda mengalokasikan memori yang cukup pada tahap awal itu sendiri.

Semoga ini bisa membantu.

pengguna1923551
sumber
5
Info salah (diaktifkan) pada ukuran tumbuh untuk ArrayLIst dan Vektor, jika tidak, jawabnya cukup bagus.
Nenad Bulatovic
Tumbuhnya Vector menggandakan dengan dokumen yang diperlukan docs.oracle.com/javase/7/docs/api/java/util/Vector.html sementara ArrayList "Rincian kebijakan pertumbuhan tidak ditentukan di luar fakta bahwa menambahkan elemen memiliki biaya waktu diamortisasi konstan. " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib
Saya tidak mengerti bagaimana nama metode bisa menjadi kriteria untuk menggunakan atau tidak menggunakan metode itu.
Surender Kherwa
14

ArrayListdan Vectorkeduanya mengimplementasikan antarmuka Daftar dan mempertahankan urutan penyisipan. Tetapi ada banyak perbedaan antara ArrayListdan Vector...

ArrayList -

  1. ArrayList tidak disinkronkan.
  2. ArrayList bertambah 50% dari ukuran array saat ini jika jumlah elemen melebihi kapasitasnya.
  3. ArrayList bukan kelas warisan, ini diperkenalkan di JDK 1.2.
  4. ArrayList cepat karena tidak disinkronkan.
  5. ArrayList menggunakan antarmuka Iterator untuk melintasi elemen.

Vektor -

  1. Vector disinkronkan.
  2. Vector kenaikan 100% berarti menggandakan ukuran array jika jumlah elemen melebihi kapasitasnya.
  3. Vector adalah kelas warisan.

  4. Vector lambat karena disinkronkan yaitu dalam lingkungan multithreading, itu akan menahan utas lainnya dalam keadaan runnable atau non-runnable sampai utas saat ini melepaskan kunci objek.

  5. Vectormenggunakan antarmuka enumerasi untuk melintasi elemen. Tetapi bisa menggunakan Iterator juga.

Lihat Juga: https://www.javatpoint.com/difference-between-arraylist-and-vector

roottraveller
sumber
10

Pada dasarnya ArrayList dan Vector keduanya menggunakan Object Array internal.

ArrayList: Kelas ArrayList memperluas AbstractList dan mengimplementasikan antarmuka Daftar dan RandomAccess (antarmuka penanda). ArrayList mendukung array dinamis yang dapat tumbuh sesuai kebutuhan. Ini memberi kita iterasi pertama atas elemen. ArrayList menggunakan Object Array internal; mereka dibuat dengan ukuran awal default 10. Ketika ukuran ini terlampaui, koleksi secara otomatis meningkat menjadi setengah dari ukuran default yaitu 15.

Vektor: Vektor mirip dengan ArrayList tetapi perbedaannya adalah, disinkronkan dan ukuran awal default adalah 10 dan ketika ukurannya melebihi ukurannya meningkat dua kali lipat dari ukuran aslinya yang berarti ukuran baru akan menjadi 20. Vektor adalah satu-satunya kelas selain ArrayList untuk mengimplementasikan RandomAccess. Vektor memiliki empat konstruktor dari yang satu mengambil dua parameter Vector (kapasitas inisialisasi, kapasitas int). Peningkatan adalah jumlah dengan mana kapasitas meningkat ketika vektor meluap, sehingga memiliki kontrol lebih besar atas faktor beban.

Beberapa perbedaan lainnya adalah: masukkan deskripsi gambar di sini

subhashis
sumber
1
Mengapa menambahkan objek pada awalnya dan pada akhirnya di LinkedList lambat? Bukankah lebih cepat dari KEDUA arrayList dan vektor?
CHANist
@CHAN saya setuju juga. Menambahkan objek di awal dan akhir harus lebih cepat daripada menambahkan objek di tengahnya.
Rahul Rastogi
1
Bahasa yang digunakan di kolom LinkedList dari tabel ini kontradiktif. Baik prepending dan menambahkan ke LinkedList lebih cepat daripada menambahkan elemen di tengah, tetapi lebih lambat dari prepending atau menambahkan ke ArrayLists atau Vektor. Ini karena setiap penyisipan membutuhkan alokasi memori dengan referensi non-lokal, sehingga meningkatkan kemungkinan cache gagal. Meskipun pencarian dalam LinkedList adalah linier dengan jumlah elemen dan pointer ke ujungnya tidak disimpan, menambahkan masih lebih cepat daripada melakukan prabayar karena memori hanya dialokasikan kembali untuk satu elemen.
Sophia Gold