Загадочное поведение == после постинкрементации [дубликат]
На этот вопрос уже есть ответ здесь:
Кто-то постулировал в какой-то теме форума, что многие люди и даже опытные разработчики Java не поймут следующий мир кода Java.
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1++ == i2++);
System.out.println(i1 == i2);
Как человек с определенным интересом на Яве я высказал ему свои мысли и пришел к следующему результату.
System.out.println(i1++ == i2++);
// True, since we first check for equality and increment both variables afterwards.
System.out.println(i1 == i2);
// True again, since both variables are already incremented and have the value 128
Затмение говорит мне обратное. Первая строка является истинной, а вторая-ложной.
Я действительно был бы признателен за разъяснение.
Второй вопрос. Является ли это специфичным для Java или этот пример также применим, например, к языкам на основе C?
2 ответа:
Integer i1 = 127; Integer i2 = 127; System.out.println(i1++ == i2++); // here i1 and i2 are still 127 as you expected thus true System.out.println(i1 == i2); // here i1 and i2 are 128 which are equal but not cached (caching range is -128 to 127),В случае 2, Если вы используете
equals(), он вернет true, так как оператор==для целых чисел работает только для кэшированных значений. поскольку 128 находится вне диапазона кэша, значения выше 128 не будут кэшироваться, поэтому вы должны использовать методequals(), чтобы проверить, являются ли два целых экземпляра выше 127 истиннымиТест:
Integer i1 = 126; Integer i2 = 126; System.out.println(i1++ == i2++);// true System.out.println(i1 == i2); //true Integer i1 = 126; Integer i2 = 126; System.out.println(i1++ == i2++);// true System.out.println(i1.equals(i2)); //true Integer i1 = 128; Integer i2 = 128; System.out.println(i1++ == i2++);// false System.out.println(i1==i2); //false Integer i1 = 128; Integer i2 = 128; System.out.println(i1++.equals(i2++));// true System.out.println(i1.equals(i2)); //true
Как объяснено, это связано сцелочисленным кэшированием . Для развлечения вы можете запустить программу со следующей опцией JVM:
-XX:AutoBoxCacheMax=128И он будет печатать true дважды (опция доступна на hostpot 7 - не обязательно на других JVMs).
Обратите внимание, что:
- это специфический JVM
- модифицированное поведение соответствует JLS, который говорит, что все значения между -128 и +127 должны быть кэшированы, но также говорит, что другие значениямогут быть кэшированный.
Итог: второй оператор print не определен в Java и может печатать true или false в зависимости от используемой реализации JVM и/или параметров JVM.