В процессе изучения Java возник вопрос касательно TreeMap/HashMap. Вот пример кода:
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
for (int i = 0; i < n; ++i) {
int key = in.nextInt();
Integer value = map.get(key);
map.put(key, 1 + (value == null ? 0 : value));
}
Правильно ли я понимаю, что здесь проиходит 2 поиска в Map при каждом обновлении? Если да, то как реализовать такое за 1 поиск. Интересует работа именно с Map, т.к. задачи могут быть другие, это просто пример.
Можно ускорить с помощью mutable-Integer (AtomicInteger ниже только как пример, лучше самому написать класс MutableInteger с методами get/increment):
Есть ещё такой метод java.util.concurrent.ConcurrentMap.putIfAbsent(K, V), но это уже синхронизированные map'ы, которые по-идее работают медленнее.
Map.entrySet
Map.Entry.setValue
Не знаю насколько юзабельно — только что нагуглил.
В entrySet нужную пару надо будет еще найти.
В мапе значения — это ссылки на объекты. Соответственно если получить от туда значение и в объекте его поменять — поменяется значение и в мапе.
Но я ни разу не встречался с тем, что нужны были подобные оптимизации...
Ну с этим понятно уже все. Интересовало, есть ли какой способ для immutable классов. Так по сути любой класс можно завернуть и использовать, но более красивого способа нет?
P.S. Нашел то, что искал: