Я написал фрагмент кода Java, который работает в бесконечном цикле.
Ниже приведен код:
public class TestProgram {
public static void main(String[] args){
Integer i = new Integer(0);
Integer j = new Integer(0);
while(i<=j && j<=i && i!=j){
System.out.println(i);
}
}
}
В приведенном выше коде, видя условие в while
цикле, сначала кажется, что эта программа не войдет внутрь while
цикла. Но на самом деле это бесконечный цикл, и он продолжает выводить значение.
Что здесь происходит?
i<=j && j<=i && i!=j
это условие всегда истинно. Просто возьмите листок бумаги и оцените, вы его поймаете :)i
илиj
, когда вы ожидаете, что цикл завершится?i<=j
иj<=i
можно заключить, чтоi == j
, что противоречит последним слагаемым. Таким образом, все выражение оценивается как ложное, и время не вводится. Ключевым моментом здесь является идентичность объекта!Ответы:
i <= j
оценивается вtrue
, так как авто распаковка происходит за ИНТ сравнений , а затем , какi
иj
удерживать значение по умолчанию0
.j <= i
оценивается поtrue
указанной выше причине.i != j
оценивается какtrue
, потому что обаi
иj
являются разными объектами. А при сравнении объектов нет необходимости в автоматической распаковке.Все условия верны, и вы не меняетесь
i
иj
в цикле, поэтому он работает бесконечно.источник
Integer.valueOf(0) == Integer.valueOf(0)
всегда оценивается как истина, потому что в этом случае возвращается тот же объект (см. IntegerCache grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/… )Потому что вы сравниваете
0 < = 0 (true) // unboxing
0 > = 0 (true) // unboxing
reference != secondReference (true)
поскольку вы создаете объекты, а не примитивное сравнение. Итак, это оценивается какwhile(true) { // Never ending loop }
.источник
Целочисленные объекты разные. Он отличается от базового типа int.
См. Этот ответ: Как правильно сравнить два целых числа в Java?
i != j
Часть правды, что вы ожидали ложные.источник
true
как «автобокс». В случае №3 автобоксинг не применяется, и сравнение происходит на уровне объекта (области памяти).Цикл не заканчивается, потому что ваше условие истинно (i! = J истинно, потому что есть 2 разных объекта, используйте вместо этого Integer.valueOf), а внутри цикла значения не меняются, поэтому ваше условие остается истинным навсегда.
источник
Целочисленные объекты разные. Он отличается от базового типа int. так что вы можете просто так делать. что вы делаете, вы просто сравниваете объект и, конечно же, результат верный.
источник
Есть два разных случая, которые мы должны сначала понять,
Случай 1:
случай 2:
оба разные, так как
в случае 1:
i!=j
будетtrue
потому, что оба ссылаются на два разных объекта в куче и не могут быть одинаковыми. Нов случае 2:
i==j
будетtrue
потому, что оба 10 являются целочисленными литералами, а Java поддерживаетpool for Integer literals
значение(-128 <= X <= 127)
. Итак, в этом случае 10 <= 127 результатов истинны, поэтому оба будут ссылаться на один и тот же объект.источник
Возможно, причина в том, что и i, и j являются объектами, а сравнение объектов - это не то же самое, что сравнение ссылок на объекты. Пожалуйста, подумайте об использовании! Iequals (j) вместо i! = J
источник
Программа продолжает отображать одно и то же значение,
i
потому что вы не увеличиваете или не уменьшаете значениеi
илиj
. Условие в for всегда оценивается как истинное, так что это бесконечный цикл.источник
i!=j
части, которая на удивление соответствует истине, а не о<=
сравнениях.При сравнении <= и> = будет использоваться значение 0 без упаковки, а при сравнении! = Ссылки будут выполнены успешно, поскольку они являются разными объектами.
Даже это тоже будет работать i, e
но это не так:
Причина в том, что Integer внутренне использует кеширование для объектов Integer от -128 до 127 и возвращает экземпляры из этого кеша для охваченного диапазона. Я не уверен, но думаю, что вы также можете изменить его максимальное значение в пакете "java.lang.Integer.IntegerCache.high".
Для лучшего понимания проверьте URL: https://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching
источник
вы должны знать, что это немного отличается в && this и this &, когда вы используете &&, тогда, когда первое условие истинно, тогда он проверяет второе условие, если оно ложно, тогда оно не проверяет третье условие, потому что в операторе &, если одно условие ложно, все утверждение ложно, если используется || тогда, если он видит true, он возвращает true в вашем коде, потому что i и j равны, первое и второе условие истинно, тогда в третьем условии оно будет ложным, потому что они равны, а условие - false.
источник