몇 부분으로 나눕니다
String s1 = "hello";
이 문장은 메모리에 Hello 공간과 점유 공간을 포함하는 문자열 , 즉 상수 문자열 풀 을 생성하고이를 참조 객체 s1에 할당합니다.
String s2 = s1;
이 문장은 같은 문자열 hello 를 새로운 참조 s2에 할당합니다.
__________
| |
s1 ---->| hello |<----- s2
|__________|
두 참조 모두 동일한 문자열을 가리 키므로 다음과 같은 값을 출력하십시오.
out.println(s1); // o/p: hello
out.println(s2); // o/p: hello
문자열 은 변경할 수 없지만 할당이 가능하므로 s1 은 이제 새로운 값 스택을 참조합니다 .
s1 = "stack";
__________
| |
s1 ---->| stack |
|__________|
그러나 안녕하세요를 가리키는 s2 객체는 어떻 습니까 ?
__________
| |
s2 ---->| hello |
|__________|
out.println(s1); // o/p: stack
out.println(s2); // o/p: hello
String은 불변이므로 Java Virtual Machine은 메소드로 문자열 s1을 수정할 수 없습니다 . 다음과 같이 풀에 모든 새 문자열 객체를 만듭니다.
s1.concat(" overflow");
___________________
| |
s1.concat ----> | stack overflow |
|___________________|
out.println(s1); // o/p: stack
out.println(s2); // o/p: hello
out.println(s1.concat); // o/p: stack overflow
문자열이 변경 가능하면 출력은
out.println(s1); // o/p: stack overflow
이제 String에 concat () 과 같은 메소드 를 수정 한 이유가 놀랍습니다 . 스 니펫을 따르면 혼란이 사라집니다.
s1 = s1.concat(" overflow");
여기에서는 수정 된 문자열 값을 다시 s1 참조에 할당 합니다.
___________________
| |
s1 ---->| stack overflow |
|___________________|
out.println(s1); // o/p: stack overflow
out.println(s2); // o/p: hello
그래서 Java는 String을 최종 클래스 로 결정했습니다. 그렇지 않으면 누구나 문자열 값을 수정하고 변경할 수 있습니다. 이것이 조금 도움이되기를 바랍니다.