Zagadka z równością dwóch Byte-ów.

0

Witam,
Bawiąc się - poznając klasę Byte napisałem kod :

1   Byte byte1 = 5;
2   Byte byte2 = new Byte((byte) 5);

3   System.out.println("byte1 = " + byte1);
4   System.out.println("byte2 = " + byte2);

5   System.out.println("byte1 == byte2 ? " + (byte1 == byte2));
6   System.out.println("byte1.equals(byte2) ? " + byte1.equals(byte2));
7   System.out.println("byte2 == 5 ? " + (byte2 == 5));
8   System.out.println("byte1 == 5 ? " + (byte1 == 5));

Wynik działania tego kodu to :

byte1 = 5
byte2 = 5
byte1 == byte2 ? false
byte1.equals(byte2) ? true
byte2 == 5 ? true
byte1 == 5 ? true

Dlaczego w 5-tej linijce jest false a w 7-mej i 8-mej true ?
Pozdrawiam

1

5 - obiekt byte1 nie jest obiektem byte2. 7 i 8 - zawartość obiektów jest równa 5.

2

Chyba nie do końca. byte1 jest obiektem typu Byte, zachodzi tutaj autoboxing(opakowanie prymitywa w obiekt).
Metoda Equals porównuje zawartość tych obiektów, a operator == porównuje referencje(czy pokazują na to samo miejsce w pamięci) - dlatego 5 zwróciło false(byte1 i byte2 to dwa różne obiekty).
Natomiast w 5 i 6 zachodzi unboxing - dane z obiektów są wyciągane i dopiero wtedy porównywane z literałem.

0

Właśnie. Ci co zaczynają przygodę z JAVĄ jak czegoś nie doczytają to mają problem. No ja też kiedyś miałem pytanie na rozmowie kwalifikacyjnej pytanie jak porównać dwa obiekty typu String. Dla tego kto nie doczytał o metodzie equals() mogło by się wydawać, że to jakieś głupie pytanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1