Для сравнения объектов в 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>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно реализовать повтор строки в столбик 1 раз (если то условие выполняется)Ниже выделил где именно это происходит
Надо выводить какие-то действия в консоль + логировать их в файлЯ сделал это с помощью log4j
Хочу написать взаимодействие jni и fasm на x64 битной архитектуре и возникла небольшая проблема