자바 기초 튜 토리 얼 의 String 깊이 분석
String 은 자바 에서 가장 많이 사용 되 고 가장 특수 한 클래스 라 고 할 수 있 습 니 다.글자 상수 이기 때문에 글자 상수 에는 기본 유형,String 유형,빈 유형 이 포함 되 어 있 습 니 다.
1.String 사용
1.String 의 불변성
/**
* The {@code String} class represents character strings. All
* string literals in Java programs, such as {@code "abc"}, are
* implemented as instances of this class.
* <p>
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared. For example:
* ...
*/
public final class String {
private final char value[];
}
String 대상 이 쌓 여 있 으 면 수정 할 수 없습니다.String 대상 이 char 배열 에 있 기 때문에 이 배열 은 final 키워드 로 수식 되 어 변 하지 않 습 니 다.2.문자열 정의
/**
*
*/
String str1 = "helloworld";
String str2 = "helloworld";
// ,
String str3 = new String("helloworld");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
// true, false
위의 세 마디 코드 는 어떻게 이해 합 니까?문자열 상수 탱크 라 는 개념 을 먼저 도입 해 야 합 니 다.문자열 상수 풀 은 자바 힙 에{Jdk 7.0 이전 문자열 상수 풀 을 PermGen 에 저장 하고 Jdk 7.0 에서 자바 힙 으로 이동 합 니 다.Jdk 8.0 에 서 는 PermGen 을 제거 하고 Metaspace 로 대체 합 니 다}.자바 메모리 모델 은 이 장의 중점 이 아 닙 니 다.
str 1 과 str 2 가 인용 한 문자열 의 글자 수 는 문자열 상수 탱크 에 있 고 str 3 가 인용 한 대상 은 자바 Heap 에 있 습 니 다.
왜,아직 이해 가 안 돼?예 를 들다
하루 일 하고 퇴근 시간 이 되 었 습 니 다.금 병 을 좀 보 려 고 합 니 다.됐 습 니 다.는 소설 사 이 트 를 열 고 온라인 으로 읽 습 니 다.30 분 이 지나 자 여자 표 가 집에 돌 아 왔 습 니 다.을 보 는 것 도 그녀 가 하고 싶 은 일 입 니 다.제 가 인터넷 주 소 를 보고 보 내 드 리 겠 습 니 다.자,그녀 도 보기 시 작 했 습 니 다.30 분 이 지나 면 우리 아버지 가 돌아 오 셨 습 니 다.그 도 삼 국 팬 이지 만 그 는 온라인 으로 보 는 것 을 좋아 하지 않 아서 서점 에서 한 권 샀 습 니 다.
위 에서 언급 한 소설 사 이 트 는 바로 하나의 문자열 상수 탱크 로 많은 문자열 의 글자 수 를 포함한다.예 를 들 어,등 이다.모든 문자열 의 글자 수 는 상수 탱크 에서 한 부 를 유지 하고 누가 사이트 에 들 어가 든 을 보 는 것 은 똑 같은 사이트 와 똑 같은 내용 이다.
저 와 여자 표 는 str1 과 str2 입 니 다.우 리 는 모두 같은 사이트 의 을 보 았 습 니 다.내용 뿐만 아니 라 인용 주소 도 똑 같 습 니 다.(문자열 상수 탱크 에 유일한'helloworld'가 보존 되 어 있 기 때문에 str1==str2 운행 결 과 는 true 입 니 다.
우리 아버 지 는 str 3 입 니 다.저 와 여자 표 가 다 릅 니 다.보 는 내용 도《삼 국 연 의》이지 만 실제 책 을 보면 인용 주소 가 다 르 고 한 권 의 책 은 여러 사람 이 동시에 보 는 것 을 지원 하지 않 습 니 다(문자열 대상 은 자바 힙 에 있 고 매번 new 는 하나의 대상 을 새로 만 듭 니 다).그래서 str 1=str 3 운행 결 과 는 false 입 니 다.
하나의 문자열 의 글자 크기 는 항상 String 류 의 같은 인 스 턴 스 를 참조 합 니 다.String.intern()방법 에 의 해 제한 되 어 있 기 때문에 이 방법 을 사용 하여 쌓 여 있 는 String 대상 을 문자열 상수 탱크 에 넣 을 수 있 습 니 다.이렇게 하면 메모리 사용 효율 을 향상 시 키 고 사용 하 는 사용자 가 유일한 인 스 턴 스 를 공유 할 수 있 습 니 다.
System.out.println(str1 == str3.intern());
// true
그렇다면 이 방법의 실현 논 리 는 어 떨 까?소스 코드 를 살 펴 보 자.
/**
* Returns a canonical representation for the string object.
* <p>
* A pool of strings, initially empty, is maintained privately by the
* class {@code String}.
* <p>
* When the intern method is invoked, if the pool already contains a
* string equal to this {@code String} object as determined by
* the {@link #equals(Object)} method, then the string from the pool is
* returned. Otherwise, this {@code String} object is added to the
* pool and a reference to this {@code String} object is returned.
* <p>
* It follows that for any two strings {@code s} and {@code t},
* {@code s.intern() == t.intern()} is {@code true}
* if and only if {@code s.equals(t)} is {@code true}.
* <p>
* All literal strings and string-valued constant expressions are
* interned. String literals are defined in section 3.10.5 of the
* <cite>The Java™ Language Specification</cite>.
*
* @return a string that has the same contents as this string, but is
* guaranteed to be from a pool of unique strings.
*/
public native String intern();
우 리 는 이것 이 native 방법 이라는 것 을 발견 했다.주석 을 보 니 str3.intern()방법 은 대체적으로 다음 과 같다.intern()을 실행 할 때 문자열 상수 탱크 에 같은 문자열 의 글자 가 있 는 지 판단 합 니 다.문자열 의 글자 수 를 직접 되 돌려 줍 니 다.포함 되 지 않 으 면 이 문자열 의 대상 을 문자열 상수 탱크 에 추가 하고 문자열 상수 탱크 에서 의 인용 을 되 돌려 줍 니 다.
되 돌아 오 는 인용 은 값 을 부여 해 야 합 니 다.그렇지 않 으 면 더미 의 주 소 를 가리 킬 것 입 니 다.즉,:
String str4 = new String("helloChina");
System.out.println(str4.intern() == str4);//false
str4 = str4.intern();
String str5 = "helloChina";
String str6 = "helloZhonghua"
System.out.println(str4 == str5);//true
다음은 메모리 구 조 를 살 펴 보 겠 습 니 다.3.정 의 된 문자열 에 값 을 다시 부여 합 니 다.
str6 = "helloHuaxia";
String 은 final 키워드 로 수식 되 어 변 하지 않 는 다 고 말 하기 시 작 했 습 니 다.그러면 이 때 메모리 에 어떻게 나타 납 니까?4.String 의"+"처리
String str7 = "good good" + " study";
String str8 = "good good study";
system.out.println(str7 == str8);
컴 파일 도 구 를 통 해 얻 을 수 있 습 니 다.
String str7 = "good good study";
String str8 = "good good study";
따라서 컴 파일 러 는 컴 파일 기간 에 변 수 를 합 치 는 것 이지 상수 탱크 에 세 개의 대상 인'good good','study','good good study'를 만 들 지 않 는 다 는 것 을 알 수 있다.str 7==str 8 실행 결과 true.하면,만약,만약...
String str9 = "good good ";
String str10 = str9 + "study";
system.out.println(str8 == str10);//false
이 때 실행 결 과 는 false 입 니 다.String 변수+문자 상수 방식 을 통 해 얻 은 결 과 는 더미 에 있 습 니 다.상수 풀 에 있 지 않 습 니 다.물론 intern()방법 으로 상수 풀 에 넣 을 수 있 습 니 다.또한'+'뿐만 아니 라 substring(),toUpperCase(),trim()등 을 호출 하여 돌아 오 는 것 은 모두 String 이 쌓 여 있 는 주소 입 니 다.5.String 이 자주 사용 하 는 방법
//str1 == "hello,world ";
//
str1.length()//12;
// 2 5 ( 2, 5, 0 )
str1.substring(2,5);//"llo"
// “ello”
str1.contains("ello");//true, indexOf
// ello str1
str1.indexOf("ello");//1
//
str1.split(",");//["hello","world"]
//
str1.trim();//"hello,world"
총화본 고 는 String 의 불가 변성,String 생 성 시 글자 의 양 과 String 대상 이 다 릅 니 다.문자열 의 글자 상수 풀,문자열 의 메모리 구조,자주 사용 하 는 String 관련 방법 에 대한 설명 입 니 다.잘못된 점 이 있 으 면 지적 해 주 십시오.함께 발전 하 시기 바 랍 니 다.감사합니다!
자,이상 이 이 글 의 모든 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.