자바 에서 String 이 왜 Immutable 인지.
2606 단어 그렇게 기본 적 이지 않 은 자바 베이스.
문자열 풀
우선, String 은 String 풀 에 저 장 된 것 입 니 다. 다음 과 같은 예 를 보십시오.
String str1 = "hello";
String str2 = "hello";
String str3 = "he" + new String("llo");
String str4 = new String("hello");
// str1 String hello , ;str2 String hello , , , ,str1 str2
System.out.println("str1 = str2 : " + (str1 == str2));
// new String , String str1,str2
System.out.println("str1 = str3 : " + (str1 == str3));
//new String
System.out.println("str1 = str4 : " + (str1 == str4));
str2 = "hello2";
//String Immutable , String hello2 , str2, hello ,str1
System.out.println("str1 = str2 : " + (str1 == str2));
Console output :
str1 = str2 : true
str1 = str3 : false
str1 = str4 : false
str1 = str2 : false
우 리 는 서로 다른 String 대상 이 String 풀 안의 같은 인 스 턴 스 를 참조 할 수 있 는 것 을 보 았 습 니 다. 이것 은 String 의 Immutable 특성 에 의 해 지원 되 는 것 입 니 다. 그렇지 않 으 면 모든 인용 이 String 에 대한 변 화 는 다른 인용 에 영향 을 줄 수 있 습 니 다.
다 중 스 레 드 필드
그 다음으로 String 의 Immutable 특성 으로 인해 다 중 스 레 드 장면 에서 안전하게 사용 할 수 있 고 추가 동기 화 필요 가 없습니다.
캐 시 hashcode
또한, HashMap 에서 우 리 는 String 을 key 로 자주 사용 하기 때문에 String 은 그 자체 의 hashcode 를 캐 시 합 니 다. 매번 다시 계산 하지 않 아 도 효율 을 크게 향상 시 켰 습 니 다. 이것 도 Immutable 특성 에 의 해 지탱 되 는 것 입 니 다.
안전 문제
마지막 으로 가장 중요 한 이 유 는 안전 에 대한 고려 때문이다.
String 은 항상 네트워크 연결 이나 로 컬 파일 을 여 는 작업 의 매개 변수 로 서 값 이 바 뀔 수 있다 면 매우 큰 보안 문 제 를 가 져 올 것 입 니 다. 사용자 가 파일 A 에 대해 읽 기 권한 이 있 고 파일 B 에 대해 없다 고 가정 하면 먼저 파일 A 를 열 고 파일 경 로 를 표시 하 는 String 대상 을 파일 B 의 경로 로 바 꿀 수 있 습 니 다.권한 검증 을 건 너 뛰 어 파일 B 의 내용 을 읽 을 수 있 습 니 다.
더욱이 String 은 ClassLoader 에서 사 용 됩 니 다. String 의 값 이 바 뀔 수 있다 면 위험한 클래스 가 불법 으로 호출 될 수 있 습 니 다.