String s1 = "하하";
String s2 = "하";
s2 += "하";
System.out.println(s1.hashCode()); // 출력 결과 : 1747712
System.out.println(s2.hashCode()); // 출력 결과 : 1747712
System.out.println(s1 == s2); // 출력 결과 : false(?)
자바에서는 String을 많이 쓰는데 보다 효율적으로 메모리를 쓰기 위해서 String Constant Pool을 만들었다.
→ 재사용이 가능
s1의 경우 String 리터럴로 생성되어 힙 영역에 String Constant Pool에 들어간다.
String의 불변성 때문에 s2의 경우 "하"가 더해지면서 뒤에 이어서 붙이는 게 아니라 새로운 객체를 생성하고 담는다.
→ new String("하하")
때문에 s1과 s2는 가르키는 객체가 서로 다른데 hashCode() 메소드를 통해 해시코드를 보면 같은 결과를 출력한다.
hashCode는 분명 객체에 대응되는 주소 값을 리턴한다고 알고있는데 왜 같은가?
그리고 해쉬코드는 같은데 왜 s1 == s2의 출력 결과는 false가 나오는가?
답은 생각보다 간단했다.
같은 문자열인데 hashCode가 다르면 hashCode의 존재 의미가 없어진다.
∴ String 클래스에서는 hashCode() 메소드를 같은 값이면 같은 hashCode 값을 가리키도록 오버라이딩하여 재정의 하였다.
결론
String에서는 hashCode와 객체 주소와는 연관이 없다.