Hibernate proxy & amp; & amp; равно [дублировать]

двойной выход из косой черты в полном пути, если вы находитесь в окнах.

33
задан Ciro Santilli 新疆改造中心 六四事件 法轮功 14 February 2016 в 23:55
поделиться

4 ответа

Нет, постоянный пул для чисел не работает так же, как для строк. Для строк используются только константы времени компиляции, тогда как для типов оберток для целых типов любая операция по боксу будет всегда использовать пул, если он применим для этого значения. Так, например:

int x = 10;
int y = x + 1;
Integer z = y; // Not a compile-time constant!
Integer constant = 11;
System.out.println(z == constant); // true; reference comparison

JLS гарантирует небольшой диапазон объединенных значений, но реализации могут использовать более широкий диапазон, если они пожелают.

Обратите внимание, что, хотя это не гарантируется, каждый Реализация Я рассмотрел использование Integer.valueOf для выполнения операций бокса - так что вы можете получить тот же эффект без помощи языка:

Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
System.out.println(x == y); // true

Из раздела 5.1 .7 из JLS :

Если значение p, помещенное в поле, равно true, false, байт или символ в диапазоне от \ u0000 до \ u007f, или int или короткое число от -128 до 127 (включительно), затем пусть r1 и r2 - результаты любых двух бокс-конверсий p. Всегда бывает, что r1 == r2.

В идеале боксирование данного примитивного значения p всегда дает идентичную ссылку. На практике это может оказаться невозможным с использованием существующих методов внедрения. Правила выше - прагматичный компромисс. Последнее заключительное предложение требует, чтобы определенные общие значения всегда помещались в неразличимые объекты. Реализация может кэшировать эти, лениво или нетерпеливо. Для других значений эта формулировка запрещает любые предположения о идентичности вложенных значений на части программиста. Это позволило бы (но не требовать) совместного использования некоторых или всех этих ссылок.

Это гарантирует, что в большинстве распространенных случаев поведение будет желательным, не налагая чрезмерного штрафа за производительность, особенно на небольшие устройства. Менее ограниченные памятью реализации могут, например, кэшировать все значения char и short, а также значения int и long в диапазоне от -32K до + 32K.

42
ответ дан Jon Skeet 15 August 2018 в 18:19
поделиться

Java поддерживает пул Integer с -128 до 127

Объявление целых чисел, как показано ниже

Integer i1 = 127;

Результаты в

Integer i1 = Integer.valueOf(127);

So что на самом деле происходит в первом случае

Integer i1 = 127;<---Integer.valueOf(127);
Integer i2 = 127;<---Integer.valueOf(127);<---Same reference as first

Из исходного кода Integer для метода класса valueOf

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

Итак, вы получаете такую ​​же ссылку, если значение находится между -128 до 127, и вы вызываете valueOf иначе он просто возвращает new Integer(i)

. И поскольку ссылка такая же, ваш оператор == работает для целых чисел, возвращаемых valueOf между этим диапазоном.

18
ответ дан Amit Deshpande 15 August 2018 в 18:19
поделиться
  • 1
    +1 для упоминания Integer.valueOf (). Другие ответы, похоже, считают, что это просто магия. – user207421 27 October 2012 в 08:37

Короче говоря, новые версии кеша Java Integer находятся в диапазоне от -128 до 127 (256 значений). смотрите здесь

Что именно сравнивает целые числа с == do?

2
ответ дан Community 15 August 2018 в 18:19
поделиться

Java кэширует целые объекты в диапазоне -128 to 127. Поэтому, когда вы пытаетесь присвоить значение в этом диапазоне объекту wrapper, операция boxing вызовет метод Integer.valueOf и, в свою очередь, назначит ссылку на объект, уже находящийся в пуле.

С другой стороны, если вы присвоите значение вне этого диапазона ссылочному типу wrapper, Integer.valueOf создаст для этого значения новый объект Integer. И, следовательно, сравнение reference для объектов Integer, имеющих значение вне этого диапазона, даст вам false

Итак,

Integer i = 127;  --> // Equivalent to `Integer.valueOf(127)`
Integer i2 = 127;

// Equivalent to `Integer.valueOf(128)`
// returns `new Integer(128)` for value outside the `Range - [-128, 127]`
Integer i3 = 128; 
Integer i4 = 128;

System.out.println(i == i2); // true, reference pointing to same literal
System.out.println(i3 == i4); // false, reference pointing to different objects

Но, когда вы создаете свое целое число экземпляры с использованием оператора new, новый объект будет создан в куче. Итак,

Integer i = new Integer(127);
Integer i2 = new Integer(127);

System.out.println(i == i2); // false
7
ответ дан Rohit Jain 15 August 2018 в 18:19
поделиться
  • 1
    Сравнение с i3-i4 неверно, поскольку вы используете int, а не Integer. – Jon Skeet 27 October 2012 в 08:26
  • 2
    @JonSkeet. Ой! Прости. Я должен был Integer на всех четырех местах. Будет ли это редактировать. Спасибо за указание :) – Rohit Jain 27 October 2012 в 08:27
  • 3
    Ответ в основном неверен. Java не кэширует целые литералы. Java кэширует объекты Integer от -128 до 127 , если вы вызываете Integer.valueOf () для их получения, , что происходит в автоматическом боксе, но не в коде OP, что почему он не дает ответ ожидаемый. – user207421 27 October 2012 в 08:41
  • 4
    @EJP. Можете ли вы, пожалуйста, удалить ваш downvote сейчас. Конечно, если у вас есть вниз. – Rohit Jain 27 October 2012 в 08:52
  • 5
    Конечно, когда ваш ответ правильный. Не раньше, чем. Я предоставил достаточно информации для вас, чтобы исправить это. Вы еще не ассимилировали все это. – user207421 27 October 2012 в 10:06
Другие вопросы по тегам:

Похожие вопросы: