Vektor atau ArrayList - yang mana lebih baik?

S: Vektor atau ArrayList - mana yang lebih baik dan mengapa?

J: Kadang-kadang Vectorlebih baik; kadang-kadang ArrayListlebih baik; kadangkala anda juga tidak mahu menggunakan. Saya harap anda tidak mencari jawapan yang mudah kerana jawapannya bergantung pada apa yang anda lakukan. Terdapat empat faktor yang perlu dipertimbangkan:

  • API
  • Penyegerakan
  • Pertumbuhan data
  • Corak penggunaan

Mari kita meneroka masing-masing secara bergiliran.

API

Dalam Bahasa Pengaturcaraan Java (Addison-Wesley, Jun 2000) Ken Arnold, James Gosling, dan David Holmes menggambarkannya Vectorsebagai analog dengan bahasa ArrayList. Oleh itu, dari perspektif API, kedua-dua kelas sangat serupa. Walau bagaimanapun, masih terdapat beberapa perbezaan besar antara kedua kelas tersebut.

Penyegerakan

Vectorsdisegerakkan. Sebarang kaedah yang menyentuh Vectorkandungannya adalah selamat di dalam benang. ArrayList, sebaliknya, tidak diselaraskan, menjadikannya, oleh itu, tidak selamat di dalam benang. Dengan perbezaan itu, penggunaan penyegerakan akan menyebabkan prestasi meningkat. Oleh itu, jika anda tidak memerlukan koleksi yang selamat untuk benang, gunakan ArrayList. Mengapa perlu membayar harga penyegerakan tanpa perlu?

Pertumbuhan data

Secara dalaman, kedua-duanya ArrayListdan Vectormenyimpan kandungannya menggunakan Array. Anda mesti ingat fakta ini semasa menggunakannya dalam program anda. Apabila anda memasukkan elemen ke dalam ArrayListatau Vector, objek perlu memperluas susunan dalamannya jika kehabisan ruangan. A Vectormungkir untuk menggandakan saiz array, manakala yangArrayListmeningkatkan ukuran susunannya sebanyak 50 peratus. Bergantung pada cara anda menggunakan kelas-kelas ini, anda mungkin akan mendapat persembahan hebat sambil menambahkan elemen baru. Selalu terbaik untuk menetapkan kapasiti awal objek ke kapasiti terbesar yang diperlukan oleh program anda. Dengan menetapkan kapasiti dengan hati-hati, anda boleh mengelakkan membayar denda yang diperlukan untuk mengubah ukuran susunan dalaman kemudian. Sekiranya anda tidak tahu berapa banyak data yang anda akan ada, tetapi anda tahu kadar pertumbuhannya, anda Vectormempunyai sedikit kelebihan kerana anda dapat menetapkan nilai kenaikan.

Corak penggunaan

Keduanya ArrayListdan Vectorbaik untuk mengambil elemen dari kedudukan tertentu di dalam bekas atau untuk menambah dan mengeluarkan unsur dari hujung bekas. Semua operasi ini dapat dilakukan dalam masa yang tetap - O (1) . Walau bagaimanapun, penambahan dan penghapusan elemen dari kedudukan lain terbukti lebih mahal - linear tepat: O (ni), di mana n adalah bilangan elemen dan i adalah indeks elemen yang ditambahkan atau dikeluarkan. Operasi ini lebih mahal kerana anda harus mengalihkan semua elemen pada indeks i dan lebih tinggi dengan satu elemen. Jadi apa maksud semua ini?

Ini bermaksud bahawa jika anda ingin mengindeks elemen atau menambah dan membuang elemen pada akhir array, gunakan salah satu Vectoratau a ArrayList. Sekiranya anda ingin melakukan perkara lain untuk kandungannya, pergi mencari kelas kontena yang lain. Sebagai contoh, LinkedListtin boleh menambah atau membuang elemen pada kedudukan apa pun dalam masa yang tetap - O (1). Walau bagaimanapun, pengindeksan elemen sedikit lebih perlahan - O (i) di mana i adalah indeks elemen. Melintasi an ArrayListjuga lebih mudah kerana anda hanya boleh menggunakan indeks dan bukannya membuat iterator. Ini LinkedListjuga membuat objek dalaman untuk setiap elemen yang dimasukkan. Oleh itu, anda harus menyedari sampah tambahan yang dihasilkan.

Akhirnya, dalam "PRAXIS 41" dari Java Praktikal (Addison-Wesley, Februari 2000) Peter Haggar menyarankan agar anda menggunakan susunan lama biasa sebagai ganti salah satu Vectoratau ArrayList- terutamanya untuk kod kritikal prestasi. Dengan menggunakan array, anda dapat mengelakkan penyegerakan, panggilan kaedah tambahan, dan pengubahan ukuran yang tidak optimum. Anda hanya membayar kos masa pembangunan tambahan.

Ketahui lebih lanjut mengenai topik ini

  • Bahasa Pengaturcaraan Java Ken Arnold, James Gosling, dan David Holmes (Addison-Wesley, Jun 2000; ISBN0201704331)

    //www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/

  • Java Praktikal Peter Haggar (Addison-Wesley, Februari 2000; ISBN0201616467)

    //www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/

  • Mahu lebih? Lihat Indeks Soal Jawab Java untuk katalog Q&A lengkap

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Selama lebih 100 tips Java berwawasan dari beberapa minda terbaik dalam perniagaan, lawatan JavaWorld ' s Java Tips indeks

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Daftar untuk mendapatkan buletin e-mel mingguan percuma JavaWorld Minggu Ini untuk apa yang baru di JavaWorld

    //idg.net/jw-subscribe

Kisah ini, "Vektor atau ArrayList - mana yang lebih baik?" pada asalnya diterbitkan oleh JavaWorld.