CodeGym /Blog Java /rawak /Vektor Java
John Squirrels
Tahap
San Francisco

Vektor Java

Diterbitkan dalam kumpulan
Mungkin anda telah menjumpai tatasusunan di Jawa, dan anda tahu bahawa salah satu kelemahan utamanya ialah ketekalan saiz. Sebaik sahaja anda telah membuat tatasusunan dengan saiz tertentu, anda tidak boleh mengubahnya kemudian. Terdapat beberapa kelas rangka kerja Java Collection dalam bahasa Java yang menyelesaikan masalah ini. Salah satunya ialah Java Vector Class. Ia akan dibincangkan dalam artikel ini.

Apakah itu Kelas Vektor

Seperti yang kami tulis dalam kata pengantar, kelas Vektor daripada Rangka Kerja Koleksi Java menghapuskan masalah saiz statik tatasusunan. Java Vector ialah sejenis tatasusunan dinamik dan boleh membesar atau mengecil saiznya. Menggunakan kelas koleksi Vektor , kita boleh menyimpan sekumpulan elemen sebagai objek mudah dan memanipulasinya melalui pelbagai kaedah. Kelas Vektor boleh didapati daripada pakej java.util . Oleh itu, Vector dalam Java boleh digunakan jika anda tidak mengetahui saiz tatasusunan terlebih dahulu, atau jika anda memerlukan "tatasusunan" yang boleh menukar dimensi sepanjang hayat program. Ia mesti dikatakan dengan segera bahawa Vektorkelas sudah agak lama, dan koleksi kemudian muncul yang boleh menggantikannya dalam kebanyakan kes. "Analog" Java Vector yang popular ialah kelas ArrayList . Perbezaan paling penting antara kelas ini antara satu sama lain ialah Vektor disegerakkan, manakala ArrayList tidak. Kita akan bercakap tentang perbezaan lain antara kedua-dua kelas ini dan analog yang lebih moden bagi kelas Vektor sedikit kemudian dalam bahagian "Apa yang salah dengan kelas Vektor".

Kaedah Vektor Java

