2013-07-11 2 views
3

Я разместил два примера ниже.

В первом примере я использую оператор равным, и процесс продолжается навсегда, а не прерывается, когда это необходимо.

Во втором примере я использую оператор больше или равен, и процесс прерывается, когда это необходимо.

Как это возможно?
При сравнении двух равных целых чисел в цикле while оператор с равным оператором терпит неудачу?

Пример 1:

Integer myVar1 = 42985; 
    Integer myVar2 = 1; 
    while (true) 
    { 
    if (myVar2 == myVar1) 
    { 
    break; 
    } 

    ++ myVar2; 
    } 

Пример 2:

Integer myVar1 = 42985; 
    Integer myVar2 = 1; 
    while (true) 
    { 
    if (myVar2 >= myVar1) 
    { 
    break; 
    } 

    ++ myVar2; 
    } 

EDIT: Спасибо всем за прекрасные ответы! Теперь я полностью понимаю проблему, и эта новая информация объясняет несколько странных поведений, которые я встречал в своих приложениях. Жаль, что я не смог выбрать более одного ответа.

ответ

5

Это является одним из менее приятных эффектов авто-бокса.

В первом примере оператор == указывает на равенство идентичности: два объекта будут равны, если они являются одним и тем же экземпляром.

В вашем втором примере оператор '> =' указывает числовое сравнение: два объекта будут автоматически распаковываться, а затем сравниваться.

делая вещи более запутанными, есть целый ряд "малых" целые числа (-128 < < = X = 127, IIRC), для которых JVM кэширует Integer значения, поэтому оператор ==иногда работы.

Нижняя линия: используйте .equals() и .compareTo().

+0

Есть ли случаи, когда я хотел бы использовать оператор '==', или я должен просто прекратить его использовать? Кроме того, как насчет оператора '! ='? Имеет ли тот же недостаток? –

+0

@ EricGlass - как я уже сказал, используйте '.equals() 'и' .compareTo() '. Время * * *, которое вы должны использовать '==' с объектами, - это когда вы явно проверяете идентичность объекта (что, как я считаю, я редко делаю). – parsifal

+0

Спасибо, ответ! –

5

Чтобы сравнить стоимость двух объектов, вы должны использовать .equals().

В любое время, когда вы используете ==, он будет сравнивать экземпляры объектов. .equals() - метод, унаследованный от Object и используемый для сравнения значений объектов.

+0

Спасибо, ответ! –

1

Вы сравниваете, если ссылки здесь те же, вы не сравниваете примитивных типов:

if (myVar2 == myVar1) 

Вы должны использовать equals для сравнения значений:

if (myVar2.equals(myVar1)) 

Для >= случае, это не будет работать с Object, поэтому оно будет отменять значения и работать так, как вы ожидаете.

+0

Спасибо, ответ! –

3

>= не работает с объектами, только численные значения. Integer s распаковываются в ints, которые можно сопоставить должным образом.

При использовании == не происходит никакого распаковки, поэтому ссылки сравниваются. Это никогда не гарантирует сравнение значений.

Вы можете использовать:

(myVar2.equals(myVar1)) 
+0

Спасибо, ответ! –

1

Autounboxing происходит при использовании >=, но не при сравнении с == использования equals для сравнения объектов

Я рекомендую вам проверить это question

+0

Спасибо, ответ! –

1

Используйте этот код для сравнения:

Integer myVar1 = 42985; 
Integer myVar2 = 1; 
while (true) 
{ 
if (myVar2.equals(myVar1)) 
{ 
break; 
} 

++ myVar2; 
} 
+0

Спасибо, ответ! –

1

В Java, тип 'INT' является примитивным, в то время как тип в 'Integer' является объектом.

так для сравнения объектов, использование равных() метод

так как использование:

Integer myVar1 = 42985; 
Integer myVar2 = 1; 
while (true) 
    { 
    if (myVar2.equals(myVar1)) 
    { 
     break; 
    } 

    ++ myVar2; 
    } 

или объявить его с помощью INT

int myVar1 = 42985; 
int myVar2 = 1; 
while (true) 
    { 
    if (myVar1==myVar2) 
    { 
     break; 
    } 

    ++ myVar2; 
    } 
+0

Спасибо, ответ! –

2

Вы должны использовать equals, сравнивая e 2 объекта.

, если вы все еще хотите использовать >= затем автоматического распаковывать (де-Autobox) myvar1 и myvar2:

if (myVar2.intValue() >= myVar1.intValue()) 

Простой Наилучшая практика для авто-бокса в Java: Классы-оболочки следует использовать только в случаях, когда вы абсолютно не можете использовать примитив.

+0

Большое спасибо за предложение intValue()! –

3

В примере 1, при использовании оператора == с два Integer вы сравниваете свои позиции в памяти, потому что Integer класс и переменные myVar1 и myVar2 являются объектами, и они не распакованные в двух int примитивов, тогда как в ПРИМЕРЕ 2, когда вы используете оператор >=, два объекта Integer распаковываются, и процесс прерывается, когда это необходимо. Вы можете использовать оператор equals:

Integer myVar1 = 42985; 
Integer myVar2 = 1; 
while (true) { 
    if (myVar2.equals(myVar1)) { 
     break; 
    } 


    ++myVar2; 
} 

Или вы можете попробовать метод intValue():

Integer myVar1 = 42985; 
Integer myVar2 = 1; 
while (true) { 
    if (myVar2.intValue() == myVar1.intValue()) { 
    break; 
} 

++myVar2; 
} 

Если Integer значение объекта равно или меньше, чем 127 оператор == будет работать:

Integer myVar1 = 127; 
Integer myVar2 = 1; 
while (true) { 
    if (myVar2 == myVar1) { 
     break; 
} 


++myVar2; 
} 
+0

Большое спасибо за предложение intValue()! –