Java의 String 객체 데이터 유형 전체 분석

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

좋은 웹페이지 즐겨찾기