2010-09-30 26 views
7

Trong chương trình của tôi, tôi thường sử dụng các bộ sưu tập để lưu trữ danh sách các đối tượng. Hiện tại tôi sử dụng ArrayList để lưu trữ các đối tượng. Câu hỏi của tôi là: đây có phải là lựa chọn tốt nhất không? Có thể tốt hơn nếu sử dụng LinkedList? Hay cái gì khác?Việc triển khai Danh sách nào để sử dụng?

Tiêu chuẩn để xem xét là:

  • Sử dụng bộ nhớ
  • Performance

Operations mà tôi cần là:

  • Thêm yếu tố để thu
  • Duyệt qua các yếu tố

Bất kỳ suy nghĩ nào?

Cập nhật: sự lựa chọn của tôi là: ArrayList :) Căn cứ vào cuộc thảo luận này cũng như những người sau đây:

+3

Có thể trùng lặp. http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist – Fil

+0

Xây dựng trên "Năng suất", xin vui lòng –

+0

là bạn chủ yếu là thêm vào cuối danh sách hoặc tại bất kỳ vị trí tùy ý? –

Trả lời

8

tôi luôn mặc định ArrayList, và sẽ ở trường hợp của bạn là tốt, trừ khi

  • tôi cần an toàn thread (trong trường hợp này tôi bắt đầu nhìn vào hiện thực List trong java.util.concurrent)
  • Tôi biết tôi sẽ làm rất nhiều việc chèn và thao tác vào Danh sách hoặc lược tả cho thấy việc sử dụng ArrayList của tôi là một vấn đề (rất hiếm)

Như những gì cần chọn trong trường hợp thứ hai, Chuỗi SO.com có ​​một số thông tin chi tiết hữu ích: List implementations: does LinkedList really perform so poorly vs. ArrayList and TreeList?

+0

Cảm ơn bạn đã liên kết đến một cuộc thảo luận rất thú vị! –

+0

làm thế nào để một LinkedList an toàn hơn thread? – Thilo

+0

@Thilo - Tôi chưa từng nói điều đó. Tôi nói tôi mặc định ArrayList trừ khi tôi cần an toàn thread. Chỉ cần để làm cho nó tinh thể rõ ràng, tôi sẽ sửa đổi câu trả lời của tôi để nói rằng tôi đi đến danh sách triển khai trong java.util.concurrent. – whaley

0

danh sách liên kết là nhanh hơn để thêm/xóa các phần tử bên trong (ví dụ: không phải đầu hoặc đuôi)

Danh sách nhanh hơn để lặp lại

+1

Hm. Có lẽ nó nhanh hơn khi lặp lại, mặc dù tôi không mong đợi điều này là nhiều hơn biên. Lợi ích thực sự nên được với các yếu tố truy cập theo thứ tự ngẫu nhiên ... – Dirk

+0

Như tôi hiểu cả hai đều có O (n) lặp lại. – Qwerky

+0

O (n) lặp qua N phần tử. Trình lặp danh sách được liên kết sẽ không ném nếu bạn đọc ở đây và thay đổi cách đó ... – GregC

0

Đó là sự cân bằng cổ điển giữa chèn tối ưu hóa so với truy xuất. Sự lựa chọn chung cho nhiệm vụ khi bạn mô tả nó là ArrayList.

+0

Tại sao lại là lựa chọn phổ biến? –

+0

Thật nhanh chóng để lặp lại toàn bộ bộ sưu tập và có ít dung lượng bộ nhớ hơn vì các liên kết trong danh sách được liên kết phải được lưu trữ ở đâu đó. – GregC

0

ArrayList là tốt cho mục đích (và hầu hết các mục đích khác) của bạn. Nó có chi phí bộ nhớ rất nhỏ và có hiệu suất khấu hao tốt cho hầu hết các hoạt động. Các trường hợp nó không phải là lý tưởng là tương đối hiếm:

  • Danh sách ist rất lớn
  • Bạn thường xuyên cần phải làm một trong những hoạt động:
    • Add/gỡ bỏ các mục trong lặp
    • Hủy bỏ mục từ đầu danh sách
+0

