backend/Java

String클래스의 intern메서드와 constant pool (상수풀)

버리야 2006. 9. 11. 17:38
반응형

String클래스의 intern메서드와 constant pool (상수풀)

Java에서 쓰이는 모든 String 객체는 상수풀에서 관리됩니다. 상수풀은 클래스와 같은 Heap Permanent area(고정 영역)에 생성되어 Java 프로세스의 종료까지 그 생을 함께 합니다.

String new로 생성하지 않고 "" 리터럴을 사용하여 생성할경우, 내부적으로 new String() 메소드 호출 이후에 String.intern()이라는 메소드가 호출되어 고유의 인스턴스를 공유하도록 interned됩니다이것은 생성한 String Constant pool에 등록하는(만약 이전에 같은 char sequence의 문자열이 이미 상수풀에 있다면 문자열을 힙에서 해제하고 그 상수풀의 레퍼런스를 반환) 작업을 수행하지요.

, 같은 패키지의 같은 클래스 내에서는 정수(literal) 스트링들은 동일한 String 객체를 참조한다.

)

String a = "JAVA";

String b = "JAVA";

의 경우 a == b true

String a = new String( "JAVA" );

String b = "JAVA"

의 경우 a == b false

String a = new String( "JAVA" );

a = a.intern();

String b = "JAVA";

의 경우 a == b true

일반적으로 문자열들을 비교하기 위해서 equals메서드를 사용하지만, equals메서드로 문자열의 내용을 비교하는 것보다는 등가비교연산자(==)를 이용해서 주소(4 byte)를 비교하는 것이 더 빠르다.

명시적인 new String() 생성자를 호출했기 때문에 각각의 문자열이 상수풀에 intern되는 과정 없이 제각각의 heap 주소에 생성된 것입니다.

수형(int)값을 String으로 변환하는 두 가지 방법

1) String클래스의 valueOf메서드

2) 덧셈연산자(+)를 사용

반응형