2012-08-22 13 views
8

Từ JavaDocs của HashSet:Chi phí lặp trên HashSet cũng phụ thuộc vào khả năng sao lưu bản đồ là gì?

Lớp này cung cấp hiệu suất hằng số thời gian cho các hoạt động cơ bản (thêm, xóa, chứa và kích thước), giả định các hàm băm phân tán các yếu tố đúng trong xô. Lặp lại tập hợp này đòi hỏi thời gian tỉ lệ với tổng kích cỡ của cá thể HashSet (số lượng phần tử) cộng với "dung lượng" của sự sao lưu HashMap thể hiện (số lượng nhóm). Vì vậy, nó rất quan trọng không đặt công suất ban đầu quá cao (hoặc hệ số tải quá thấp) nếu lặp hiệu suất là quan trọng

Tại sao lặp cần có thời gian tỉ lệ với sum (số phần tử trong bộ + công suất của bản đồ sao lưu) và không chỉ cho số lượng các phần tử trong tập hợp chính nó?

.

+5

Làm cách nào bạn lặp qua tất cả các thành phần mà không cần lặp qua tất cả các nhóm trống? – sepp2k

+0

Liên quan: http://stackoverflow.com/a/11903357/829571 – assylias

+0

Bạn cũng có thể [kiểm tra mã] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/ 7-b147/java/util/HashSet.java? Av = f # 168) và tìm hiểu xem điều gì xảy ra dưới mui xe. – assylias

Trả lời

12

HashSet được sử dụng HashMap trong đó các yếu tố là các khóa bản đồ. Vì bản đồ có một số nhóm được xác định có thể chứa một hoặc nhiều phần tử, nên việc lặp lại cần phải kiểm tra từng nhóm, cho dù có chứa phần tử hay không.

+0

giá trị của hashmap đó là gì? – Geek

+3

@Geek vì các giá trị không quan trọng chúng chỉ là các đối tượng giả (hoặc chính xác hơn, nó là một đối tượng giả: 'private static final Object PRESENT = new Object();'). – Thomas

3

Sử dụng LinkedHashSet theo danh sách các mục nhập "được liên kết" để số lượng khoảng trống không quan trọng. Thông thường bạn sẽ không có một HashSet, nơi dung lượng nhiều hơn gấp đôi kích thước thực sự được sử dụng. Thậm chí nếu bạn làm thế, quét một triệu mục, chủ yếu null không mất nhiều thời gian (milli-giây)

+2

2 ms cho mỗi 1 triệu null trên máy của tôi ;-) – assylias

+0

@assylias Âm thanh về đúng. Lặp lại một HashSet sẽ không đẹp dù bạn có làm gì.Thực sự bạn muốn làm một số bộ sưu tập tra cứu hoặc sắp xếp nơi bạn chỉ làm việc trên một vài mục nếu bạn muốn tốc độ. –

0

Tại sao lặp cần có thời gian tỉ lệ với sum (số yếu tố trong bộ + khả năng của bản đồ ủng hộ) và không chỉ cho số của các yếu tố trong tập hợp chính nó?

Các phần tử được phân tán bên trong lớp cơ bản HashMap được hỗ trợ bởi một mảng.
Vì vậy, nó không được biết là xô đang chiếm đóng (nhưng nó được biết có bao nhiêu phần tử hoàn toàn có sẵn).
Vì vậy, để lặp qua tất cả các yếu tố tất cả phải được kiểm tra

0

Nếu bạn lo ngại thời gian cần thiết để lặp xung quanh các thiết lập, và bạn đang sử dụng Java 6 hoặc cao hơn hãy nhìn vào vẻ đẹp này:

ConcurrentSkipListSet

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