Để xây dựng trên điểm này: Trình lặp của ArrayList sẽ ném một ngoại lệ nếu nó phát hiện sự thay đổi trong khi lặp lại. Ngoài ra, loại bỏ từ đầu a-la hàng đợi được thực hiện tốt hơn thông qua danh sách liên kết vì lý do rõ ràng. – GregC

+0

@GregC: Trình lặp của LinkedList không ném ngoại lệ khi có các sửa đổi đồng thời? Nếu vậy, tại sao điều đó tốt? – Thilo

+0

Có vẻ như tôi sai ... Sẽ phải thử .... trích dẫn: "Các trình vòng lặp được trả về bởi các phương thức vòng lặp và phương thức listIterator của lớp này không thành công: nếu danh sách được sửa đổi cấu trúc bất kỳ lúc nào sau khi trình vòng lặp là do đó, khi đối mặt với sửa đổi đồng thời, trình vòng lặp thất bại một cách nhanh chóng và sạch sẽ, thay vì mạo hiểm hành vi tùy ý, không xác định tại một xác định chưa được xác định. Thời gian trong tương lai. " – GregC

0

Nếu bạn chỉ thêm ở cuối danh sách, ArrayList phải ổn. Từ các tài liệu 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ế rằng việc thêm một yếu tố có thời gian khấu hao liên tục tốn

ArrayList cũng nên sử dụng ít bộ nhớ hơn so với một danh sách liên kết vì bạn không cần sử dụng không gian cho các liên kết.

0

Tùy thuộc vào hồ sơ sử dụng của bạn.

Bạn có thêm vào cuối danh sách không? Cả hai đều tốt cho việc này. Bạn có thêm vào đầu danh sách không? LinkedList là tốt hơn cho việc này. Bạn có cần quyền truy cập ngẫu nhiên (bạn có bao giờ gọi số get(n) trên đó) không? ArrayList là tốt hơn cho việc này.

Cả hai đều lặp lại tốt, cả hai lần triển khai Iterator là O (1) cho next().

Nếu nghi ngờ, hãy thử nghiệm ứng dụng của riêng bạn với từng triển khai và thực hiện lựa chọn của riêng bạn.

0

Tôi biết tôi đến trễ nhưng, có lẽ, this page có thể giúp bạn, không chỉ bây giờ, nhưng trong tương lai ...

0

Với tiêu chí của bạn, bạn nên sử dụng LinkedList.

LinkedList thực hiện giao diện Deque có nghĩa là nó có thể thêm vào đầu hoặc cuối danh sách trong thời gian không đổi (1). Ngoài ra, cả ArrayList và LinkedList sẽ lặp lại trong (N) thời gian.

Bạn KHÔNG nên sử dụng ArrayList đơn giản chỉ vì chi phí thêm phần tử khi danh sách đầy. Trong trường hợp này, việc thêm phần tử sẽ là (N) vì mảng mới được tạo và sao chép tất cả các phần tử từ mảng này sang mảng khác.

Ngoài ra, ArrayList sẽ chiếm nhiều bộ nhớ hơn vì kích thước mảng sao lưu của bạn có thể không được lấp đầy hoàn toàn.

+0

Đồng nghiệp của tôi vừa viết một thử nghiệm đơn giản - thêm các yếu tố vào danh sách có kích thước khác nhau ở những nơi khác nhau. Và đây là kết quả: Đã thực hiện thử nghiệm khiêm tốn của riêng tôi. Đây là kết quả: - Thêm đơn giản (List.add (“A”)): ArrayList nhanh hơn LinkedList 3-5 trên phạm vi kích thước từ 1 đến 100 000. –

+0

Thêm vào phần đầu danh sách (List.add (0, "A"): Ở kích thước 1 thời gian bằng nhau, kích thước 100 LinkedList nhanh hơn ~ 2 lần; Kích thước 1000 LinkedList nhanh hơn ~ 10 lần; Kích thước 10000 LiskedList nhanh hơn ~ 50 lần; Kích thước 50000 LinkedList nhanh hơn ~ 80 lần –

+0

Thêm ngẫu nhiên (List.add (Math.random (list.size()), “A”)): ArrayList nhanh hơn LinkedList 2 lần trên cùng một phạm vi (1 đến 100 000) –

Các vấn đề liên quan