>Java >java지도 시간 >String 객체의 intern()에 대한 자세한 설명

String 객체의 intern()에 대한 자세한 설명

Y2J
Y2J원래의
2017-05-19 09:45:261667검색

1. 우선 String은 8가지 기본 데이터 유형에 속하지 않습니다.
객체의 기본값이 null이기 때문에 String의 기본값도 null이지만 이는 특별한 종류의 객체이며 다른 객체에는 없는 특성을 가지고 있습니다.

2. new String()과 new String("")은 모두 null이 아닌 빈 문자열을 선언합니다.

3.
String str=new String (“kvill”);의 차이점:

여기서는 힙이나 스택에 대해 이야기하지 않고 단지 상수만 소개합니다. 풀 퍼스트 컨셉.

상수 풀은 컴파일 중에 결정되어 컴파일된 .class 파일에 저장되는 일부 데이터를 의미합니다. 여기에는 클래스, 메소드, 인터페이스 등의 상수와 문자열 상수가 포함됩니다.

예제 1 보기:

String s0=”kvill”; 
String s1=”kvill”; 
String s2=”kv” + “ill”; 
System.out.
print
ln( s0==s1 ); 
System.out.println( s0==s2 );

결과는 다음과 같습니다.

true 
true

우선, Java가 문자열 상수의 복사본은 하나만 있습니다.

예제에서 s0과 s1의 "kvill"은 모두 문자열 상수이므로 컴파일 타임에 결정되므로 s0==s1은 true이고 "kv"와 "ill"도 마찬가지입니다. 모든 문자열 상수. 문자열이 여러 문자열 상수로 연결되면 그 자체가 문자열 상수여야 하므로 s2도 컴파일 타임에 문자열 상수로 구문 분석되므로 s2도 상수 풀입니다. > "크빌"의. 따라서 s0==s1==s2; new String()으로 생성된 문자열은 상수가 아니며 컴파일 타임에 결정될 수 없으므로 new String()으로 생성된 문자열은 다음을 포함하지 않습니다. 상수 풀에는 자체 주소 공간이 있습니다.

예제 2 보기:


String s0=”kvill”; 
String s1=new String(”kvill”); 
String s2=”kv” + new String(“ill”); 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
System.out.println( s1==s2 );

결과는 다음과 같습니다.

false 
false 
false

예제 2에서 s0은 여전히 ​​"kvill"의 애플리케이션입니다. "를 상수 풀에 넣습니다. s1은 컴파일 타임에 결정될 수 없기 때문에 런타임에 생성된 새 개체 "kvill"에 대한 참조입니다. s2에는 새 문자열의 후반부("ill")가 있으므로 컴파일 시에 결정될 수 없습니다. 컴파일 시간이므로 새로운

객체

"kvill"의 응용 프로그램을 생성합니다. 이것을 이해하면 왜 이런 결과가 나오는지 알 수 있습니다. 4. String.intern():

한 가지 추가 사항: .class 파일에 존재하는 상수 풀은 런타임 중에 JVM에 의해 로드되고 확장될 수 있습니다. String의 intern() 메소드는 상수 풀을 확장하는 메소드로, String 인스턴스 str이 intern() 메소드를 호출하면 Java는 상수 풀에 동일한 유니코드를 갖는 문자열 상수가 있는지 확인하여 반환합니다. 그렇지 않은 경우 상수 풀에 str과 동일한 유니코드 문자열을 추가하고 해당 참조를 반환합니다. 예 3

예 3:

String s0= “kvill”; 
String s1=new String(”kvill”); 
String s2=new String(“kvill”); 
System.out.println( s0==s1 ); 
System.out.println( “**********” ); 
s1.intern(); 
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2 
System.out.println( s0==s1); 
System.out.println( s0==s1.intern() ); 
System.out.println( s0==s2 );
결과는 다음과 같습니다.

false 
********** 
false //虽然执行了s1.intern(),但它的返回值没有赋给s1 
true //说明s1.intern()返回的是常量池中”kvill”的引用 
true

마지막으로 또 다른 오해를 풀겠습니다.

누군가 "String 클래스를 전역 String으로 저장하려면 String.intern() 메서드를 사용하세요"라고 했습니다. 동일한 값을 가진 유니코드 문자열이 이미 테이블에 있으면 이 메서드는 테이블에 이미 있는 문자열의 주소를 반환합니다. "만약 그가 언급한 글로벌 스트링 테이블을 상수 풀로 해석한다면, 그의 마지막 문장인 "테이블에 같은 값을 가진 문자열이 없다면, 자신의 주소를 테이블에 등록하세요"라는 문장은 틀렸습니다.


예제 4 보기:

String s1=new String("kvill"); 
String s2=s1.intern(); 
System.out.println( s1==s1.intern() ); 
System.out.println( s1+" "+s2 ); 
System.out.println( s2==s1.intern() );

결과:

false 
kvill kvill 
true

이 클래스에서는 "kvill" 상수를 선언하지 않았으므로 "kvill", s1.intern()을 호출하면 새로운 "kvill" 상수가 상수 풀에 추가됩니다. 상수 풀에 없는 원래의 "kvill"이 여전히 존재한다는 의미입니다. 상수 풀에 "자체 주소를 등록"하는 것이 아닙니다.

s1==s1.intern()은 false입니다. 이는 원래 "kvill"이 여전히 존재함을 나타냅니다.


s2는 이제 상수 풀에서 "kvill"의 주소이므로 s2= =s1.intern()은 참입니다.

5. equals() 및 == 관련:

String의 경우 이는 단순히 두 문자열의 유니코드 시퀀스가 ​​동일한지 비교하고, =인 경우 true를 반환합니다. =는 두 문자열을 비교합니다. 문자열의 주소가 동일한지, 즉 동일한 문자열에 대한 참조인지 여부를 비교합니다.

6. String이 불변이라는 점에 관해 할 말이 많습니다.

String 인스턴스가 생성되면 변경되지 않는다는 점을 아는 한, 예를 들어 String str=" kv" +”ill”+” “+”ans”;
첫 번째로 “kv”와 “ill”이 “kvill”을 생성하여 메모리에 저장한 다음 “kvill”과 “ “를 생성합니다. "kvill"을 메모리에 저장하고 마지막으로 "kvill ans"를 생성하고 이 문자열의 주소를 str에 할당합니다. String의 "불변성"으로 인해 임시
변수
가 많이 생성되기 때문입니다. StringBuffer는 변경 가능하므로 StringBuffer 사용을 권장합니다
[관련 권장 사항]

1. Java 무료 동영상 튜토리얼

2. Java의 intern() 메소드 심층 분석

3. JAVA intern() 메소드 사용 경험 요약

4. Java에서 인턴 메소드의 개념은 무엇인가

분석 Java의 인턴 기능 ()

위 내용은 String 객체의 intern()에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.