Myślę, że jest w tym więcej i będziemy potrzebować więcej szczegółów od Ciebie. Zakładam, że wiesz, że jest zdecydowanie więcej niż jeden plik o danym rozmiarze, w przeciwnym razie najpierw sprawdziłbym, czy tak jest. Dla wszystkich wiesz, masz po prostu wiele plików o unikalnych rozmiarach plików.
można wymienić:
... z uwagi na fakt, że każdy z długim obj jest wyjątkowy.
Nie sądzę, że to jest problem. Chociaż może to być prawda w zależności od tego, w jaki sposób tworzysz instancje Longów, nie powinno to uniemożliwiać zachowywania się HashMaps tak, jak chcesz. Dopóki dwa kluczowe obiekty zwracają tę samą wartość hashCode(), a metoda equals() mówi, że są one równe, twoja HashMap nie utworzy dla niej innego wpisu. W rzeczywistości nie powinno być możliwe wyświetlenie "listy (filesize, 1)" z tymi samymi wartościami rozmiaru pliku (chyba że napisałeś własny Long i nie udało się poprawnie zaimplementować hashCode()/equals()).
To powiedziawszy, kod Cletusa powinien działać, jeśli używasz Java 5 lub wyższej, jeśli używasz Java 1.4 lub niższej, musisz ręcznie zrobić własne boksowanie/rozpakowywanie lub zajrzeć do Apache Commons Collections .Oto wersja pre-Java 5 przykład 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));
}
}
AFAICT w 1,6 Long.valueOf tylko buforuje 256 tęskni które przekraczają zera . Wszystkie wartości większe niż 128 nie będą buforowane, podobnie wartości poniżej -127. –
dla wersji 1.6 (nie 1.5 lub niższej) można zmienić to zachowanie, ustawiając -XX: AutoBoxCacheMax = 1000 (patrz http://www.javaspecialists.eu/archive/Issue191.html) - jeśli aplikacja zostanie spowolniona przez takie operacje już wtedy podejrzewam, że jest tam jakiś problem algorytmiczny ... – Chii