Berikut ialah Kaedah Vektor Java :
  • void add(int index, Object element) memasukkan elemen yang ditentukan pada kedudukan vektor yang ditentukan.

  • boolean add(Objek o) menambah elemen yang ditentukan pada akhir vektor.

  • boolean addAll(Koleksi c) menambah semua elemen dalam koleksi yang ditentukan ke penghujung vektor, dalam susunan bahawa ia dikembalikan oleh pengulangan koleksi yang ditentukan.

  • boolean addAll(int index, Collection c) memasukkan semua elemen dalam Koleksi yang ditentukan ke dalam vektor pada kedudukan yang ditentukan.

  • void addElement(Object obj) menambah komponen yang ditentukan pada penghujung vektor ini, meningkatkan saiznya dengan satu.

  • int capacity() mengembalikan kapasiti semasa vektor ini.

  • void clear() mengalih keluar semua elemen daripada vektor ini.

  • Klon objek() mengembalikan klon vektor ini.

  • boolean mengandungi(Elem objek) menguji sama ada objek yang ditentukan ialah komponen dalam vektor ini.

  • boolean containsAll(Collection c) mengembalikan true jika vektor mengandungi semua elemen Koleksi yang ditentukan.

  • void copyInto(Object[] anArray) menyalin komponen vektor ini kepada tatasusunan yang ditentukan.

  • Object elementAt(int index) mengembalikan komponen pada indeks yang ditentukan.

  • Elemen penghitungan() mengembalikan penghitungan komponen vektor ini.

  • void ensureCapacity(int minCapacity) meningkatkan kapasiti vektor ini, jika perlu, untuk memastikan bahawa ia boleh memegang sekurang-kurangnya bilangan komponen yang diberikan oleh hujah kapasiti minimum.

  • boolean equals(Object o) membandingkan objek yang ditentukan dengan vektor ini.

  • Objek firstElement() mengembalikan komponen pertama (elemen pada indeks 0) vektor ini.

  • Objek get(int index) mengembalikan elemen pada kedudukan yang ditentukan dalam vektor ini.

  • int hashCode() mengembalikan nilai kod hash untuk vektor ini.

  • int indexOf(Object elem) mencari kejadian pertama bagi hujah yang diberikan, menguji kesamaan menggunakan kaedah equals.

  • int indexOf(Object elem, int index) mencari kejadian pertama bagi hujah yang diberikan, bermula pada indeks, dan menguji kesamaan menggunakan kaedah equals.

  • void insertElementAt(Object obj, int index) memasukkan objek yang ditentukan sebagai komponen ke dalam vektor ini pada indeks yang ditentukan.

  • boolean isEmpty() menguji vektor ini untuk komponen yang hilang.

  • Objek lastElement() mengembalikan komponen terakhir vektor.

  • int lastIndexOf(Object elem) mengembalikan indeks kejadian terakhir objek yang ditentukan dalam vektor ini.

  • int lastIndexOf(Object elem, int index) mencari ke belakang untuk objek yang ditentukan, bermula pada indeks yang ditentukan, dan mengembalikan indeks kepadanya.

  • Object remove(int index) mengalih keluar elemen pada kedudukan yang ditentukan dalam vektor ini.

  • boolean remove(Object o) mengalih keluar kejadian pertama bagi elemen yang ditentukan dalam vektor ini. Jika vektor tidak mengandungi unsur, ia tidak berubah.

  • boolean removeAll(Collection c) mengalih keluar semua elemen daripada vektor yang terkandung dalam Koleksi yang ditentukan.

  • void removeAllElements() mengalih keluar semua komponen daripada vektor dan menetapkan saiznya kepada sifar.

  • boolean removeElement(Object obj) mengalih keluar kejadian pertama (indeks terendah) bagi argumen daripada vektor ini.

  • void removeElementAt(int index) mengalih keluar elemen pada index.

  • protected void removeRange(int fromIndex, int toIndex) mengalih keluar dari Senarai ini semua elemen yang indeksnya berada di antara fromIndex, inklusif dan toIndex, secara eksklusif.

  • boolean retainAll(Koleksi c) hanya mengekalkan elemen dalam vektor yang terkandung dalam Koleksi yang ditentukan.

  • Set objek(int index, Object element) menggantikan elemen pada kedudukan yang ditentukan dalam vektor ini dengan elemen yang ditentukan.

  • void setElementAt(Object obj, int index) menetapkan komponen pada indeks yang ditentukan bagi vektor ini sebagai objek yang diberikan.

  • void setSize(int newSize) menetapkan saiz vektor ini.

  • int size() mengembalikan bilangan komponen dalam vektor ini.

  • Senarai subList(int fromIndex, int toIndex) mengembalikan perwakilan (pandangan) bahagian Senarai ini antara fromIndex, inklusif dan toIndex, secara eksklusif.

  • Object[] toArray() mengembalikan tatasusunan yang mengandungi semua elemen vektor ini dalam susunan yang betul.

  • Object[] toArray(Object[] a) mengembalikan tatasusunan yang mengandungi semua elemen vektor ini dalam susunan yang betul; jenis pelaksanaan tatasusunan yang dikembalikan ialah jenis tatasusunan yang ditentukan.

  • String toString() mengembalikan perwakilan rentetan vektor ini yang mengandungi perwakilan rentetan setiap elemen.

  • void trimToSize() memangkas kapasiti vektor ini kepada saiz semasa vektor.

Contoh Vektor Java


import java.util.Vector;

public class VectorExample {

   public static void main(String[] args) {
       Vector vector = new Vector();
       System.out.println("the size of the empty vector = " +  vector.size());
       //adding some vector elements
       vector.add("Johnny");
       vector.add("Ivy");
       vector.add("Ricky");
       System.out.println(vector); 
       
       //adding more vector elements       
       vector.add("Johnny");
       vector.add("Paul");
       System.out.println(vector);
       System.out.println("the size of the vector = " +  vector.size());
       System.out.println("the first element of the vector = " + vector.firstElement());

       //here the program will print out the first appearance of "Johnny" element
       System.out.println(vector.indexOf("Johnny"));
       //program will print out the first appearance of "Johnny" element starting from the element 1
       System.out.println(vector.indexOf("Johnny", 1));
       vector.clear(); //deleting all vector elements
       System.out.println("the size of the vector after clear method = " +  vector.size());

   }
}
Output program ini adalah di bawah:
saiz vektor kosong = 0 [Johnny, Ivy, Ricky] [Johnny, Ivy, Ricky, Johnny, Paul] saiz vektor = 5 elemen pertama vektor = Johnny 0 3 saiz vektor selepas jelas kaedah = 0

Apa yang salah dengan Kelas Vektor?

