Sự khác biệt giữa ArrayList và Vector là gì?


352

Sự khác biệt giữa hai cấu trúc dữ liệu ArrayListVector là gì và bạn nên sử dụng từng cấu trúc dữ liệu ở đâu?


5
Tôi không thấy bản sao chính xác ở đây.
Jeff Atwood

2
Chà, bạn cũng có thể tạo vectơ trong java - Vector v = new Vector(3, 2);
sgsi

Không bao giờ sử dụng Vector, sử dụng ArrayListhoặc LinkedListhoặcArrayDeque

Câu trả lời:


365

Sự khác biệt

  • Các vectơ được đồng bộ hóa, ArrayLists thì không.
  • Phương pháp tăng trưởng dữ liệu

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ài liệu tham khảo

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.

Tài liệu tham khảo


7
@Rei Chính xác những gì anh ấy nói: Nhiều chủ đề ( docs.oracle.com/javase/tutorial/essential/concurrency/ mẹo )
RecursiveExceptionException

Điều gì về ĐỌC từ một ArrayList theo cách đa luồng? Đó có phải là chủ đề an toàn?
Xunie

@Xunie Đọc từ ArrayList hoặc các lớp bộ sưu tập khác không bao giờ là vấn đề. Vấn đề phát sinh khi bạn thêm hoặc xóa hoặc sửa đổi các giá trị hiện có vào ArrayList hoặc bộ sưu tập.
sainath reddy

85

Như tài liệu nói, a Vectorvà an ArrayListgầ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 ArrayListthì 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 Vectorcù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.synchronizedListchức năng tạo danh sách đồng bộ, do đó giúp bạn tương đương với a Vector.


53

Vectorlà 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.


10
đồng bộ nhưng không an toàn? nó có nghĩa là gì? [tôi là người mới bắt đầu]
Dineshkumar

13
@Dineshkumar 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ó.
Bohemian

1
@Dineshkumar xem câu hỏi này
Bohemian

3
@Dineshkumar xin lỗi - đó không phải là một liên kết tốt. đây là câu trả lời dứt khoát . Nói tóm lại, đồng bộ hóa của nó là vô dụng.
Bohemian

7
Sự thật thú vị: Stack của Java1.7 sử dụng lớp Vector.
Tobi

26

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


32
Bạn có thể hỗ trợ yêu cầu bằng cách đưa ra bằng chứng về 20-30% faster?
người dùng

5
@user Tại thời điểm đó, đó chỉ là kinh nghiệm cá nhân từ việc thu thập các mảng lớn. Hơn ba năm nay, tôi không thể chỉ cho bạn chính xác những gì tôi đang nói nhưng có rất nhiều điểm chuẩn ngoài kia. Mãi cho đến khi xâu chuỗi nơi bạn thấy những bước nhảy lớn nhất nhưng đây là một: javacodegeek.com/2010/08/iêu
Oli

20-30% chỉ khớp, nếu bạn đọc VÀ ghi vào Vector / Arraylist, vì hàm tăng trưởng sẽ tạo ra tác động lớn nhất. Nếu bạn có điểm chuẩn chỉ viết một lần và sau đó thực hiện chỉ đọc sẽ mang lại kết quả khác
Tobi

2
Vui lòng cung cấp bằng chứng cho dữ liệu của bạn
Wiredmark 19/2/2015

Vì vectơ được đồng bộ hóa và danh sách mảng không được đồng bộ hóa, đó có thể là một lý do, danh sách mảng nhanh hơn vectơ.
HỎI

23

Có 2 sự khác biệt chính giữa Vector và ArrayList.

  1. 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ụ.

  2. 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:

  1. Để lấy phần tử tại một vị trí cụ thể từ Vector, chúng tôi sử dụng hàm ElementAt (int index). Tên hàm này rất dài. Thay cho điều này trong ArrayList, chúng ta có get (int index) rất dễ nhớ và dễ sử dụng.
  2. Tương tự như vậy để thay thế một phần tử hiện có bằng một phần tử mới trong Vector, chúng tôi sử dụng phương thức setEuityAt (), một lần nữa rất dài và có thể gây khó chịu cho lập trình viên sử dụng nhiều lần. Thay cho ArrayList này có phương thức add (int index, object) rất dễ sử dụng và ghi nhớ. Như thế này, họ có nhiều lập trình viên thân thiện hơn và dễ sử dụng tên hàm trong ArrayList.

Khi nào nên sử dụng cái nào?

  1. Cố gắng tránh sử dụng vectơ hoàn toàn. ArrayLists có thể làm mọi thứ mà Vector có thể làm. Nhiều hơn ArrayLists theo mặc định không được đồng bộ hóa. Nếu bạn muốn, bạn có thể đồng bộ hóa nó bất cứ khi nào bạn cần bằng cách sử dụng lớp Bộ sưu tập.
  2. ArrayList có dễ nhớ và sử dụng tên hàm.

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.


5
Thông tin sai (đã chuyển) về tăng kích thước cho ArrayLIst và Vector, nếu không thì câu trả lời khá tốt.
Nenad Bulatovic

Sự phát triển của Vector đang tăng gấp đôi với docs.oracle.com/javase/7/docs/api/java/util/Vector.html trong khi của ArrayList "Các chi tiết của chính sách tăng trưởng không được chỉ định ngoài thực tế là việc thêm một phần tử có chi phí thời gian khấu hao không đổi. " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib

Tôi không hiểu làm thế nào tên phương thức có thể là một tiêu chí để sử dụng hoặc không sử dụng phương thức đó.
Surender Kherwa

14

ArrayListVectorcả 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 ArrayListVectorcác lớp ...

ArrayList -

  1. ArrayList không đồng bộ.
  2. 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ó.
  3. ArrayList không phải là một lớp kế thừa, nó được giới thiệu trong JDK 1.2.
  4. ArrayList là nhanh vì nó không đồng bộ.
  5. ArrayList sử dụng giao diện Iterator để duyệt qua các phần tử.

Vectơ -

  1. Vector được đồng bộ hóa.
  2. 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ó.
  3. Vector là một lớp kế thừa.

  4. 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.

  5. Vectorsử 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


10

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à: nhập mô tả hình ảnh ở đây


1
Tại sao việc thêm đối tượng ở đầu và cuối ở LinkedList lại chậm? Không phải nó nên nhanh hơn cả HAI mảng và vectơ sao?
CHANist

@CHANist Mình cũng đồng ý. Thêm một đối tượng ở đầu và cuối nên nhanh hơn so với việc thêm một đối tượng ở giữa nó.
Rahul Rastogi

1
Ngôn ngữ được sử dụng trong cột LinkedList của bảng này là mâu thuẫn. Cả việc thêm và thêm vào LinkedList đều nhanh hơn việc thêm các phần tử ở giữa, nhưng chậm hơn so với việc thêm hoặc thêm vào ArrayLists hoặc vectơ. Điều này là do mọi thao tác chèn đều yêu cầu cấp phát bộ nhớ với các tham chiếu không cục bộ, làm tăng khả năng bỏ lỡ bộ đệm. Mặc dù việc tra cứu trong LinkedList là tuyến tính với số lượng phần tử và con trỏ đến cuối không được lưu trữ, việc nối thêm vẫn nhanh hơn so với trả trước vì bộ nhớ chỉ được phân bổ lại cho một phần tử.
Sophia Gold
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.