2009-05-04 37 views
33

Có sự khác nhau thực tế nào giữa SetCollection trong Java, ngoài thực tế là Collection có thể bao gồm cùng một yếu tố hai lần không? Họ có cùng phương pháp.khi nào sử dụng Set vs. Collection?

(Ví dụ, không Set cho tôi thêm nhiều lựa chọn để sử dụng thư viện mà chấp nhận Set s nhưng không Collection s?)

chỉnh sửa: tôi có thể nghĩ ra ít nhất 5 tình huống khác nhau để đánh giá câu hỏi này. Có ai khác có thể tìm hiểu thêm? Tôi muốn chắc chắn rằng tôi hiểu sự tinh tế ở đây.

  1. thiết kế phương pháp chấp nhận đối số Set hoặc Collection. Collection là tổng quát hơn và chấp nhận nhiều khả năng đầu vào hơn. (nếu tôi thiết kế một lớp hoặc giao diện cụ thể, tôi sẽ trở nên đẹp hơn đối với người tiêu dùng và nghiêm ngặt hơn đối với người dùng/người triển khai của tôi nếu tôi sử dụng Collection.)
  2. thiết kế phương thức trả về Set hoặc Collection. Set đảm bảo nhiều hơn Collection (ngay cả khi đó chỉ là bảo đảm không bao gồm một phần tử hai lần). (nếu tôi đang thiết kế một lớp hoặc giao diện cụ thể, tôi sẽ trở nên đẹp hơn đối với người tiêu dùng và nghiêm ngặt hơn đối với người dùng/người triển khai của tôi nếu tôi sử dụng Set.)
  3. thiết kế một lớp thực hiện giao diện Set hoặc Collection. Các vấn đề tương tự như số 2. Người dùng của lớp/giao diện của tôi nhận được nhiều sự bảo đảm hơn, các nhà phân lớp/người triển khai thực hiện có nhiều trách nhiệm hơn.
  4. thiết kế giao diện mở rộng giao diện Set hoặc Collection. Rất giống với # 3.
  5. mã viết sử dụng số Set hoặc Collection. Ở đây tôi cũng có thể sử dụng Set; lý do duy nhất để tôi sử dụng Collection là nếu tôi lấy lại một số Collection từ mã của người khác hoặc nếu tôi phải xử lý một bộ sưu tập có chứa các bản sao.
+1

câu hỏi hay nhưng câu trả lời không tốt cho người nghèo – Kemoda

Trả lời

37

Collection cũng là siêu kiểu của List, Queue, Deque, và những người khác, vì vậy nó mang lại cho bạn nhiều lựa chọn hơn. Ví dụ: tôi cố gắng sử dụng Collection làm tham số cho các phương thức thư viện không nên phụ thuộc rõ ràng vào một loại bộ sưu tập nhất định.

Nói chung, bạn nên sử dụng đúng công cụ cho công việc. Nếu bạn không muốn trùng lặp, hãy sử dụng Set (hoặc SortedSet nếu bạn muốn đặt hàng hoặc LinkedHashSet nếu bạn muốn duy trì thứ tự chèn). Nếu bạn muốn cho phép trùng lặp, hãy sử dụng List, v.v.

+1

Cách sử dụng Bộ sưu tập cung cấp cho bạn thêm * tùy chọn? Sử dụng nhiều thứ chung hơn thường cung cấp cho bạn * ít năng lượng hơn. – Martijn

+5

Nó cung cấp nhiều tùy chọn hơn cho người gọi phương thức lấy Bộ sưu tập làm thông số vì họ có thể chuyển Danh sách, Đặt hoặc Hàng đợi mà không phải thực hiện bất kỳ chuyển đổi nào. –

+4

Vâng, tôi đã nói từ quan điểm của người viết một phương pháp chấp nhận một Bộ sưu tập. Đối với một phương pháp * trả lại * một cái gì đó, tôi thích sử dụng loại thích hợp cho công việc, như tôi đã nói. –

3

