Подтвердить что ты не робот

Как объявить я и j, чтобы сделать его бесконечным циклом?

while( i <= j && i >= j && i != j) {}

как объявить я и j, чтобы сделать его бесконечным циклом?

//Это вопрос интервью, который я встретил.

он спрашивает, какие объявления я и j, пусть это всегда верно.

И я не могу это сделать, объявив я и j как типы номеров. Какие другие типы могут встретиться с ним?

4b9b3361

Ответ 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.