Java == оператор

Возможный дубликат:
Weird Java Boxing

Привет,

Может кто-нибудь объяснить, почему последняя печать возвращает false?

int a = 100;
int b = 100;

System.out.println(a == b); // prints true

Integer aa = 100;
Integer bb = 100;

System.out.println(aa == bb); // prints true

Integer aaa = 1000;
Integer bbb = 1000;

System.out.println(aaa == bbb); // prints false

Спасибо Майкл

Ответ 1

Причина, по которой вторая печать оценивается как истина, заключается в том, что первые 128 объектов Integer кэшируются классом Integer. Вы хотите использовать. equals

Ответ 2

Вы сравниваете два объекта Integer, которые с помощью оператора == сравнивают две ссылки вместо двух значений.

Используйте метод equals(), чтобы убедиться, что вы сравниваете оба значения.

Ответ 3

Вы должны использовать Integer.compareTo для проверки числового равенства для объектов Integer. Оператор == сравнивает объекты, а не числа.

Ответ 4

Объекты Integer автобоксируются с помощью метода Integer.valueOf(int). Посмотрите документацию по этому методу. Тогда все должно стать ясным.

Ответ 5

То, что вы хотите использовать, - aaa.equals(bbb). В Java с использованием объектов == на объектах сравнивается, являются ли они одним и тем же экземпляром объекта, а не равны ли они по методу equals().

Ответ 6

Я удивлен, что второй случай возвращает true. Но почему в Java Puzzlers они советуют не смешивать использование классов Wrapper и оператора ==.

Взгляните на этот класс и код:

public class RichardInt {
    private int value;
    public RichardInt(int value) {
        this.value = value;
    }
}

Что было бы результатом следующего?

RichardInt aa = new RichardInt(100);
RichardInt bb = new RichardInt(100);
System.out.println(aa == bb); // prints false

Он печатает false, потому что оператор equals == сравнивает ссылки при использовании с объектами. Помните, что в Java объекты являются ссылочными типами, а примитивы (например, int) - это типы значений. (примечание: может ли кто-нибудь сообщить мне, если я злоупотребляю "типом ценности"? У меня такое чувство, что я есть.) Следующее напечатало бы правду:

RichardInt aa = new RichardInt(100);
RichardInt bb = aa;
System.out.println(aa == bb); // prints true

... так как aa и bb ссылаются на один и тот же экземпляр RichardInt.

Итак, возможно, описанное выше поведение легче понять в следующем примере...

Intger aaa = new Intger(1000);
Intger bbb = new Integer(1000);
System.out.println(aaa == bbb); // prints false

В более поздних версиях Java классы-оболочки (Integer и Float и Boolean и т.д.) могут быть автоматическими, что означает, что вы можете сделать следующее:

Integer aa = 1000;
// this is a shorthand for...
// Integer aa = new Integer(1000);

Но это приводит к запутанному поведению, когда вы пробуете такие вещи:

Integer aaa = 1000;
Integer bbb = 1000;
System.out.println(aaa == bbb); // prints false

Или даже лучше, вы можете получить головоломки, подобные этому...

// what values of x and y will result in output?
if(!(x<y)&&!(x>y)&&!(x==y)) {
    System.out.println("How is this possible?");
}

В конце концов, всякий раз, когда вы имеете дело с объектами, вы должны использовать .equals() вместо ==.

Integer aaa = 1000;
Integer bbb = 1000;
System.out.println(aaa.equals(bbb)); // prints true