Java文字列定数プールの理解
2982 ワード
概要
String newString1 = new String("abc");
String newString2 = new String("abc");
newString1 == newString2;//false
String StringLiteral1 = "abc";
String StringLiteral2 = "abc";
StringLiteral1 == StringLiteral2;//true
String Constant Pool에 의해 문자열 리터럴과 생성자로 생성한 문자열의 주소값이 다르다.
変数を宣言したり、オブジェクトを作成したりするたびに、メモリに格納されます.Javaでは、メモリはスタックとスタックの2つの領域に分かれています.String Constant Poolのこの2つの分野における存在と役割を理解してみましょう.String Literalとして作成します。
StringをString Literalと宣言すると、JVMはString Poolでオブジェクトを作成し、その参照をスタックに格納します.Constant Poolは、文字列を格納する特殊なメモリ領域です.
JAvaのStringには不変性があります.不変性はconstで宣言した変数のように、宣言すると変わらない特性です.JVMは、String Poolに文字列テキストのコピーを1つだけ格納することで、文字列に割り当てられたメモリ量を最適化できます.これは実習と言います.
たとえば、String変数を作成して値を指定すると、JVMはString Poolで同じ値のStringを検索します.Javaコンパイラは、追加のメモリを割り当てずにメモリアドレス値を返します.見つからない場合は、プールに追加し(実習)、対応するアドレス値を返します.
その結果、次のような結果が得られた.
String StringLiteral1 = "abc";
String StringLiteral2 = "abc";
StringLiteral1 == StringLiteral2;//true
참고로 Constant Pool은 구현 시 Hashmap을 사용한다. Hashmap에는 동일한 hashcode를 가진 String 목록이 들어있다.
new(ジェネレータ)を使用して作成
new演算子を使用してStringオブジェクトを作成する場合、hipメモリに常に新しいオブジェクトが作成されます.
そのため、次のような結果になります.
String newString1 = new String("abc");
String newString2 = new String("abc");
newString1 == newString2;//false
String StringLiteral = "abc";
String newString = new String("abc");
StringLiteral == newString;//false
new 키워드로 생성한 String 객체도 intern() 함수를 통해 직접 interning을 해줄 수 있다.
intern() 함수를 실행하면 해당 String을 interning하고 주소값을 반환한다.
String StringLiteral = "abc";
String newString = new String("abc");
String internedString = newString.intern();
StringLiteral == internedString // true
String Constant Poolはどこですか?
String Constant PoolはHipとスタックの2つの領域の1つに位置します.しかし重要なのはなぜどこにあるのか、GC(Garbage Collector)活動の分野はお尻だからだ.GCは参照されていない値を回収することでメモリ漏洩を防止する.
Java 7以降からString Constant Poolがお尻にジャンプし、GCの影響を受けます.
次の写真では、Stackのデフォルトデータ型はintのnumとhipのオブジェクトnameとdの参照値です.HeapにはDemoの参照オブジェクトが含まれており、String Pool領域にはString Literalで宣言されたnameの文字列値があります.newキーワードでStringを宣言すると、Demo Objectのようにheap領域のどこかに作成されるはずです
일반적으로 스택은 수명이 짧은 데이터를 저장한다. 지역 변수(기본 자료형), 힙 개체 참조, 실행 중인 메서드 등.
힙은 런타임에 Java 개체 및 JRE 클래스를 저장한다.
もう聞かないでください。
ストリングはString Constant Poolで使用され、メモリ割り当てを最適化できます.
コメントドキュメント
https://www.baeldung.com/java-string-pool
https://www.baeldung.com/java-string-constant-pool-heap-stack
Reference
この問題について(Java文字列定数プールの理解), 我々は、より多くの情報をここで見つけました https://velog.io/@paulhana6006/자바-문자열-쓸-때-이거는-알고-쓰자テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol