Java의 String 클래스는 매우 일반적으로 사용되는 클래스이지만 세부 사항에 대한 관심이 가장 적기 때문에 대부분의 인터뷰에서는 이 클래스에 중점을 둡니다. 예를 들어 String str = new String("hello"); 는 여러 메모리 공간, String과 StringBuffer의 차이점 등을 엽니다. 제가 이해한 바는 다음과 같습니다.
String은 final로 수정된 클래스이므로 상속될 수 없습니다. StringBuffer도 final에 의해 수정된 클래스입니다.
1. JVM 메모리 분할
Java에는 주로 4가지 메모리 공간이 있습니다. 스택 메모리 공간, 힙 메모리 공간, 글로벌 데이터 영역, 글로벌 코드 영역
1. 스택 메모리 공간 : 모든 객체 이름 저장 (참조되는 힙 메모리 공간의 주소가 저장됨)
2. 힙 메모리 공간 : 각 객체의 특정 내용 저장
3. 글로벌 데이터 영역: 정적 타입 데이터 속성 저장(글로벌 데이터)
4. 글로벌 코드 영역: 모든 메소드 정의 저장
JVM에서 힙 메모리는 객체 인스턴스화의 내용(프로그램 데이터)을 저장하는 메모리 공간으로, 객체의 이름을 저장하고 그 내용은 해당 힙의 주소를 가리킨다.
2. Sring의 메모리 할당
String에는 특별한 기능이 있습니다. String 객체를 생성할 때 new 생성 또는 "hello"를 사용하여 직접 생성할 수 있습니다. 두 가지 방법 중 두 번째 방법을 사용하는 것이 좋습니다.
1. String a = "hello";
2. String a= new String("hello");
설명은 다음과 같습니다. 🎜>
1: 객체 참조는 스택 메모리에 정의되어 힙 메모리에 있는 "hello" 값의 메모리 주소를 가리킵니다. 드디어 추억의 공간이 열렸습니다
2: a의 객체 참조가 스택 메모리에서 재정의됩니다. 먼저 "hello" 값으로 힙 메모리의 메모리 주소를 가리킨 다음 "hello" 값으로 힙 메모리의 주소를 가리킵니다. "새로운 후. 결국 두 개의 공간이 열렸습니다. 첫 번째 공간에는 객체 참조가 없으며 JVM에 의해 가비지 수집됩니다.
도표는 다음과 같습니다.
🎜>
그 중 a==b==d와 c=e만 있습니다.
설명:
1. String은 새로운 메모리가 나올 때마다 힙 메모리를 기다리기를 원하지 않으며 d는 그렇지 않습니다. new가 새 주소를 할당한 후 기다리고 싶고 new 이후의 주소를 버리고 a에 해당하는 메모리 주소를 가리키고 있으므로 동일합니다.
2. "hello" 할당의 직접 할당 방식이 가리키는 힙 메모리 공간은 동일합니다. String은 Java에서 공유 설계를 사용하며, 이 개체 풀은 여러 개체를 저장할 수 있습니다. 새로 인스턴스화된 개체가 개체 풀에 이미 있으면 개체 풀에서 직접 반복적으로 정의하고 사용하지 않습니다. . 따라서 기존 콘텐츠에
을 사용하면 개체는 인스턴스의 공간 주소를 가리킵니다.
차이점은 StringBuilder는 스레드 동기화되지 않으므로 해당 작업이 StringBuffer보다 효율적이어야 한다는 것입니다.
일부 사람들은 다음과 같이 생각할 것입니다.
String str = "hello"; > str 값도 변경되지 않았나요?
및 StringBuffer는 메모리 공간만 열므로 APPEND를 사용하여 삭제와 같은 작업 내용을 추가할 수 있습니다. String 객체가 생성될 때마다 시스템 성능에 영향을 미치게 됩니다. 특히 메모리에 참조되지 않은 객체가 너무 많으면 JVM의 GC가 작동하기 시작하며 속도는 확실히 상당히 빨라질 것입니다. 느린. 그러나 StringBuffer/StringBuilder 클래스를 사용하면 결과가 달라질 수 있습니다. 매번 결과는 새 개체를 생성한 다음 개체 참조를 변경하는 대신 StringBuffer/StringBuilder 개체 자체에 대한 작업이 됩니다.
따라서 루프에 문자열을 할당할 때는 메모리를 절약하고 성능을 향상시킬 수 있는 StringBuffer(스레드 안전) 또는 StringBuilder를 사용하는 것이 가장 좋습니다
.
위 내용은 Java의 String, StringBuffer, StringBuilder의 차이점과 스택 메모리 할당으로 소개된 내용의 차이입니다. 자세한 내용은 PHP 중국어(www.php.cn)를 참고하세요. !