#java
Для сравнения объектов в 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?
Ответы
Ответ 1
Класс 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)Ответ 2
В 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=} 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= либо -Djava.lang.Integer.IntegerCache.high=
Комментариев нет:
Отправить комментарий