java의 String internal()

5692 단어
1. 먼저 String은 8가지 기본 데이터 유형에 속하지 않으며 String은 하나의 대상이다.
대상의 기본값이null이기 때문에String의 기본값도null입니다.그러나 그것은 또 하나의 특수한 대상이며, 다른 대상에 없는 일부 특성이 있다.
2. new String () 과 new String (") 은 모두 새로운 빈 문자열입니다. 빈 문자열이null이 아닙니다.
3. String str=”kvill”; String str=new String (“kvill”);의 차이점:
여기서 우리는 무더기도 말하지 않고 창고도 말하지 않고 상량지라는 간단한 개념만 간단하게 도입한다.
상수지 (constant pool) 는 컴파일링 기간이 정해지고 컴파일된 것에 저장되는 것을 가리킨다.class 파일의 일부 데이터입니다.그것은 클래스, 방법, 인터페이스 등에 대한 상수도 포함하고 문자열 상수도 포함한다.
보기 1:
String s0=”kvill”; 
String s1=”kvill”; 
String s2=”kv” + “ill”; 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
   : 

true 
true

우선, 자바는 문자열 상수에 복사본이 하나밖에 없다는 것을 알아야 한다.
예시 중의 s0과 s1의'kvill'은 모두 문자열 상수이기 때문에 컴파일링 기간에 확정되기 때문에 s0==s1은true이다.'kv'와'ill'도 모두 문자열 상수이다. 한 문자열이 여러 문자열 상수로 연결되면 그 자체도 문자열 상수일 것이다. 그래서 s2도 컴파일링 기간에 하나의 문자열 상수로 해석되기 때문에 s2도 상수지 중의'kvill'의 인용이다.
그래서 우리는 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는 후반부 new String('ill')이 있기 때문에 컴파일링 기간에 확정할 수 없기 때문에 새로운 창설 대상'kvill'의 응용이다.그걸 알면 왜 이 결과가 나왔는지 알 수 있을 거야.
4. String.intern():
존재class 파일의 상수 풀은 실행 기간에 JVM에 마운트되며 확장할 수 있습니다.String의 인터넷 () 방법은 상수도를 확충하는 방법이다.String 실례str가 인터넷 () 방법을 호출할 때 자바는 상수 탱크에 같은 유니코드의 문자열 상수가 있는지 찾고 있으면 인용을 되돌려줍니다. 그렇지 않으면 상수 탱크에str와 같은 문자열을 추가하고 인용을 되돌려줍니다.예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.intern () 방법을 사용하면 하나의 String 클래스를 전역 String 테이블에 저장할 수 있습니다. 같은 값을 가진 유니코드 문자열이 이 테이블에 이미 있다면, 이 방법은 테이블에 있는 문자열의 주소를 되돌려주고, 테이블에 같은 값의 문자열이 없으면 자신의 주소를 테이블에 등록합니다."만약 내가 그가 말한 전역 String 테이블을 상수지로 이해한다면, 그의 마지막 말은테이블에 같은 값의 문자열이 없으면 자신의 주소를 테이블에 등록하는 것이 잘못되었습니다.
보기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을 호출할 때.() 이후 상수지에 'kvill' 상수를 새로 추가했습니다. 상수지에 없는 'kvill' 은 여전히 존재합니다. '자신의 주소를 상수지에 등록하는 것' 도 아닙니다.
s1==s1.인터넷 ()는false로 원래의'kvill'이 여전히 존재한다는 것을 설명한다.
s2는 현재 상수지의'kvill'주소이기 때문에 s2==s1.인터넷()은 true입니다.
 
 
5. equals() 및 ==:
이것은 String에서 간단하게 말하자면 두 문자열의 유니코드 서열이 비슷한지 비교하는 것이다. 만약 같은true로 되돌아온다면.==는 두 문자열의 주소가 같은지, 즉 같은 문자열의 인용인지 비교하는 것이다.
6. 스트링에 관해서는 변할 수 없다
이 말은 또 많은 것을 말해야 한다. 모두들 String의 실례가 일단 생성되면 다시 바뀌지 않는다는 것을 알기만 하면 된다. 예를 들어 Stringstr="kv"+"ill"+"+"+"ans"등이다.바로 4개의 문자열 상수입니다. 먼저'kv'와'ill'이'kvill'을 생성하여 메모리에 저장한 다음에'kvill'과'생성'kvill이 메모리에 존재하고 마지막에'kvillans'를 생성합니다.그리고 이 문자열의 주소를str에 부여했습니다. 바로 String의'불변'때문에 임시 변수가 많이 생겼습니다. 이것이 바로 StringBuffer를 사용하는 것을 권장하는 이유입니다. 왜냐하면 StringBuffer는 바꿀 수 있기 때문입니다.

좋은 웹페이지 즐겨찾기