-
s = new String("xyz"); 얼마나 많은 문자열 객체가 생성됩니까? 하나는 "xyx"이고 다른 하나는 "xyx"를 가리키는 참조 객체입니다.
String s="Hello";int i=3; 이 표현식이 정확합니까? Java에서는 데이터 유형이 일치하지 않는다는 메시지가 표시됩니다. 문자열은 클래스이기 때문에 올바른 접근 방식: s+="3" 또는 s+='3' 또는 s+=(char)i;
String 객체를 생성하는 또 다른 방법, 즉 따옴표로 묶인 텍스트를 소개하겠습니다. 이 메서드는 String에만 고유하며 새 메서드와는 매우 다릅니다.
JVM(JAVA Virtual Machine)에는 많은 String 객체를 저장하고 공유할 수 있는 문자열 풀이 있어 효율성이 향상됩니다. String a="abc";, 이 코드 행이 실행되면 JAVA 가상 머신은 먼저 문자열 풀을 검색하여 "abc" 값을 가진 객체가 이미 존재하는지 확인합니다. 판단 기준은 String class equals(Object)입니다. obj) 메서드의 반환 값입니다. 있는 경우 새 개체가 생성되지 않고 기존 개체에 대한 참조가 직접 반환됩니다. 그렇지 않은 경우 개체가 먼저 생성된 다음 문자열 풀에 추가된 다음 해당 참조가 반환됩니다.
문자열 객체 생성: Java에서는 문자열 객체[일반적으로 말해서 객체는 항상 힙에 메모리를 할당합니다]를 광범위하게 사용하기 때문에 메모리 공간과 실행 시간을 절약하기 위해(예: 문자열을 비교할 때, ==가 equals()]보다 낫습니다. 모든 문자열 리터럴은 컴파일 단계에서 리터럴 풀에 들어가고 런타임 리터럴 풀은 상수 풀의 일부가 됩니다. 리터럴 풀의 장점은 풀의 동일한 문자열 상수가 모두 병합되어 하나의 공간만 차지한다는 것입니다. 우리는 두 개의 참조 변수에 대해 ==를 사용하여 해당 값 [참조]이 동일한지, 즉 동일한 개체를 가리키는지 확인합니다.
이제 String s = new String("abc"); 문을 살펴보세요. 여기서 "abc" 자체는 풀의 개체이며 new String()이 런타임에 실행되면 풀의 개체 복사본이 배치됩니다. 힙에 있는 이 객체의 참조를 s에 넘깁니다. 좋습니다. 이 명령문은 2개의 String 객체를 생성합니다.
String s1 = new String("abc") ;String s2 = new String("abc") ;if( s1 == s2 ){ //실행되지 않을 명령문}
//얼마나 많은 문자열 개체가 생성되었습니까? [3개, 하나는 풀에 있고 두 개는 힙에 있습니다. ]
텍스트를 포함하기 위해 따옴표를 사용하여 생성된 String 개체 간의 "+" 연결로 생성된 새 개체만 문자열 풀에 추가됩니다. 새 메서드에서 생성된 새 개체(null 포함)를 포함하는 모든 "+" 연결 표현식의 경우 생성된 새 개체는 문자열 풀에 추가되지 않습니다.
1.==는 동일한 객체에서 참조된다는 의미이고, equals()는 값이 동일하다는 의미입니다.
String str1 = "abc"; 참조된 개체가 스택(또는 문자열 풀)에 있습니다.
String str1 =new String ("abc"); 참조된 개체가 메모리/힙에 있습니다.
2.String str1 = 스택의 "string";
String str3 = 스택의 "str";
String str4 = 스택의 "ing";
String str2 = str3+str4; 힙에서, + 기호의 기능은 스택에서 문자열 값을 찾는 대신 새로 생성된 다른 String 객체를 반환하는 것이기 때문입니다. String str2 = "str"+"ing"이면 최종 결과는 스택에 있습니다. str1==str2는 참입니다.
그러나 우리의 관심을 요구하는 상황이 하나 있습니다. 아래 코드를 살펴보십시오.
공개 클래스 StringStaticTest {
public static final String A = "ab" // 상수 A;
public static final String B = "cd" // 상수 B;
공개 정적 무효 메인(String[] args) {
String s = A + B; // 두 상수를 +로 연결하여 s를 초기화합니다.
문자열 t = "abcd";
만약 (s == t) {
System.out.println("s는 t와 같습니다. 동일한 개체입니다.");
} 또 다른 {
System.out.println("s는 t와 같지 않습니다. 그들은 같은 객체가 아닙니다.");
}
}
}
이 코드를 실행한 결과는 다음과 같습니다.
s는 t와 같습니다. 둘은 동일한 객체입니다.
그 이유는 위의 예에서 A와 B는 상수이고 그 값이 고정되어 있으므로 s의 값도 고정되어 있으며 클래스를 컴파일할 때 결정되었기 때문이다. 즉, String s=A+B;는 다음과 같습니다. String s="ab"+"cd";
위의 예를 약간 변경하여 어떤 일이 발생하는지 살펴보겠습니다.
공개 클래스 StringStaticTest {
public static final String A; // 상수 A;
공개 정적 최종 문자열 B; // 상수 B
정적 {
A = "ab";
B = "CD";
}
공개 정적 무효 메인(String[] args) {
// 두 상수를 +로 연결하여 s를 초기화합니다.
문자열 s = A + B;
문자열 t = "abcd";
만약 (s == t) {
System.out.println("s는 t와 같습니다. 동일한 개체입니다.");
} 또 다른 {
System.out.println("s는 t와 같지 않습니다. 그들은 같은 객체가 아닙니다.");
}
}
}
작업 결과는 다음과 같습니다.
s는 t와 같지 않으며 동일한 객체가 아닙니다.
약간만 변경하면 결과는 지금의 예와 정반대입니다. 다시 분석해 보겠습니다. A와 B는 상수로 정의되어 있지만(한 번만 할당 가능) 즉시 할당되지는 않습니다. s의 값이 계산되기 전, 언제 할당되는지, 어떤 값을 할당받는지는 모두 변수입니다. 따라서 A와 B는 값이 할당되기 전에는 변수처럼 동작합니다. 그러면 s는 컴파일 타임에 결정될 수 없고 런타임에만 생성될 수 있습니다.
마지막으로 JVM(JAVA Virtual Machine)에서 문자열 개체의 저장소와 문자열 풀과 힙 및 스택 간의 관계에 대해 이야기해 보겠습니다. 먼저 힙과 스택의 차이점을 살펴보겠습니다.
스택: 기본 유형(또는 내장 유형)(char, byte, short, int, long, float, double, boolean)과 객체 참조를 주로 저장하며 데이터 공유가 가능하며 속도는 등록보다 빠릅니다. 더미.
힙: 객체를 저장하는 데 사용됩니다.
String 클래스의 소스 코드를 살펴보면 String 개체의 값을 저장하는 value 속성이 있음을 알 수 있습니다. 유형은 char[]이며 문자열이 문자 시퀀스임을 보여줍니다. String a="abc";를 실행하면 JAVA 가상 머신은 스택에 'a', 'b', 'c' 세 개의 char 값을 생성한 후 힙에 String 객체를 생성하고 해당 값(value ) 는 스택 {'a', 'b', 'c'}에 방금 생성된 세 개의 char 값의 배열입니다. 마지막으로 새로 생성된 String 개체가 문자열 풀에 추가됩니다.
그런 다음 String b=new String("abc"); 코드를 실행하면 "abc"가 문자열 풀에 생성되고 저장되므로 JAVA 가상 머신은 힙에 새 String 개체만 생성하지만 value는 이전 코드 줄이 실행될 때 스택에 생성된 세 가지 char 유형 값 'a', 'b' 및 'c'입니다.
이 시점에서 우리는 이 기사의 시작 부분에서 제기된 String str=new String("abc")이 왜 두 개의 개체를 생성하는지에 대한 질문에 대해 이미 매우 명확했습니다.
이 기사는 CSDN 블로그에서 가져온 것입니다. 재인쇄할 때 출처를 표시하십시오: http://blog.csdn.net/yakihappy/archive/2009/03/10/3977169.aspx
이 기사는 CSDN 블로그에서 가져온 것입니다. 재인쇄할 때 출처를 표시하십시오: http://blog.csdn.net/Foxalien/archive/2009/12/18/5029470.aspx
-