Mengapa kelas Java Vector (dan Stack) usang atau ketinggalan zaman?

Mengapa Java Vector dianggap usang, usang atau ketinggalan zaman?

Apakah ini digunakan saat bekerja dengan concurrency?

Dan jika saya tidak ingin menyinkronkan objek secara manual dan hanya ingin menggunakan koleksi thread-safe tanpa harus membuat salinan baru dari array yang mendasarinya (seperti halnya CopyOnWriteArrayList ), dapatkah saya menggunakan Vector ?

Bagaimana dengan Stack , yang merupakan subkelas Vector yang harus saya gunakan sebagai pengganti?

615
06 сент. ditetapkan oleh fjsj pada 06 September . 2009-09-06 21:04 '09 pada 21:04 2009-09-06 21:04
@ 5 balasan

Vector menyinkronkan setiap operasi individu. Ini hampir tidak pernah ingin Anda lakukan.

Biasanya, Anda ingin menyinkronkan seluruh urutan operasi. Sinkronisasi masing-masing operasi kurang aman (jika Anda melakukan iterasi pada suatu Vector , misalnya, Anda masih perlu menghapus kunci sehingga tidak ada orang lain yang mengubah koleksi pada saat yang sama, yang akan menghasilkan ConcurrentModificationException di utas iterasi), tetapi juga lebih lambat (mengapa lepaskan kuncinya lagi, kapan mungkin akan cukup)?

Tentu saja, itu juga memblokir overhead, bahkan jika Anda tidak membutuhkannya.

Pada prinsipnya, ini adalah pendekatan yang sangat keliru untuk sinkronisasi dalam kebanyakan situasi. Seperti dicatat oleh Mr. Brian Henk , Anda dapat menghias koleksi menggunakan panggilan seperti Collections.synchronizedList - fakta bahwa Vector bergabung sebagai implementasi dari serangkaian "array yang dimodifikasi" dengan bit "sinkronisasi setiap operasi" adalah contoh lain dari desain yang buruk ; Pendekatan untuk dekorasi memberikan pemisahan masalah yang lebih jelas.

Adapun setara Stack , saya akan melihat Deque / ArrayDeque sebagai permulaan.

605
06 сент. Membalas Jon Skeet 06 Sep 2009-09-06 21:07 '09 pada 21:07 2009-09-06 21:07

Vektor adalah bagian 1.0 - implementasi awal memiliki dua kelemahan:

1. Penamaan: - ini benar-benar daftar yang dapat diakses sebagai array, jadi Anda harus menyebutnya ArrayList (yang merupakan pengganti untuk koleksi Java 1.2 untuk Vector ).

2. Konkurensi: Semua metode get() , set() synchronized , sehingga Anda tidak dapat memiliki kontrol sinkronisasi berbutir halus.

Tidak ada banyak perbedaan antara ArrayList dan Vector , tetapi Anda harus menggunakan ArrayList .

Dari dokumen API.

Seperti pada platform Java 2 v1.2, kelas ini telah ditingkatkan untuk mengimplementasikan. Menghitung antarmuka, menjadikannya anggota kerangka koleksi Java. Tidak seperti implementasi koleksi baru, Vector disinkronkan.

74
06 сент. Jawabannya diberikan oleh Justin 06 Sep. 2009-09-06 21:12 '09 jam 9:12 malam 2009-09-06 21:12

Selain jawaban yang sudah diungkapkan tentang penggunaan Vector, Vector juga memiliki banyak metode yang berkaitan dengan penghitungan dan pengambilan elemen yang berbeda dari antarmuka Daftar, dan pengembang (terutama mereka yang telah mempelajari Java sebelum 1.2) dapat menggunakannya jika mereka berada dalam kode. Meskipun pencacahan dilakukan lebih cepat, mereka tidak memeriksa apakah koleksi telah dimodifikasi selama iterasi, yang dapat menyebabkan masalah, dan mengingat bahwa vektor dapat dipilih untuk menyinkronkannya - jika ada akses bersamaan dari beberapa utas, ini membuatnya menjadi masalah yang sangat destruktif. Menggunakan metode ini juga menautkan banyak kode ke Vektor, sehingga tidak akan mudah untuk menggantinya dengan implementasi Daftar lainnya.

40
06 сент. Jawabannya diberikan Yishai 06 Sep. 2009-09-06 23:53 '09 pada 23:53 2009-09-06 23:53

Anda bisa menggunakan metode SyncedCollection / List di java.util.Collection untuk mendapatkan koleksi thread-safe dari tidak aman.

14
06 сент. Jawabannya diberikan oleh Brian Henk 06 Sep 2009-09-06 21:07 '09 pada 21:07 2009-09-06 21:07

java.util.Stack mewarisi overhead sinkronisasi java.util.Stack , yang biasanya tidak dibenarkan.

Dia mewarisi lebih dari itu. Fakta bahwa java.util.Stack extends java.util.Vector adalah kesalahan dalam desain berorientasi objek. Purist akan memperhatikan bahwa ia juga menawarkan banyak metode selain operasi yang secara tradisional berhubungan dengan stack (yaitu: push, pop, peek, size). Dimungkinkan juga untuk melakukan search , elementAt , setElementAt , remove dan banyak operasi lainnya dengan akses acak. Pada dasarnya tergantung pada pengguna untuk tidak menggunakan operasi tanpa stack stack.

Untuk sasaran pengembangan dan OOP ini, JavaDoc untuk java.util.Stack merekomendasikan ArrayDeque sebagai pengganti alami. (Deque lebih dari sekadar tumpukan, tetapi setidaknya itu terbatas pada memanipulasi kedua ujungnya, bukan kemampuan untuk mengakses semuanya secara acak.)

4
13 февр. jawabannya diberikan 200_sukses 13 Feb. 2016-02-13 00:04 '16 pada 0:04 2016-02-13 00:04

Pertanyaan lain tentang atau Ajukan pertanyaan