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
"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
마지막으로 또 다른 오해를 풀겠습니다.
예제 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"이 여전히 존재한다는 의미입니다. 상수 풀에 "자체 주소를 등록"하는 것이 아닙니다.
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 사용을 권장합니다
[관련 권장 사항]
위 내용은 String 객체의 intern()에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!