Xem Java Collection tutorial để có hướng dẫn sử dụng bộ sưu tập tốt. Đặc biệt, hãy kiểm tra hệ thống phân cấp lớp.

8

Tôi nghĩ rằng bạn đã có nó đã tìm ra- sử dụng một Set khi bạn muốn loại trừ một cách cụ thể các bản sao. Collection thường là mẫu số chung thấp nhất và hữu ích khi chỉ định các API chấp nhận/trả về điều này, khiến bạn rời khỏi phòng để thay đổi chi tiết sau này nếu cần. Tuy nhiên, nếu chi tiết đơn đăng ký của bạn yêu cầu các mục nhập duy nhất, hãy sử dụng Set để thực thi điều này.

Cũng đáng xem xét liệu đơn đặt hàng có quan trọng với bạn hay không; nếu có, hãy sử dụng List hoặc LinkedHashSet nếu bạn quan tâm đến đơn đặt hàng tính độc đáo.

+0

API thường phải trả về một loại cụ thể hơn sau đó là 'Bộ sưu tập'. Ví dụ, nếu nó có thể trả về một 'Danh sách', thì hãy làm như vậy. Chỉ khi bạn không chắc chắn về kiểu trả về, bạn có thể xem xét việc trả về 'Bộ sưu tập'. – Flow

1

Bạn nên sử dụng Bộ khi đó là những gì bạn muốn.

Ví dụ: Danh sách không có bất kỳ thứ tự hoặc trùng lặp nào. Các phương thức như chứa khá hữu ích.

Bộ sưu tập chung chung hơn nhiều. Tôi tin rằng những gì mà các vị ni sư viết về cách sử dụng của họ nói lên tất cả.

2

Khi @mmyers nêu rõ, Bộ sưu tập bao gồm Đặt, cũng như Danh sách.

Khi bạn khai báo thứ gì đó làm Tập hợp chứ không phải Tập hợp, bạn đang nói rằng biến không thể là Danh sách hoặc Bản đồ. Nó sẽ luôn luôn là một bộ sưu tập, mặc dù. Vì vậy, bất kỳ chức năng nào chấp nhận một Bộ sưu tập sẽ chấp nhận một Bộ, nhưng một chức năng chấp nhận một Bộ không thể lấy một Bộ sưu tập (trừ khi bạn đưa nó vào Bộ).

+0

Thực ra, Bản đồ không mở rộng Bộ sưu tập. –

+0

Bạn đúng, sai lầm của tôi. Tôi vừa chỉnh sửa câu trả lời để sửa lỗi này. – pkaeding

1

Sự khác biệt thực tế là Bộ thực thi đặt logic, nghĩa là không có bản sao và không có thứ tự, trong khi Bộ sưu tập thì không. Vì vậy, nếu bạn cần một Bộ sưu tập và bạn không có yêu cầu cụ thể để tránh trùng lặp thì hãy sử dụng Bộ sưu tập. Nếu bạn có yêu cầu cho Set thì hãy sử dụng Set. Thường sử dụng giao diện cao nhất có thể.

2

Một điều khác cần xem xét ... Bộ có thêm chi phí trong thời gian, bộ nhớ và mã hóa để đảm bảo rằng không có bản sao. (Thời gian và bộ nhớ vì bộ thường được hỗ trợ bởi một HashMap hoặc một cây, mà thêm chi phí trên một danh sách hoặc một mảng. Mã hóa bởi vì bạn phải thực hiện các phương thức hashCode() và equals().)

Tôi thường sử dụng đặt khi tôi cần triển khai nhanh chứa contains() và sử dụng Bộ sưu tập hoặc Danh sách nếu không, ngay cả khi bộ sưu tập không có bản sao.

0

Vì Bộ sưu tập là loại siêu Set và SortedSet, chúng có thể được chuyển đến phương thức dự kiến ​​một Bộ sưu tập. Bộ sưu tập chỉ có nghĩa là nó có thể hoặc không thể được sắp xếp, đặt hàng hoặc cho phép trùng lặp.

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