
어떻게보면 조금은 재밌는 주제로 가져와봤다. 😉
왜 첫번째 결과는 true인데 2번째 결과는 false 일까?
Integer a = 1;
Integer b = 1;
System.out.println(a==b); //true
Integer x = 128;
Integer y = 128;
System.out.println(x==y); // false
Integer의 Java caches범위가 -128~127이고 Java는 메모리 사용을 최적화 하기위해서 같은 값은 같은 공간에 담고 재사용한다.
실제로 메모리주소를 알수는 없지만. idhashcode를 확인할 수 있다.
다음과 같이 동일한 것을 볼 수 있다.
Integer a = 1;
Integer b = 1;
System.out.println(System.identityHashCode(a)); //1711574013
System.out.println(System.identityHashCode(b)); //1711574013
그렇다. 리터럴값이 -128 ~ 127에 속한다면 같은 메모리 공간에 위치시켜서 동일한 곳을 참조하게 된다.
반면에 범위를 넘는 경우에는 2개의 변수는 다른 공간의 메모리에 위치하게 된다.
Integer x = 128;
Integer y = 128;
System.out.println(System.identityHashCode(x)); //1631862159
System.out.println(System.identityHashCode(y)); //1146848448
Integer 객체의 값을 비교하려고 한다면 .equals()를 사용하면 된다.
Integer x = 128;
Integer y = 128;
System.out.println(x==y); // false
System.out.println(x.equals(y)); // true
int와 같은 기본형(primitive type)은 ==을 통해서 값을 비교하는 게 가능하지만
그 외의 참조형(Reference type)들은 .equals를 통해서 값을 비교하는 것이 바람직하다.
간단하게 설명하면!

실제로 integer는 출력하려고하면 NPE관련 경고가 뜨지만 int는 그렇지 않다.
public class difftest {
public static void main(String[] args) {
int i1 = 128;
int i2 = 128;
System.out.println("i1 == i2: " + (i1 == i2)); // true
// Integer 객체 비교 (캐싱 범위 내)
Integer x = 1;
Integer y = 1;
System.out.println("x == y: " + (x == y)); // true
System.out.println("x equals y: " + (x.equals(y))); // true
// Integer 객체 비교 (캐싱 범위 밖)
Integer a = 128;
Integer b = 128;
System.out.println("a == b: " + (a == b)); // false
System.out.println("a equals b: " + (a.equals(b))); // true
String t1 = new String("same text");
String t2 = new String("same text");
String t3 = "same text";
String t4 = "same text";
System.out.println(t1==t2); //false
System.out.println(t3==t4); //true
System.out.println(t1==t3); //false
System.out.println(t1.equals(t2)); // true
System.out.println(t1.equals(t3)); // true
}
}