Vectơ Java

Xuất bản trong nhóm
Có lẽ bạn đã từng gặp mảng trong Java, và bạn biết rằng một trong những nhược điểm chính của chúng là kích thước không đổi. Khi bạn đã tạo một mảng có kích thước nhất định, bạn không thể thay đổi kích thước đó sau này. Có một số lớp khung công tác Bộ sưu tập Java trong ngôn ngữ Java giải quyết vấn đề này. Một trong số đó là Java Vector Class. Nó sẽ được thảo luận trong bài viết này.

Lớp Vector là gì

Như chúng tôi đã viết trong lời nói đầu, lớp Vector từ Java Collection Framework loại bỏ vấn đề về kích thước tĩnh của mảng. Java Vector là một loại mảng động và có thể tăng hoặc giảm kích thước. Sử dụng lớp tập hợp Vector , chúng ta có thể lưu trữ một nhóm các phần tử dưới dạng các đối tượng đơn giản và thao tác với chúng thông qua các phương thức khác nhau. Lớp Vector có sẵn trong gói java.util . Do đó, Vector trong Java có thể được sử dụng nếu bạn không biết trước kích thước của mảng hoặc nếu bạn cần một "mảng" có thể thay đổi kích thước trong suốt thời gian tồn tại của chương trình. Phải nói ngay rằng Vectorlớp đã khá cũ và các bộ sưu tập sau này đã xuất hiện có thể thay thế nó trong phần lớn các trường hợp. "Tương tự" phổ biến của Java Vector là lớp ArrayList . Sự khác biệt quan trọng nhất giữa các lớp này với nhau là Vector được đồng bộ hóa, trong khi ArrayList thì không. Chúng ta sẽ nói về những khác biệt khác giữa hai lớp này và các lớp tương tự hiện đại hơn của lớp Vector sau một chút trong phần “Lớp Vector có vấn đề gì”.

Các phương thức vectơ Java

