Gọi kích thước đắt bao nhiêu() trên Danh sách hoặc Bản đồ bằng Java? hoặc nó là tốt hơn để tiết kiệm kích thước() của giá trị trong một biến nếu truy cập thường xuyên?Gọi kích thước đắt bao nhiêu() trên Danh sách hoặc Bản đồ trong Java?
Trả lời
Câu trả lời là tùy thuộc vào lớp triển khai thực tế. Đối với một số lớp học Map
và Collection
, size()
là hoạt động liên tục thời gian giá rẻ. Đối với những người khác, nó có thể đòi hỏi phải đếm các thành viên.
Thông thường
Java Collections Cheatsheet (V2) là nguồn tốt cho loại thông tin này, nhưng máy chủ lưu trữ hiện bị ốm một chút.
Miền "coderfriendly.com" không còn nữa, nhưng tôi đã theo dõi một bản sao của the cheat-sheet trên scribd.com.
Chi phí của size()
cũng sẽ hiển nhiên khi xem mã nguồn. (Và đây là một "chi tiết thực hiện" được khá nhiều đảm bảo không thay đổi ... cho các lớp học tập tiêu chuẩn.)
followup
Thật không may, cheatsheet chỉ tài liệu sự phức tạp của size
cho hàng đợi triển khai.Tôi nghĩ đó là bởi vì nó là O(1)
cho tất cả các bộ sưu tập khác; xem câu trả lời của @ seanizer.
+1 cho tất cả mọi thứ nhưng tôi muốn cung cấp thêm một +1 cho Bộ sưu tập Cheatsheet (nó thực sự tuyệt vời) –
Liên kết của bạn đang đưa tôi đi khắp nơi. – DeathByTensors
@DrewBuckley - cố định. Đối với hồ sơ, đó là những gì sẽ xảy ra với tên miền mà có được "chưa sử dụng". –
cho ArrayList
việc thực hiện cũng giống như
public int size() {
return lastIndex - firstIndex;
}
Vì vậy không trên đầu
Bạn có thể kiểm tra mã nguồn để biết chi tiết cho yêu cầu Impl của bạn.
Lưu ý: Nguồn được cung cấp là từ openjdk
Trong phiên bản ArrayList 1.56 của tôi, nó đã nhận được nó từ một thuộc tính kích thước int riêng. – Manny
@Manny Đây là nguồn từ OpenJDK –
Bạn không phải lo lắng nhiều về điều đó. Việc triển khai danh sách theo dõi kích thước. Chi phí của cuộc gọi chỉ là O (1). Nếu bạn rất tò mò, bạn có thể đọc mã nguồn để triển khai các lớp cụ thể của Collection và xem phương thức size() ở đó.
IMO, bạn nên lo lắng về điều đó (nói chung), thuật toán họa sĩ Schlemiel? – Ishtar
Thực hiện lấy nó từ một biến được tính toán trước để nó không đắt tiền.
Triển khai, sau đó kiểm tra. Nếu nó chậm, hãy xem kỹ hơn.
"Tối ưu hóa sớm là gốc rễ của mọi điều ác". - D. Knuth
Ngoài ra: Bạn không nên yêu cầu các tính năng triển khai nhất định, đặc biệt nếu chúng được đóng hộp đen. Điều gì sẽ xảy ra nếu bạn thay thế danh sách đó bằng danh sách đồng thời vào một ngày sau đó? Điều gì sẽ xảy ra nếu Oracle quyết định viết lại Danh sách? Nó vẫn sẽ nhanh? Bạn chỉ không biết.
Đó là * Tối ưu hóa sớm *. Knuth là người Mỹ :-) –
* "Điều gì sẽ xảy ra nếu Oracle quyết định viết lại danh sách?" * (Nitpick - có lẽ bạn có nghĩa là một lớp thực hiện danh sách). Việc viết lại làm cho 'size' thành một hoạt động' O (N) 'sẽ phá vỡ một số lượng lớn các ứng dụng. Oracle sẽ rất điên rồ để làm điều này. Đó là về khả năng xảy ra khi Microsoft mở nguồn Windows. (Ít có khả năng thực sự ...) –
@Stephen C: Bạn hoàn toàn đúng, Oracle sẽ mất trí để thay đổi hành vi của Size() trong ArrayList vào ngày này (và tôi vẫn đặt cược rằng những thay đổi như vậy đã xảy ra trong tất cả các labraries ngôn ngữ tại một số điểm). Đó là/có lẽ/không liên quan trong ví dụ cụ thể này. Vấn đề chính là việc thay thế thực hiện sau này, từ ArrayList sang ConcurrentList, một số Danh sách của bên thứ ba hoặc những gì có bạn. –
Tôi nghĩ rằng một số triển khai của LinkedList sẽ tính tổng số cho mỗi cuộc gọi. Các cuộc gọi đến một phương pháp chính nó có thể là một chút thuế, nhưng chỉ khi chúng ta đang nói về lặp đi lặp lại lớn hoặc mã hóa trình điều khiển cho phần cứng sẽ thực sự là một vấn đề.
Trong cả hai trường hợp, nếu bạn lưu nó vào biến cục bộ, sẽ không có bất kỳ sự cố nào.
List
và Map
là các giao diện, vì vậy, không thể nói. Đối với các triển khai trong API tiêu chuẩn Java, kích thước thường được giữ trong một trường và do đó không liên quan đến hiệu suất.
Đối với hầu hết Bộ sưu tập, gọi size()
là hoạt động liên tục. Tuy nhiên, một số trường hợp ngoại lệ. Một là ConcurrentLinkedQueue. Từ Javadoc của the size() method:
Hãy coi chừng, không giống như trong hầu hết các bộ sưu tập, phương pháp này KHÔNG phải là hoạt động liên tục. Do tính chất không đồng bộ của các hàng đợi này, nên việc xác định số lượng phần tử hiện tại yêu cầu một quá trình truyền O (n).
Vì vậy, tôi sợ không có câu trả lời chung, bạn phải kiểm tra tài liệu về bộ sưu tập cá nhân bạn đang sử dụng.
- 1. Gọi phương thức đắt bao nhiêu .net
- 2. Sự kiện MySQL đắt bao nhiêu?
- 3. Mảng đề xuất Java (Solr) đắt bao nhiêu?
- 4. kích thước đống ứng dụng trong iphone là bao nhiêu?
- 5. Kích thước danh sách Java() hoạt động như thế nào?
- 6. Danh sách 3 chiều hoặc Bản đồ
- 7. Kích thước, tính bằng pixel, của AdSize.BANNER là bao nhiêu?
- 8. Kích thước tối đa của Web.config là bao nhiêu?
- 9. Kích thước nhóm mặc định của GPars là bao nhiêu?
- 10. Khóa đắt bao nhiêu (...) khi khóa không bị khóa?
- 11. Giá trị đọc tập tin đắt bao nhiêu? .NET
- 12. Lập bản đồ trên các danh sách con trong Scala
- 13. Danh sách so với Bản đồ trong Java
- 14. khởi tạo một kích thước bản đồ STL `
- 15. Tự động kích hoạt Bản đồ Java trên nhiều nút
- 16. jVectorNhập bản đồ (thế giới) kích thước bản đồ
- 17. Kích thước danh sách kiểu ảnh CSS
- 18. Có bao nhiêu LINQ?
- 19. Có bao nhiêu lớp trong ấn bản tiêu chuẩn Java?
- 20. Kích thước họa tiết tối đa có sẵn trên iPad là bao nhiêu?
- 21. Kích thước bit dài trên Windows 64 bit là bao nhiêu?
- 22. Chia danh sách thành nhiều danh sách dựa trên kích thước thùng
- 23. Bản đồ java có thể trả về kích thước -1 không?
- 24. Gọi 'del' trên danh sách
- 25. Độ phức tạp của LinkedList.getLast() trong Java là bao nhiêu?
- 26. Java: Cách chuyển đổi Danh sách thành Bản đồ
- 27. Android - IllegalStateException: bản đồ có kích thước bằng không
- 28. Bao nhiêu ngày trong Java với Lịch
- 29. Cần thu thập bao nhiêu dữ liệu JSON gọi?
- 30. Độ phức tạp của HashMap.containsValue() trong java là bao nhiêu?
+1 qn đẹp Niru – abi1964