2010-10-28 30 views

Trả lời

13

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 MapCollection, 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.

+3

+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) –

+0

Liên kết của bạn đang đưa tôi đi khắp nơi. – DeathByTensors

+0

@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". –

3

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

+0

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

+0

@Manny Đây là nguồn từ OpenJDK –

0

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() ở đó.

+0

IMO, bạn nên lo lắng về điều đó (nói chung), thuật toán họa sĩ Schlemiel? – Ishtar

0

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.

0

Không cần phải lưu trữ. Tôi không hề tốn kém. Hãy kiểm tra nguồn của ArrayListHashMap.

1

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.

+3

Đó là * Tối ưu hóa sớm *. Knuth là người Mỹ :-) –

+0

* "Đ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ự ...) –

+0

@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. –

0

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.

3

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

3

Đố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.

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