Dưới đây là các Phương thức Vector Java :
  • void add(int index, Object element) chèn phần tử đã chỉ định vào vị trí đã chỉ định của vectơ.

  • boolean add(Object o) thêm phần tử đã chỉ định vào cuối vectơ.

  • boolean addAll(Collection c) thêm tất cả các phần tử trong bộ sưu tập đã chỉ định vào cuối vectơ, theo thứ tự mà chúng được trả về bởi trình lặp bộ sưu tập đã chỉ định.

  • boolean addAll(int index, Collection c) chèn tất cả các phần tử trong Collection đã chỉ định vào vectơ tại vị trí đã chỉ định.

  • void addElement(Object obj) thêm thành phần đã chỉ định vào cuối vectơ này, tăng kích thước của nó lên một đơn vị.

  • int capacity() trả về dung lượng hiện tại của vectơ này.

  • void clear() xóa tất cả các phần tử khỏi vectơ này.

  • Object clone() trả về một bản sao của vector này.

  • boolean contains(Object elem) kiểm tra xem đối tượng đã chỉ định có phải là một thành phần trong vectơ này hay không.

  • boolean containsAll(Collection c) trả về true nếu vectơ chứa tất cả các phần tử của Collection đã chỉ định.

  • void copyInto(Object[] anArray) sao chép các thành phần của vectơ này vào mảng đã chỉ định.

  • Object elementAt(int index) trả về thành phần tại chỉ mục đã chỉ định.

  • Các phần tử liệt kê() trả về một phép liệt kê các thành phần của vectơ này.

  • void ensureCapacity(int minCapacity) tăng dung lượng của vectơ này, nếu cần, để đảm bảo rằng nó có thể chứa ít nhất số thành phần được cung cấp bởi đối số dung lượng tối thiểu.

  • boolean equals(Object o) so sánh đối tượng đã chỉ định với vectơ này.

  • Object firstElement() trả về thành phần đầu tiên (phần tử ở chỉ số 0) của vectơ này.

  • Object get(int index) trả về phần tử ở vị trí đã chỉ định trong vectơ này.

  • int hashCode() trả về giá trị mã băm cho vectơ này.

  • int indexOf(Object elem) tìm kiếm lần xuất hiện đầu tiên của đối số đã cho, kiểm tra sự bằng nhau bằng cách sử dụng phương thức bằng.

  • int indexOf(Object elem, int index) tìm kiếm lần xuất hiện đầu tiên của đối số đã cho, bắt đầu từ chỉ mục và kiểm tra sự bằng nhau bằng cách sử dụng phương thức bằng.

  • void insertElementAt(Object obj, int index) chèn đối tượng đã chỉ định làm thành phần vào vectơ này tại chỉ mục đã chỉ định.

  • boolean isEmpty() kiểm tra vectơ này để tìm các thành phần bị thiếu.

  • Đối tượng lastElement() trả về thành phần cuối cùng của vectơ.

  • int lastIndexOf(Object elem) trả về chỉ số của lần xuất hiện cuối cùng của đối tượng đã chỉ định trong vectơ này.

  • int lastIndexOf(Object elem, int index) tìm kiếm ngược lại đối tượng đã chỉ định, bắt đầu từ chỉ mục đã chỉ định và trả về chỉ mục cho đối tượng đó.

  • Xóa đối tượng(int index) xóa phần tử tại vị trí đã chỉ định trong vectơ này.

  • boolean remove(Object o) xóa lần xuất hiện đầu tiên của phần tử đã chỉ định trong vectơ này. Nếu vectơ không chứa một phần tử, nó không thay đổi.

  • boolean removeAll(Collection c) xóa tất cả các phần tử khỏi vectơ có trong Bộ sưu tập đã chỉ định.

  • void removeAllElements() xóa tất cả các thành phần khỏi vectơ và đặt kích thước của nó thành 0.

  • boolean removeElement(Object obj) loại bỏ lần xuất hiện đầu tiên (chỉ số thấp nhất) của đối số khỏi vectơ này.

  • void removeElementAt(int index) loại bỏ một phần tử tại chỉ mục.

  • protected void removeRange(int fromIndex, int toIndex) loại bỏ khỏi Danh sách này tất cả các phần tử có chỉ mục nằm giữa fromIndex, bao gồm và toIndex, riêng biệt.

  • boolean holdAll(Bộ sưu tập c) chỉ giữ lại các phần tử trong vectơ được chứa trong Bộ sưu tập đã chỉ định.

  • Tập hợp đối tượng(int index, Object element) thay thế phần tử ở vị trí đã chỉ định trong vectơ này bằng phần tử đã chỉ định.

  • void setElementAt(Object obj, int index) đặt thành phần tại chỉ mục đã chỉ định của vectơ này làm đối tượng đã cho.

  • void setSize(int newSize) đặt kích thước của vectơ này.

  • int size() trả về số thành phần trong vector này.

  • Danh sách subList(int fromIndex, int toIndex) trả về một biểu diễn (chế độ xem) của một phần của Danh sách này giữa fromIndex, bao gồm và toIndex, riêng biệt.

  • Object[] toArray() trả về một mảng chứa tất cả các phần tử của vectơ này theo đúng thứ tự.

  • Object[] toArray(Object[] a) trả về một mảng chứa tất cả các phần tử của vectơ này theo đúng thứ tự; kiểu thực thi của mảng được trả về là kiểu của mảng đã chỉ định.

  • String toString() trả về một biểu diễn chuỗi của vectơ này chứa một biểu diễn chuỗi của từng phần tử.

  • void trimToSize() cắt dung lượng của vectơ này thành kích thước hiện tại của vectơ.

Ví dụ véc tơ 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());

   }
}
Đầu ra của chương trình này ở đây dưới đây:
kích thước của vectơ trống = 0 [Johnny, Ivy, Ricky] [Johnny, Ivy, Ricky, Johnny, Paul] kích thước của vectơ = 5 phần tử đầu tiên của vector = Johnny 0 3 kích thước của vectơ sau phương thức xóa = 0

Có gì sai với Lớp Vector?

Theo tài liệu của lớp Java Vector , nếu bạn không cần triển khai luồng an toàn trong chương trình của mình, bạn nên sử dụng ArrayList thay cho Vector (Khung bộ sưu tập tham gia hiệu quả hơn). Hãy thay đổi ví dụ trên một chút, sử dụng lớp ArrayList thay vì 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());

       }
   }
