Tôi nghĩ rằng có nhiều điều này và chúng tôi sẽ cần thêm chi tiết từ bạn. Tôi giả sử bạn biết chắc chắn có nhiều hơn một tệp có kích thước nhất định, nếu không trước tiên tôi sẽ kiểm tra xem đó là trường hợp. Đối với tất cả những gì bạn biết, bạn chỉ cần có rất nhiều tệp với kích thước tệp duy nhất.
Bạn nói:
... do thực tế rằng mỗi obj Long là độc đáo.
Tôi không nghĩ đây là vấn đề. Trong khi điều này có thể đúng tùy thuộc vào cách bạn đang instantiating Longs, nó không nên ngăn chặn HashMaps từ hành xử theo cách bạn muốn. Miễn là hai đối tượng chính trả về cùng một giá trị hashCode() và phương thức equals() nói rằng chúng bằng nhau, HashMap của bạn sẽ không tạo ra một mục nhập khác cho nó. Trong thực tế, bạn không thể thấy "danh sách (filesize, 1)" với cùng giá trị kích cỡ (trừ khi bạn viết Long và không thực hiện hashCode()/equals() một cách chính xác).
Điều đó nói rằng, mã của Cletus sẽ hoạt động nếu bạn đang sử dụng Java 5 trở lên, nếu bạn đang sử dụng Java 1.4 trở xuống, bạn sẽ cần phải thực hiện thủ công/unboxing của riêng mình hoặc xem Apache Commons Collections .Dưới đây là phiên bản pre-Java 5 ví dụ Cletus':
Map count = new HashMap();
for (Iterator filesIter = files.iterator(); filesIter.hasNext();) {
File file = (File)filesIter.next();
long size = file.getTotalSpace();
Integer n = count.get(size);
if (n == null) {
count.put(size, Integer.valueOf(1));
} else {
count.put(size, Integer.valueOf(n.intValue() + 1));
}
}
Nguồn
2009-05-24 10:11:21
AFAICT trong 1,6 Long.valueOf chỉ lưu trữ 256 chờ đợi mà dang chân không . Bất kỳ thứ gì có giá trị cao hơn 128 sẽ không được lưu trữ, các giá trị tương tự dưới -127. –
cho 1,6 (không phải 1,5 hoặc dưới afaik), bạn có thể thay đổi hành vi đó bằng cách đặt -XX: AutoBoxCacheMax = 1000 (xem http://www.javaspecialists.eu/archive/Issue191.html) - tho nếu ứng dụng của bạn bị chậm lại bởi hoạt động như vậy đã có, sau đó tôi nghi ngờ theres một số vấn đề thuật toán ở đó ... – Chii