Как объявить я и j, чтобы сделать его бесконечным циклом?
while( i <= j && i >= j && i != j) {}
как объявить я и j, чтобы сделать его бесконечным циклом?
//Это вопрос интервью, который я встретил.
он спрашивает, какие объявления я и j, пусть это всегда верно.
И я не могу это сделать, объявив я и j как типы номеров. Какие другие типы могут встретиться с ним?
Ответы
Ответ 1
Integer i=new Integer(1000);
Integer j=new Integer(1000);
System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j));
i
и j
будут автоматически распаковываться в int для <=
и >=
, но не для !=
. i
и j
- разные экземпляры, но имеют одинаковое значение int. Вот почему все три сравнения вернутся к истине.
Ответ 2
Это тоже работает ( "на моей машине" ):
Integer a = 128, b = 128;
тогда как это не сработает:
Integer a = 127, b = 127;
Авто-бокс a int
является синтаксическим сахаром для вызова Integer.valueOf(int)
. Эта функция использует кеш для значений от -128 до 127 включительно. Он может кэшировать другие значения, но в моем случае это не так.
Таким образом, назначение 128 не имеет кэш-памяти; он создает новый экземпляр Integer
при каждой операции автоматического бокса, а ссылочное сравнение a != b
истинно. Назначение 127 имеет кэш, а результирующие объекты Integer
- это тот же самый экземпляр из кеша. Итак, ссылочное сравнение a != b
неверно.
То, что я действительно хочу отметить, - это остерегаться сравнения ссылок с авто-боксом. Более вероятная реальная проблема заключается в том, что вы ожидаете, что a == b
истинно, потому что им было присвоено одно и то же (автоматическое поле) значение, вы запускаете некоторые модульные тесты, которые подтверждают ваше ожидание, а затем ваш код выходит из строя "в дикой природе", когда некоторый счетчик превышает верхний предел кэша. Веселые времена!
Ответ 3
Любое равное значение 'i' и 'j' покажет true с данным утверждением, скажем:
Integer i = new Integer(1);
Integer j = new Integer(1);
while( i <= j && i >= j && i != j) {}
Магия с использованием оператора! В случае оператора!= Компилятор принимает операнды как объекты (включая их значения), тогда как в случае >= или <= компилятор принимает только значение операндов. Таким образом, приведенное выше утверждение возвращает true.