가장 먼저 알아야 할 것은 == 연산은 두 객체 또는 기본 유형 a와 b가 동일한 메모리 영역을 가리키는지 여부를 결정한다는 것입니다
String의 기본 구현은 private final value[] 입니다. String이 인스턴스화되면 실제로 System.arraycopy를 통해 char 배열을 저장하기 위해 연속 메모리를 나눕니다.
new String("abc")은 실제로 이러한 방식으로 String을 초기화하는 것이 권장되지 않습니다. 실제 구현에는 a = "abc"보다 한 단계 더 필요합니다.
메모리 공간을 나누어 임시 배열 임시 생성
온도[0] = 'a';온도[1] = 'b';온도[2] = 'c';
배열 값을 생성하고 value가 가리키는 메모리 공간을 temp가 가리키는 메모리 공간, 즉 &value = &temp(a = "abc"를 사용하는 경우 이 단계는 필요하지 않음)를 가리킵니다.
인턴 방식은 jdk1.5에서 제공하는 방식으로 메모리 최적화를 위해 사용됩니다. 동일한 문자열은 동일한 메모리 공간을 참조하는데, 이는 실제로 위의 세 번째 단계입니다. 여기서 a와 b가 같다면
로 쓸 수 있습니다.
으아악
실제 연산은 위의 세 번째 단계, 즉 b = a;
String b = "abc"의 실제 기본 구현은 다음과 같습니다.
메모리 공간을 나누어 배열값 생성
값[0] = a.값[0];값[1] = a.값[0]';값[2] = a.값[0];
두 번째 단계에서 String b의 value[0]에 있는 String a의 value[0]는 실제로 동일한 메모리 주소를 가리키므로 실제로는 b.value[0] = a.value[0 ] = ' a'이지만 b.value는 a.value와 동일하지 않습니다. 근본적인 이유는 가리키는 메모리 영역이 다르기 때문입니다
으아아아
a.intern()
메서드를 호출했지만 반환 결과를 다시 할당하지 않았습니다.a
은 여전히 원래a
입니다.equals()
을 사용하여 문자열 동일성을 판단하세요. 이 질문은 Java에서도 실패했습니다.a.intern(); a 문자의 참조는 변경되지 않으며 반환 값이 있습니다.
으아악다음은 동일합니다
으아악
여기서 a와 "abc"는 두 개의 개체입니다. 인턴 메서드가 호출되면 문자 상수 풀에 이미 이 개체와 동일한 문자열이 포함되어 있으므로 뒤에 b="가 있어도 인턴 메서드 호출은 쓸모가 없습니다. abc", b와 a는 동일한 객체가 아닙니다.
출력을 동일하게 하려면 첫 번째 문장은 다음과 같습니다.
으아악두 번째 문장은 다음과 같습니다.
으아악가장 먼저 알아야 할 것은 == 연산은 두 객체 또는 기본 유형 a와 b가 동일한 메모리 영역을 가리키는지 여부를 결정한다는 것입니다
String의 기본 구현은
private final value[]
입니다. String이 인스턴스화되면 실제로 System.arraycopy를 통해 char 배열을 저장하기 위해 연속 메모리를 나눕니다.
new String("abc")은 실제로 이러한 방식으로 String을 초기화하는 것이 권장되지 않습니다. 실제 구현에는 a = "abc"보다 한 단계 더 필요합니다.
로 쓸 수 있습니다. 으아악
실제 연산은 위의 세 번째 단계, 즉 b = a;[JAVA 소스코드 분석 - Java.lang] 문자열 소스코드 분석