>  기사  >  Java  >  String, StringBuffer, StringBuilder의 차이점과 Java의 스택 메모리 할당에 대한 그래픽 소개

String, StringBuffer, StringBuilder의 차이점과 Java의 스택 메모리 할당에 대한 그래픽 소개

黄舟
黄舟원래의
2017-03-04 09:33:061917검색

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에서 공유 설계를 사용하며, 이 개체 풀은 여러 개체를 저장할 수 있습니다. 새로 인스턴스화된 개체가 개체 풀에 이미 있으면 개체 풀에서 직접 반복적으로 정의하고 사용하지 않습니다. . 따라서 기존 콘텐츠에

을 사용하면 개체는 인스턴스의 공간 주소를 가리킵니다.

3. e는 C의 메모리 공간을 직접 가리킨다.

4. 따라서 String을 사용할 때에는 메모리 공간을 줄이고 성능을 향상시키기 위해 직접 할당을 사용하는 것이 좋습니다.


3. String, StringBuffer, StringBuilder의 차이점

1. String, StringBuffer, StringBuilder는 모두 final로 수정되며 상속 및 재작성이 불가능합니다. 의.

2. String이 인스턴스화되면 메모리 공간의 콘텐츠 크기를 수정할 수 없습니다. StringBuffer는 인스턴스화 후 힙 메모리에서 동적으로 수정될 수 있는 스레드로부터 안전한 변수 문자 시퀀스입니다. 길이와 크기는 가변적입니다. StringBuilder가 인스턴스화되면 메모리 크기와 길이도 가변적입니다.

차이점은 StringBuilder는 스레드 동기화되지 않으므로 해당 작업이 StringBuffer보다 효율적이어야 한다는 것입니다.

일부 사람들은 다음과 같이 생각할 것입니다.

        String str = "hello"; > str 값도 변경되지 않았나요?

실제로 위 코드는 메모리에 "hello", "andy", "helloandy"라는 3개의 공간을 열었습니다. 해당 힙 메모리 크기는 고정되어 있으며 마지막으로 str은 "helloandy"를 가리킵니다. 힙 주소. 아래 그림과 같이

및 StringBuffer는 메모리 공간만 열므로 APPEND를 사용하여 삭제와 같은 작업 내용을 추가할 수 있습니다.

String 객체가 생성될 때마다 시스템 성능에 영향을 미치게 됩니다. 특히 메모리에 참조되지 않은 객체가 너무 많으면 JVM의 GC가 작동하기 시작하며 속도는 확실히 상당히 빨라질 것입니다. 느린. 그러나 StringBuffer/StringBuilder 클래스를 사용하면 결과가 달라질 수 있습니다. 매번 결과는 새 개체를 생성한 다음 개체 참조를 변경하는 대신 StringBuffer/StringBuilder 개체 자체에 대한 작업이 됩니다.

따라서 루프에 문자열을 할당할 때는 메모리를 절약하고 성능을 향상시킬 수 있는 StringBuffer(스레드 안전) 또는 StringBuilder를 사용하는 것이 가장 좋습니다

.


위 내용은 Java의 String, StringBuffer, StringBuilder의 차이점과 스택 메모리 할당으로 소개된 내용의 차이입니다. 자세한 내용은 PHP 중국어(www.php.cn)를 참고하세요. !


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.