Vì vậy, tôi chỉ đọc javadoc cho ArrayListMultimap
và LinkedListMultimap
để hiểu cách sử dụng chúng và tôi đã biết rằng cả hai cặp khóa-giá trị trùng lặp (và theo đó tôi có nghĩa là cùng một khóa, giá trị khác nhau - nếu tôi hiểu hãy sửa tôi nếu tôi sai). Tuy nhiên, tôi không hiểu sự khác biệt giữa chúng. Cả hai đều được sử dụng để lưu trữ cặp giá trị khóa trùng lặp. Phần duy nhất mà chúng khác nhau là trong việc thực hiện của chúng, tức là ArrayListMultimap
được triển khai dưới dạng một mảng và LinkedListMultimap
được triển khai dưới dạng một LinkedList? Ngoài ra, chúng khác nhau về hiệu suất như thế nào? Tôi biết tôi đang yêu cầu rất nhiều nhưng tôi không thực sự biết nơi khác để tìm câu trả lời cho điều này.ArrayListMultimap khác với LinkedListMultimap như thế nào?
Trả lời
Đó là trong tài liệu ... và trong mã. Về cơ bản bên cạnh một sự khác biệt mà bạn đã thấy (List
lựa chọn triển khai), họ cũng sử dụng triển khai Map
khác nhau. Vì vậy:
ArrayListMultimap
sử dụngHashMap
cho bản đồ vàArrayList
bộ sưu tập cor, có nghĩa là trật tự lặp của các phương pháp nhưentries()
,asMap().keySet()
hoặcasMap.entrySet()
là undefined. Việc triển khai đơn giản và đơn giản làListMultimap
và bạn nên bắt đầu với điều này.LinkedListMultimap
sử dụngLinkedList
cho việc thu thập và cấu trúc dữ liệu chuyên ngành (danh sách tùy chỉnh liên kết) để duy trì lặp thứ tự của phương pháp nêu trên:thứ tự được duy trì sử dụng một danh sách liên kết có chứa tất cả các giá trị khóa cặp. Ngoài ra, một loạt các danh sách liên kết rời nhau của "anh chị em", mỗi giá trị chứa các giá trị cho một khóa cụ thể, được sử dụng để triển khai ValueForKeyIterator trong thời gian không đổi.
Thêm vào đó nó sử dụng ít các cấu trúc khác để duy trì "danh sách liên kết" hành vi -like:
private transient Node<K, V> head; // the head for all keys private transient Node<K, V> tail; // the tail for all keys private transient Multiset<K> keyCount; // the number of values for each key private transient Map<K, Node<K, V>> keyToKeyHead; // the head for a given key private transient Map<K, Node<K, V>> keyToKeyTail; // the tail for a given key
Ngoài ra, bộ nhớ là một ý nghĩa của các bộ sưu tập ủng hộ sử dụng trong các Multimap
triển khai - see this comparision (có thể không được cập nhật 100%).
Cá nhân, khi tôi cần hiệu quả, có thể thay đổi ListMultimap
với trật tự lặp xác định phím, tôi sử dụng "tùy chỉnh" ListMultimap
(tạo ra với MultimapBuilder
, mà là ở ổi từ v16.0):
ListMultimap<String, Integer> treeListMultimap =
MultimapBuilder.linkedHashKeys().arrayListValues().build();
Trước v16.0 tạo tùy chỉnh Multimap
s là tiết hơn (sử dụng Multimaps.newListMultimap
):
/**
* Creates {@link ListMultimap} preserving insertion order of keys and values
* (it's backed by {@link LinkedHashMap} and {@link ArrayList}).
*/
public static <K, V> ListMultimap<K, V> newLinkedArrayListMultimap() {
return Multimaps.newListMultimap(
Maps.<K, Collection<V>>newLinkedHashMap(),
new Supplier<List<V>>() {
@Override
public List<V> get() {
return Lists.newArrayList();
}
});
}
Cảm ơn rất nhiều! Điều đó thực sự hữu ích. – TheRookierLearner
câu trả lời tuyệt vời! – ycomp
- 1. Engine.io khác với socket.io như thế nào?
- 2. PostgreSQL khác với MySQL như thế nào?
- 3. GB18030 khác với Unicode như thế nào?
- 4. Trên Windows, OpenGL khác với DirectX như thế nào?
- 5. Toán tử "|| =" khác với "? =" Trong CoffeeScript như thế nào?
- 6. Web Frameworks: Play khác với Spring MVC như thế nào?
- 7. CurrentControlSet khác với ControlSet001 và ControlSet002 như thế nào?
- 8. Các khái niệm khác với Giao diện như thế nào?
- 9. XACML 3.0 khác với XACML 2.0 như thế nào?
- 10. OPENQUERY khác với SELECT và INSERT như thế nào?
- 11. Clojure: defn khác với fn như thế nào?
- 12. múi giờ EST khác với EST5EDT như thế nào?
- 13. Macro Clojure khác với macro C như thế nào?
- 14. Danh sách khác với bản đồ như thế nào?
- 15. Mesa khác với trình điều khiển OpenGL như thế nào?
- 16. ADF đối mặt với vòng đời khác với vòng đời của JSF như thế nào?
- 17. netezza hoạt động như thế nào? nó so sánh với Hadoop như thế nào?
- 18. JPA hoặc JDBC, chúng khác nhau như thế nào?
- 19. Data.Sequence.Seq nhanh như thế nào so với []?
- 20. ShareKit với MonoTouch như thế nào?
- 21. Bộ nhớ memory_order_seq_cst và memory_order_acq_rel khác nhau như thế nào?
- 22. Threading vs Parallelism, chúng khác nhau như thế nào?
- 23. Mô hình bộ nhớ cánh tay khác với ia64 như thế nào?
- 24. Tính năng không đồng bộ của C# 5.0 khác với TPL như thế nào?
- 25. StringCbprintf là gì và khác nhau như thế nào so với sprintf chung?
- 26. Cách triển khai bộ xương khác với một lớp trừu tượng thông thường như thế nào?
- 27. Trong OOP, chuyển tiếp là gì và khác với phái đoàn như thế nào?
- 28. Mẫu Mô hình Dữ liệu khác với Mô hình Kho lưu trữ như thế nào?
- 29. Raven DB: 'Người buôn lậu' khác với 'Xuất/Nhập' như thế nào?
- 30. Perforce bỏ qua cú pháp tệp khác với cú pháp gitignore như thế nào?
bất kỳ ai có một ví dụ điển hình về thời điểm 'LinkedListMultimap' hữu ích (so với chỉ một' ArrayListMultimap')? _ Ví dụ, tôi không có nghĩa là mã - chỉ là một tình huống_ – ycomp