[자바]String, String.intern(), String pool+equals()
String, String.intern(), String pool
여러분은 String을 어떻게 사용하시나요?
Hoit이라는 문자열을 출력해보겠습니다.
결과는 어떻게 나올까요?
결과는 똑같이 나오네요
그렇다면 비교연산자중 동등연산자(==)를 사용해서 비교해보겠습니다.
결과
결과를 보니 ①,③은 서로 동등 ②는 ①,③과 동등하지 않다고 나오는군요.
이번에는 문자열을 비교하는 equals() 메소드를 사용하여서 비교해보겠습니다.
결과
equals를 사용해서 보니 결과가 문자열이 같다는걸 알 수 있습니다.
가끔씩 equals()와 == 의 차이점을 묻는 경우가 있습니다.
위의 결과로 보니 equals()과 ==는 다른 결과를 가져오는 것을 알 수 있습니다
과정 다 떼고 결과만 보자면 결국 문자열을 비교할때는 equals() 메소드를 사용해라!
위에 말만 알고 넘어가도 아무런 지장이 없습니다만..
조금 더 알고 싶으신분들은 글을 계속 읽으셔도 좋을 것 같습니다
-------------------------------------------------------------------------------
String a = "Hoit";
String aa = new String("Hoit");
이 두가지가 내부에서는 처리하는것이 어떻게 다를까요?
먼저 String a = "Hoit"; < 이렇게 선언을 하면 메모리영역중 Heap Area의 Permanent area에 String Pool로 등록됩니다.( intern()이라는 메소드가 자동 호출되면서 등록시킵니다).
이렇게 String Pool에 등록되면 프로세스가 종료될때까지 계속 유지됩니다.
String은 사용될때 먼저 String Pool에 등록되있는지 체크하고 처음 등록된 것을 사용하게 됩니다
이것과는 다르게 String aa = new String("Hoit")으로 생성된 Hoit은 다른 객체 생성과 마찬가지 만들때마다 새로운 메모리에 올라가게 됩니다.
이렇게 만들고 보니 왜 연산자 ==로 비교했을때 다른 결과가 나온지 알게되었습니다.
동등연산자 ==는 메모리주소적 동등을 비교합니다.
그래서 단순 문자열 비교에서는 사용하면 안되는 것을 알 수 있습니다.
한가지 더 알아두자면 new를 통해서 생성된 Hoit도 intern();을 사용한다면 String Pool에 등록할 수 있습니다.