Для сравнения объектов в Java используется метод equals(), но что если сравниваются между собой два объекта-обертки для примитивных типов:
Integer a = 120;
Integer b = 120;
Integer c = 130;
Integer d = 130;
System.out.println(a==b); // true
System.out.println(c==d); // false
Почему в первом случае возвращается true, а во втором false?
Класс Integer содержит кэш обёрток для значений от -128 до 127.
Если число лежит в этом диапазоне и обёртки нет в кэше, то создаётся новая обёртка и помещается в кэш для последущего использования.
Если не в диапазоне, то каждый раз создаётся новая обёртка и при сравнении вы получите false, так как объекты разные
Подробнее в исходниках метода valueOf
public static Integer valueOf(int val)
{
if (val < MIN_CACHE || val > MAX_CACHE)
return new Integer(val);
synchronized (intCache)
{
if (intCache[val - MIN_CACHE] == null)
intCache[val - MIN_CACHE] = new Integer(val);
return intCache[val - MIN_CACHE];
}
}
Для сравнения по значению можно привести один из объктов к примитивному типу:
System.out.println((int)a == b)
В Java доках в классе Integer сказано:
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
То есть по умолчанию кешируются значения между -128 и 127, как указано в JLS. Если значение попадает в этот диапазон, то оно берется из кеша, если нет, то сравниваться будут объекты.
Размером кеша можно управлять, изменяя параметры JVM:
-XX:AutoBoxCacheMax=<cache_max_value>
либо
-Djava.lang.Integer.IntegerCache.high=<cache_max_value>
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости