Я думаю, что есть еще кое-что, и нам понадобится больше деталей от вас. Я предполагаю, что вы знаете, что определенно более одного файла определенного размера, иначе я бы сначала посмотрел, чтобы это произошло. Насколько вам известно, у вас просто много файлов с уникальными размерами файлов.
Вы упомянули:
... из-за того, что каждый Long OBJ является уникальным.
Я не думаю, что это проблема. Хотя это может быть правдой в зависимости от того, как вы создаете Longs, это не должно мешать HashMaps вести себя так, как вы хотите. Пока два ключевых объекта возвращают одно и то же значение hashCode(), а метод equals() говорит, что они равны, ваш HashMap не будет создавать для него другую запись. Фактически, вам не удастся увидеть «список (filesize, 1)» с теми же значениями размера файла (если вы не написали свой собственный Long и не смогли правильно реализовать hashCode()/equals()).
Сказанное, код Cletus должен работать, если вы используете Java 5 или более поздней версии, если вы используете Java 1.4 или ниже, вам нужно либо самостоятельно сделать свой бокс/распаковку, либо посмотреть на Apache Commons Collections ,Вот версия до Java 5 примера Клетуса:
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 в 1,6 Long.valueOf только кэширует 256 лонги, расположенных вдоль нуля , Все, что выше, чем 128, не будет кэшироваться, аналогично значениям ниже -127. –
для 1.6 (не 1.5 или ниже afaik) вы можете изменить это поведение, установив -XX: AutoBoxCacheMax = 1000 (см. Http://www.javaspecialists.eu/archive/Issue191.html) - tho, если ваше приложение замедляется такие операции уже есть, то я подозреваю, что существует некоторая алгоритмическая проблема ... – Chii