Chúng tôi đã nhận xét dòng với vector.indexOf("Johnny", 1) , bởi vì không có phương thức nào như vậy trong biến thể này trong lớp ArrayList . Vì lý do tương tự, dòng vector.firstElement() đã bị loại bỏ. Trong tất cả các khía cạnh khác, chương trình tạo ra kết quả giống như kết quả đầu tiên. Tất nhiên, trong một ví dụ như vậy, không rõ tại sao ArrayList lại tốt hơn Vector . Điều này đòi hỏi nhiều kiến ​​thức hơn về chủ đề. Chúng tôi liệt kê các lý do ở đây. Đầu tiên, mặc dù lớp Vector được đồng bộ hóa, nhưng nó không thể được gọi là hoàn toàn an toàn cho luồng, mặc dù điều này có vẻ lạ. Thực tế là Vector đồng bộ từng thao tác chứ không phải toàn bộ Vectorví dụ chính nó. Đây có thể là một vấn đề trong các chương trình mà bạn cần đồng bộ hóa toàn bộ tập hợp các thao tác thay vì các thao tác riêng lẻ. Giả sử, nếu một luồng đang lặp qua một vectơ và một luồng khác đang sửa đổi cấu trúc một thể hiện của vectơ, thì trình lặp sẽ đưa ra một ConcurrentModificationException . Hóa ra hai luồng có thể hoạt động cùng lúc với một thể hiện Vector nếu chúng thực hiện các thao tác khác nhau. Thứ hai, véc tơlớp không có hiệu suất tốt nhất vì các đối tượng của nó có một mảng và đồng bộ hóa có thể thay đổi kích thước. Sự kết hợp này có nghĩa là chi phí bổ sung cho các hoạt động chặn, cho dù có cần đồng bộ hóa hay không. Chắc chắn, điều này ảnh hưởng đến hiệu suất. Ngoài ra, việc đồng bộ hóa vectơ trên mỗi thao tác cũng có tác động tiêu cực đến hiệu suất, vì chúng tôi sẽ nhận được khóa lặp đi lặp lại cho mỗi thao tác. Nếu toàn bộ thể hiện của lớp được đồng bộ hóa, thì khóa cũng sẽ được lấy một lần, điều này hiệu quả hơn nhiều. Thứ ba, Vector hỗ trợ một số phương pháp kế thừa. Ví dụ các phần tử(). Phương thức này trả về một bảng liệt kê các thành phần của vectơ. Các lập trình viên thường sử dụng Iterator hoặc ListIterator để liệt kê và vì một số lý do. Cụ thể, Enumeration không xác định phương thức remove() , nghĩa là danh sách không thể sửa đổi cấu trúc trong quá trình lặp. Ngoài ra, không giống như ListIterator, Enumeration không cung cấp quyền truy cập hai chiều. Như bạn có thể thấy, Vector có khá nhiều vấn đề. Nếu bạn vẫn cần triển khai giao diện Danh sách an toàn theo luồng thì sao? Trong trường hợp này, ArrayList sẽ không giúp được gì, nhưng bạn có thể sử dụng, ví dụ, lớp CopyOnWriteArrayList thay vì Vector ; nó được định vị là một biến thể an toàn cho luồng của ArrayList. Bạn cũng có thể đồng bộ hóa ArrayList bằng phương thức Collections syncedList() .

Vector thực sự có một số vấn đề... tại sao nó vẫn còn trong Java và tại sao nó nên được dạy?

Câu hỏi đặt ra: tại sao chúng ta lại học lớp Vector ? Và tại sao nó vẫn chưa bị xóa khỏi Java? Thực tế là Java tuyên bố nguyên tắc tương thích ngược. Điều này có nghĩa là tất cả các mã cũ được viết cách đây nhiều năm sẽ được hiểu bởi các phiên bản Java hiện đại. Ngoài ra, có khá nhiều ứng dụng cấp doanh nghiệp trong môi trường Java đã được hỗ trợ trong nhiều thập kỷ. Rất có thể bạn sẽ phải đối mặt với một “con khủng long” như vậy trong công việc của mình, vì vậy bạn cần chuẩn bị cho những điều bất ngờ, chẳng hạn như viết mã với các lớp kế thừa không hiệu quả.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION