Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
counts.put(next, val+1)
, особенно если у нас частые повторы слов. Давно уже пользуюсь вторым подходом как раз, чтобы избегать лишних вставок в map, на счет боксинга тоже подозревал, но никак руки не доходили проверитьНу или в крайнем случае после подсчёта скопировать всё в новую Map.Что не так?
Надо в начало каждой статьи вставлять слова, что перед оптимизацией сперва используйте профайлер?
Однако в некоторых случаях вам помогут изменяемые (mutable) числа.
Кстати — короткоживущие объекты почто не влияют на производительность
Конкретно задачу из примера намного лучше решить с использованием AtomicInteger и его атомарного инкремента.Вы проверяли, насколько это быстро? Атомарный инкремент ужасно медленный. Просто ужасно. Попробуйте эту задачу распараллелить, вы больше потеряете, чем приобретёте.
К тому же, если пока вы считали распределение строк, ваши изменяемые числа не дай бог успели постареть и попасть в OldGenНестрашно, если их мало.
adjustOrPutValue
.class MutableInt {
static Object create() { return new int[1]; }
static int get(Object ref) { return ((int[])ref)[0]; }
static void set(Object ref, int value) { ((int[])ref)[0] = value; }
static int incAndGet(Object ref) { return ++((int[])ref)[0]; }
static int getAndInc(Object ref) { return ((int[])ref)[0]++; }
}
Надеюсь автор сам написал класс и еще просто не знаком с commons-lang и классами из пакета org.apache.commons.lang.mutable.Автор знаком и сослался на commons.lang. Но здесь класс написал сам, чтобы понятнее было.
Немного быстрее будет если заменить класс-обертку одноэлементным массивов. И то, и другое HotSpot успешно компилирует в быстрый код, но доступ к элементам массива происходит немного быстрее.
public class SuperClass<T> {
public void setT(T obj) {
//...
}
}
public class SubClass<Number> extends SuperClass<Number> {
// Здесь будет ошибка компиляции, т.к. метод с такой сигнатуров уже есть
public void setT(Object obj) {
//...
}
public void setT(Number obj) {
//...
}
}
Изменяемые числовые объекты