java.lang.String 류 의 불변성 을 깊이 이해 하 다
5174 단어 java.lang.String불변성
무엇이 불가 변류 입 니까?
이렇게 이해 하면
한 대상 이 생 성 이 끝 난 후에 상 태 를 바 꿀 수 없고 구성원 변 수 를 바 꿀 수 없습니다.(구성원 변수 가 기본 데이터 형식 을 포함 하면 이 기본 데이터 형식의 값 은 바 꿀 수 없습니다.인용 형식 이 포함 되 어 있 으 면 이 인용 형식의 변 수 는 다른 대상 을 가리 킬 수 없습니다)
가 변 클래스 는 인 스 턴 스 가 수정 할 수 없 는 클래스 일 뿐 입 니 다.모든 인 스 턴 스 에 포 함 된 모든 정 보 는 이 인 스 턴 스 를 만 들 때 제공 되 고 대상 의 전체 생명 주기 에 고정 되 어야 합 니 다.클래스 가 변 하지 않도록 다음 다섯 가지 규칙 을 따라 야 합 니 다.
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
// value final
private final char value[];
...
}
String 클래스 의 대표 문자열 입 니 다.자바 프로그램의 모든 문자열 글자 액면가(예 를 들 어 abc)는 이러한 인 스 턴 스 로 이 루어 집 니 다.이 글자 들 의 액면 가 는 모두"방법 구역"에 직접 저 장 된
에 저 장 됩 니 다.문자열 은 상수 입 니 다.그들의 값 은 생 성 후
이 므 로 공유 할 수 있 습 니 다.예 를 들 면:
String str = "abc";
그 러 자 왜 String 이 변 하지 않 는 지 의문 이 들 었 다.하지만 제 코드 에 서 는 String 이 자주 바 뀌 어 요.다음 과 같 습 니 다.
String str = "HELLO";
str = "WORLD";
System.out.println(str); // WORLD
이렇게 조작 하면'HELLO'대상 을'WORLD'대상 으로 바 꾸 는 것 이 아 닙 니까?문자열 의 내용 이"HELLO"에서"WORLD"로 변 한 것 처럼 보이 지만,실제로는 새로운 문자열 이 생 성 되 었 습 니 다.
String str = "HELLO";
System.out.println(str.hashCode()); // 68624562
str = "WORLD";
System.out.println(str.hashCode()); // 82781042
변수 str 전후의 hashCode 값 이 다 르 기 때문에 str 가 변경 전후 에 서로 다른 대상 을 가리 키 고 있 음 을 설명 합 니 다.따라서 변수 str 는 서로 다른 대상 만 가리 키 고 문자열'HELLO'대상 자 체 는 변 하지 않 았 습 니 다.변수 str 의 지향 은 다음 그림 과 같 습 니 다(jdk 1.8:문자열 상수 가 쌓 여 있 습 니 다).
우리 도 javap 명령 을 사용 하여 class 의 상수 탱크 를 볼 수 있 습 니 다:
javap -c -v StringTest.class
실행 후 상수 탱크 정 보 는 다음 과 같 습 니 다.상수 탱크 에서 볼 수 있 듯 이 두 개의 문자열 대상 이 있 습 니 다:HELLO,WORLD
[총 결]:String 대상 더미 에서 만 들 면 수정 할 수 없습니다.그리고 String 류 의 모든 API 방법 은 문자열 자체 의 값 을 바 꾸 지 않 고 새로운 문자열 대상 을 되 돌려 줍 니 다.
2.String 디자인 이 가 변 적 이지 않 은 장점
'String 은 가 변 적 이지 않다'는 것 을 알 게 된 후,사람들 은 왜 String 을 가 변 적 이지 않 은 것 으로 설계 해 야 하 는 지 의 심 스 럽 지 않 습 니까?이렇게 하면 또 무슨 좋 은 점 이 있 습 니까?
주로 다음 과 같은 몇 가지 측면 에서 고려한다.
// : ; , hello
String s = new String("hello");
그렇다면 다음은 몇 개의 대상 이 생 성 될 까?
// :helloworld。
String s3 = "hello" + "world";
이런 글자 의 양은'+'로 연결 되 고 컴 파일 러 는 컴 파일 기간 에 직접 최적화 된다.
// 4 。2 :hello、world
// 2 :StringBuilder、helloworld
String s = "hello";
String s2 = s + "world";
컴 파일 후,역 컴 파일 소프트웨어---jad 를 사용 하여 보기:
String s1 = "hell0";
String s2 = (new StringBuilder()).append(s1).append("world").toString();
발견:"+"를 사용 하여 변수 와 글자 의 양 을 조합 한 결과 String 을 StringBuilder 로 변환 한 후 append()방법 으로 처 리 했 습 니 다.StringBuilder.toString()방법 원본 보기:
@Override
public String toString() {
// char[] value; value StringBuilder
return new String(value, 0, count);
}
마지막 으로 toString()방법 을 호출 할 때 String 대상 을 만 듭 니 다.이 문자열 의 대상 은 더미 에 만 생 성 되 며 문자열 상수 탱크 에 만 생 성 되 지 않 습 니 다.따라서 4 개의 대상 을 만 듭 니 다(hello 와 World 는 문자열 상수 탱크 에서 직접 만 듭 니 다).자바.lang.string 류 를 깊이 이해 하 는 불변성 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바.lang.string 불변성 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[ReactJS] Immutability불변성: 값이나 상태를 변경할 수 없는 값을 의미 필요한 값을 변형해서 사용하고 싶다면 어떤 값의 사본을 만들어서 사용해야 한다. 리액트는 얕은 비교를 통해 새로운 값인지 아닌지를 판단한 후 새로운 값인 경우 리렌더...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.