Menurut dokumentasi kelas Java Vector , jika anda tidak memerlukan pelaksanaan thread-safe dalam program anda, adalah disyorkan untuk menggunakan ArrayList sebagai ganti Vector (Rangka Kerja Pengumpulan peserta yang lebih berkesan). Mari kita ubah contoh di atas sedikit, menggunakan kelas ArrayList dan bukannya Vector .

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {

       public static void main(String[] args) {
           List vector = new ArrayList();
           //Vector vector = new Vector();
           System.out.println("the size of the empty vector = " +  vector.size());
           vector.add("Johnny");
           vector.add("Ivy");
           vector.add("Ricky");
           System.out.println(vector);
           vector.add("Johnny");
           vector.add("Paul");
           System.out.println(vector);
           System.out.println("the size of the vector = " +  vector.size());
           //System.out.println("the first element of the vector = " + vector.firstElement());

           //here the program will print out the first appearance of "Johnny" element
           System.out.println(vector.indexOf("Johnny"));
           //program will print out the first appearance of "Johnny" element starting from the element 1
           //System.out.println(vector.indexOf("Johnny", 1));
           vector.clear();
           System.out.println("the size of the vector after clear method = " +  vector.size());

       }
   }
Kami mengulas baris dengan vector.indexOf("Johnny", 1) , kerana tiada kaedah sedemikian dalam variasi ini dalam kelas ArrayList . Atas sebab yang sama, baris vector.firstElement() telah diulas. Dalam semua aspek lain, program ini menghasilkan hasil yang sama seperti yang pertama. Sudah tentu, dalam contoh sedemikian, tidak jelas mengapa ArrayList lebih baik daripada Vector . Ini memerlukan lebih banyak pengetahuan tentang, katakan, benang. Kami senaraikan sebabnya di sini. Pertama, walaupun kelas Vektor disegerakkan, ia tidak boleh dipanggil sepenuhnya selamat untuk benang, walaupun ini kelihatan pelik. Hakikatnya ialah Vektor menyegerakkan setiap operasi, bukan keseluruhan Vektorcontoh itu sendiri. Ini boleh menjadi masalah dalam program di mana anda perlu menyegerakkan keseluruhan set operasi dan bukannya operasi individu. Katakan, jika satu utas sedang lelaran pada vektor dan satu lagi utas secara struktur mengubah suai contoh vektor, iterator akan membuang ConcurrentModificationException . Ternyata dua utas boleh berfungsi dengan contoh Vektor pada masa yang sama jika mereka melakukan operasi yang berbeza. Kedua, Vektorkelas tidak mempunyai prestasi terbaik kerana objeknya mempunyai tatasusunan dan penyegerakan yang boleh diubah saiz. Gabungan ini bermaksud overhed tambahan untuk operasi menyekat, sama ada penyegerakan diperlukan atau tidak. Sudah tentu, ini menjejaskan prestasi. Selain itu, penyegerakan vektor pada setiap operasi juga mempunyai kesan negatif pada prestasi, kerana kami akan memperoleh kunci berulang kali untuk setiap operasi. Jika keseluruhan contoh kelas disegerakkan, maka kunci juga akan diperoleh sekali, yang jauh lebih cekap. Ketiga, Vektor menyokong beberapa kaedah warisan. Contohnya elemen(). Kaedah ini mengembalikan penghitungan komponen vektor. Pengaturcara paling kerap menggunakan Iterator atau ListIterator untuk Penghitungan, dan untuk beberapa sebab. Khususnya, Enumeration tidak mempunyai kaedah remove() yang ditakrifkan, yang bermaksud senarai itu tidak boleh diubah suai secara struktur semasa lelaran. Juga, tidak seperti ListIterator, Enumeration tidak menawarkan akses dua arah. Seperti yang anda lihat, Vector mempunyai beberapa masalah. Bagaimana jika anda masih memerlukan pelaksanaan antara muka Senarai yang selamat benang? Dalam kes ini, ArrayList tidak akan membantu, tetapi anda boleh menggunakan, sebagai contoh, kelas CopyOnWriteArrayList dan bukannya Vector ; ia diletakkan sebagai varian selamat benang bagi ArrayList. Anda juga boleh menyegerakkan ArrayList menggunakan kaedah Collections synchronizedList() .

Vektor benar-benar mempunyai beberapa masalah ... mengapa ia masih di Jawa dan mengapa ia perlu diajar?

Persoalannya timbul: mengapa kita mempelajari kelas Vektor sama sekali? Dan mengapa ia masih belum dialih keluar dari Jawa? Hakikatnya ialah Java mengamalkan prinsip keserasian ke belakang. Ini bermakna semua kod lama yang ditulis bertahun-tahun yang lalu akan difahami oleh versi moden Java. Di samping itu, terdapat beberapa aplikasi peringkat perusahaan dalam persekitaran Java yang telah disokong selama beberapa dekad. Ada kemungkinan bahawa anda perlu berurusan dengan "dinosaur" sedemikian dalam kerja anda, jadi anda perlu bersedia untuk kejutan, seperti kod dengan kelas warisan yang tidak berkesan.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION