오늘 책을 읽다가 String의 intern() 메소드를 발견했습니다. 이 메소드를 본 적은 있지만 자세히 본 적은 없습니다. 그래서 오늘 좀 살펴봤습니다. 개인적으로 이 메서드를 String 클래스에 추가하면 성능이 조금 향상될 수 있다고 생각합니다. 왜냐하면 상수 풀에서 데이터를 가져오는 것이 힙에서 데이터를 가져오는 것보다 빠르기 때문입니다. (개인적인 느낌)
이 메소드에 대한 API의 몇 문장은 사실 요약하자면 이 메소드를 호출한 후 문자열객체 상수 풀에 참여하세요. 상수 풀은 메소드 영역의 일부이고, 메소드 영역은 스레드별로 공유되므로 상수 풀도 스레드별로 공유된다는 것은 모두가 알고 있는 사실입니다. 스레드 프리안전하지 않은 , 실제로는 스레드로부터 안전합니다. 참조 값이 변경되면 동일한 값을 가진 참조 가 동일한 위치를 가리키게 됩니다. 상수 풀의 새 값, 그러면 새 상수 결과가 열리고 스레드가 동기화되지 않을 때와 동일한 객체 대신 새 참조로 전달됩니다. new의 문자열이 직접 할당됩니다. 변수 문자열은 서로 다른 위치에 저장됩니다. 전자는 힙에 있고 후자는 상수 풀에 있습니다. 또한 문자열 접합 작업을 수행할 때, 즉 " +", 결과는 상수 풀이나 힙에 상황에 따라 다를 수 있다는 것입니다. 테스트하기 위해 몇 줄의 코드를 작성했습니다.
먼저 결과는 다음과 같습니다.
1. 문자열 변수를 직접 정의할 때 값을 지정합니다. 표현식 의 오른쪽에 문자열 상수만 있는 경우 변수는 상수 풀에 저장됩니다.
2. new로 생성된 문자열은 힙에 저장됩니다.
3. 문자열을 이어붙일 때, 즉 "+" 연산을 할 때 두 가지 상황이 발생합니다.
i. 표현식의 오른쪽이 순수 문자열 상수인 경우 스택 내부에 저장됩니다.
ii. 표현식 오른쪽에 문자열 객체의 핸들인 문자열 참조가 있으면 힙에 저장됩니다.
String str1 = "aaa"; String str2 = "bbb"; String str3 = "aaabbb"; String str4 = str1 + str2; String str5 = "aaa" + "bbb"; System.out. print ln(str3 == str4); // false System.out.println(str3 == str4.intern()); // true System.out.println(str3 == str5);// true
결과: str1, str2, str3 및 str5는 모두 상수 풀에 존재합니다. str4는 표현식의 오른쪽 절반에 참조 유형이 있으므로 str4는 힙 메모리에 존재하지만 str5에는 참조가 없습니다. 표현식의 오른쪽에 있는 유형입니다. 순수 문자열 상수는 상수 풀에 저장됩니다. 실제로 이 패키징 유형의 Integer -128 ~ +127도 상수 풀에 저장됩니다. 예를 들어 Integer i1 = 10; 이는 아마도 성능 최적화를 위한 것일 것입니다.
[관련 추천]
String 객체의 intern()에 대한 자세한 설명
위 내용은 Java에서 intern()의 역할 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!