Sự khác biệt giữa hai cấu trúc dữ liệu ArrayList và Vector là gì và bạn nên sử dụng từng cấu trúc dữ liệu ở đâu?
Vector v = new Vector(3, 2);
Sự khác biệt giữa hai cấu trúc dữ liệu ArrayList và Vector là gì và bạn nên sử dụng từng cấu trúc dữ liệu ở đâu?
Vector v = new Vector(3, 2);
Câu trả lời:
Sự khác biệt
Sử dụng ArrayLists nếu không có yêu cầu cụ thể để sử dụng vectơ.
Đồng bộ hóa
Nếu nhiều luồng truy cập đồng thời một ArrayList thì chúng ta phải đồng bộ hóa bên ngoài khối mã để sửa đổi danh sách theo cấu trúc hoặc đơn giản là sửa đổi một phần tử. Sửa đổi cấu trúc có nghĩa là thêm hoặc xóa (các) phần tử khỏi danh sách. Đặt giá trị của một phần tử hiện tại không phải là một sửa đổi cấu trúc.
Collections.synchronizedList
thường được sử dụng tại thời điểm tạo danh sách để tránh mọi truy cập không đồng bộ ngẫu nhiên vào danh sách.
Tăng trưởng dữ liệu
Trong nội bộ, cả ArrayList và Vector đều giữ nội dung của chúng bằng Array. Khi một phần tử được chèn vào ArrayList hoặc Vector, đối tượng sẽ cần mở rộng mảng bên trong của nó nếu nó hết phòng. Một Vector mặc định tăng gấp đôi kích thước của mảng, trong khi ArrayList tăng kích thước mảng thêm 50 phần trăm.
Như tài liệu nói, a Vector
và an ArrayList
gần như tương đương. Sự khác biệt là quyền truy cập vào một Vector
được đồng bộ hóa, trong khi quyền truy cập vào một ArrayList
thì không. Điều này có nghĩa là chỉ có một luồng có thể gọi các phương thức Vector
cùng một lúc và có một chi phí nhỏ trong việc có được khóa; nếu bạn sử dụng một ArrayList
, đây không phải là trường hợp. Nói chung, bạn sẽ muốn sử dụng một ArrayList
; trong trường hợp một luồng, đó là sự lựa chọn tốt hơn và trong trường hợp đa luồng, bạn có thể kiểm soát khóa tốt hơn. Bạn muốn cho phép đọc đồng thời? Khỏe. Bạn muốn thực hiện một đồng bộ hóa cho một loạt mười lần viết? Cũng ổn. Nó đòi hỏi một chút quan tâm hơn về kết thúc của bạn, nhưng đó có thể là những gì bạn muốn. Cũng lưu ý rằng nếu bạn có ArrayList, bạn có thể sử dụngCollections.synchronizedList
chức năng tạo danh sách đồng bộ, do đó giúp bạn tương đương với a Vector
.
Vector
là một lớp bị hỏng không phải là chủ đề an toàn, mặc dù nó được "đồng bộ hóa" và chỉ được sử dụng bởi các sinh viên và các lập trình viên thiếu kinh nghiệm khác.
ArrayList
là triển khai Danh sách đi đến được sử dụng bởi các chuyên gia và lập trình viên có kinh nghiệm.
Các chuyên gia muốn thực hiện Danh sách chủ đề an toàn sử dụng a CopyOnWriteArrayList
.
Vector
được dự định là chủ đề an toàn, nhưng có một lỗi thiết kế làm cho nó * không thực sự là chủ đề an toàn, về cơ bản nó là một lớp không dùng nữa. Vì một số lý do, các trường đại học đã không nghe về tin tức này và vẫn ủng hộ việc sử dụng nó.
ArrayList
mới hơn và nhanh hơn 20-30%.
Nếu bạn không cần một cái gì đó rõ ràng rõ ràng Vector
, hãy sử dụngArrayList
20-30% faster
?
Có 2 sự khác biệt chính giữa Vector và ArrayList.
Vector được đồng bộ hóa theo mặc định, còn ArrayList thì không. Lưu ý: bạn có thể tạo ArrayList cũng được đồng bộ hóa bằng cách chuyển đối tượng danh sách mảng sang phương thức Collections.syn syncizedList (). Phương tiện được đồng bộ hóa: nó có thể được sử dụng với nhiều luồng mà không có tác dụng phụ.
ArrayLists tăng 50% kích thước trước đó khi không đủ không gian cho phần tử mới, trong đó Vector sẽ tăng 100% kích thước trước đó khi không có không gian cho phần tử mới đến.
Khác với điều này, có một số khác biệt thực tế giữa chúng, về nỗ lực lập trình:
Khi nào nên sử dụng cái nào?
Lưu ý : mặc dù danh sách mảng tăng 100%, bạn có thể tránh điều này bằng phương thức bảo đảm () để đảm bảo rằng bạn đang phân bổ đủ bộ nhớ ở các giai đoạn ban đầu.
Hy vọng nó giúp.
ArrayList
và Vector
cả hai thực hiện Giao diện danh sách và duy trì thứ tự chèn. Nhưng có nhiều khác biệt giữa ArrayList
và Vector
các lớp ...
ArrayList
không đồng bộ.ArrayList
tăng 50% kích thước mảng hiện tại nếu số phần tử vượt quá khả năng của nó.ArrayList
không phải là một lớp kế thừa, nó được giới thiệu trong JDK 1.2.ArrayList
là nhanh vì nó không đồng bộ.ArrayList
sử dụng giao diện Iterator để duyệt qua các phần tử.Vectơ -
Vector
được đồng bộ hóa.Vector
tăng 100% có nghĩa là tăng gấp đôi kích thước mảng nếu tổng số phần tử vượt quá khả năng của nó.Vector
là một lớp kế thừa.
Vector
chậm vì nó được đồng bộ hóa tức là trong môi trường đa luồng, nó sẽ giữ các luồng khác ở trạng thái có thể chạy hoặc không chạy được cho đến khi luồng hiện tại giải phóng khóa đối tượng.
Vector
sử dụng giao diện liệt kê để duyệt qua các phần tử. Nhưng nó cũng có thể sử dụng Iterator.
Xem thêm: https://www.javatpoint.com/difference-b between-marlistlist-and-vector
Về cơ bản cả ArrayList và Vector đều sử dụng Object Array bên trong.
ArrayList: Lớp ArrayList mở rộng AbstractList và thực hiện giao diện List và RandomAccess (giao diện đánh dấu). ArrayList hỗ trợ các mảng động có thể phát triển khi cần thiết. Nó cho chúng ta lần lặp đầu tiên trên các yếu tố. ArrayList sử dụng Object Array nội bộ; chúng được tạo với kích thước ban đầu mặc định là 10. Khi vượt quá kích thước này, bộ sưu tập sẽ tự động tăng lên một nửa kích thước mặc định là 15.
Vector: Vector tương tự như ArrayList nhưng sự khác biệt là, nó được đồng bộ hóa và kích thước ban đầu mặc định của nó là 10 và khi kích thước vượt quá kích thước của nó tăng gấp đôi kích thước ban đầu, có nghĩa là kích thước mới sẽ là 20. Vector là lớp duy nhất khác với ArrayList để triển khai RandomAccess. Vector đang có bốn hàm tạo trong số đó có hai tham số Vector (int initCapacity, int abilityIncrement) dung lượng là mức tăng công suất khi vectơ tràn, do đó, nó có nhiều quyền kiểm soát hơn đối với hệ số tải.
Một số khác biệt khác là: