2013-09-27 4 views
51

Вот код, который я должен выяснить, как это возможно. У меня есть ключ, но я не знаю, как это сделать. Я думаю, что речь идет о отрицательных и положительных числах и, возможно, переменных модификаторах. Я новичок, я смотрел решение повсюду, но я не мог найти ничего полезного.Как можно утверждать, что «a <= b && b <= a && a! = B"?

Вопрос в том, что: вам нужно объявить и инициализировать две переменные. Условие if должно быть истинным.

код:

if(a <= b && b <= a && a!=b){ 
     System.out.println("anything..."); 
} 

Я ценю, что вы нашли время,.

+1

для 'int', я не думаю, что' if' когда-либо оценивает 'true' –

+0

. Я не удивлюсь, если есть комбинация чисел с плавающей запятой, где это работает. – Thilo

+0

Я просмотрел -0F и 0F, но они этого не сделают. Я думаю, что Генри - это намеченный ответ. – erickson

ответ

92

Это невозможно с примитивными типами. Вы можете достичь его с штучной Целые:

Integer a = new Integer(1); 
Integer b = new Integer(1); 

В <= и >= сравнения будет использовать Unboxed значение 1, в то время как != будет сравнивать ссылки и успеха, так как они разные объекты.

+5

Эти тонкости в новых функциях, прикрепленных к Java 5, просто ужасны ... Какая вероятность для ошибок. – Thilo

+5

@Thilo Существует причина, по которой они называются тонкостями.Я не думаю, что с этой уловкой что-то не так. –

+2

@Thilo согласился, авто-бокс и -unboxing удобны только, если вы точно знаете, что делаете. – Henry

20

Это тоже работает:

Integer a = 128, b = 128; 

Это не:

Integer a = 127, b = 127; 

Auto-бокс int является синтаксическим сахаром для вызова Integer.valueOf(int). Эта функция использует кеш для значений меньше 128. Таким образом, назначение 128 не имеет кэш-атаки; он создает новый экземпляр Integer с каждой операцией автоматического бокса, а a != b (сравнение ссылок) истинно.

Назначение 127 имеет кэш, и полученные объекты Integer действительно являются одним и тем же экземпляром из кеша. Таким образом, сравнение ссылок a != b является ложным.

+5

Следует отметить, что * точная * граница того, что кэшируется, не специфицирована в спецификации. –

+1

@JoachimSauer Интервал [-128, 127] должен быть кэширован, согласно спецификации, поэтому 127, например, всегда будет терпеть неудачу. Значения за пределами этого интервала * могут быть кэшированы, что может привести к сбою. – erickson

11

Другим редким случаем для переменных класса может быть то, что другой поток может изменять значения a и b во время выполнения сравнения.

Смежные вопросы