Вы, наверное, правы. На самом деле я могу отказаться от использования возможностей произвольного доступа (так вы это называете?), И меня не волнует порядок объектов. Мне просто нужно иметь возможность добавлять объекты, а затем перебирать их все. Кроме того, это действительно набор (мне не нужен один и тот же объект более одного раза), но я также никогда не буду пытаться добавить его более одного раза ... Должен ли я использовать список вместо этого (хотя мне все равно порядок)? Какая структура данных наиболее эффективна для такого набора?
HashSet реализован в виде HashMap, который отображает ключ на себя, поэтому переключение на HashSet не будет иметь большого значения с точки зрения производительности.
Другими альтернативами являются TreeSet или (при условии, что ваше приложение никогда не попытается вставить дубликат) один из классов List. Если ваше приложение таково, что List будет работать, то ArrayList или LinkedList будут более эффективными, чем HashSet или TreeSet.
Однако в вашем приложении есть что-то очень подозрительное, тратя 50% своего времени на hashCode
методы. Если размеры хеш-таблиц не изменились, метод hashCode должен вызываться только один раз для каждой операции набора или сопоставления. Таким образом, либо происходит большое изменение размеров карты / набора, либо вы выполняете огромное количество операций набора add
. (AFAIK, метод Object hashcode является дешевым, поэтому стоимость каждого вызова не должна быть проблемой.)
EDIT
Действительно ли nextInt () дорого? Есть альтернативы?
Нет, это не дорого. Посмотрите на код. Класс Random (и метод nextInt ()) действительно используют AtomicLong, чтобы сделать его поточно-ориентированным, и вы можете сэкономить несколько циклов, если вы закодировали не поточно-ориентированную версию. Исходный код находится в вашем каталоге установки JDK ... посмотрите.