Java String Poolとは?


Stringには2つの生成方式があり、それぞれ異なる.
  • 新しい演算子を使用
    NewでStringを作成すると、Heap領域に存在します.
  • 文字
    String constant poolという分野が存在します.
  • new演算子を使用してStringを宣言する方法と、文字を使用する方法の違いについて説明します.

    Java String Pool


    String Returnalを使用して作成すると、このString値はHeap領域内のString Constant Poolに格納されて再使用されますが、new演算子を使用して作成すると、同じ内容でも複数のオブジェクトがそれぞれHeap領域を占有します.
        public static void main(String... args) {
            String s1 = "Cat";
            String s2 = "Cat";
            String s3 = new String("Cat");
            String s4 = "Dog";
    
            //객체의 주소값을 비교
            System.out.println(s1 == s2); // true
            System.out.println(s1 == s3); // false
            //equals는 문자열을 비교하기 때문에 true
            System.out.println(s1.eqauls(s3)); // true
        }
    
    heap領域で作成されたStringオブジェクトとstring constant poolに文字で格納されたStringオブジェクトのアドレス値は必然的に異なります.
    heap領域には「cat」、「dog」と同じ値が含まれ、図の右側から重要な違いがわかります.
  • String文字で生成されたオブジェクトはString Poolに入ります.
  • Stringテキストで生成されたオブジェクトの値(「Cat」)がString Poolに既に存在する場合、そのオブジェクトはString Poolの参照を参照します.(図中のs 1とs 2は同じ場所を指す)
  • new演算子によって生成されたStringオブジェクトは、String Poolに同じ値が既に存在している場合でも、Heap領域内の個別のオブジェクトを指します.
  • String interning


    Stringをliteralと宣言すると、内部でStringのintern()メソッドが呼び出されます.intern()メソッドが、指定した文字列が文字列定数プールに存在するかどうかを検索している場合は、アドレス値を返します.存在しない場合は、文字列定数プールに格納し、新しいアドレス値を返します.
    String Constants Poolの保存と使用をString Interingと呼びます.このように、String Interingに記憶されているString値は不変である.不変性を持つということは,値は不変であり,同じString値を持つと同じ場所を指す.

    String Constant poolとは?


    Java 6までstring constant poolの位置はPermエリアであり、Java 7ではOOM問題によりHeapエリアに変更される.
    Perm領域は固定サイズであり,Runtimeではサイズが拡張しない.
    Java 6までは、OutOfMemoryExceptionを生成し、一部を制御できないため、Stringを呼び出すintern()メソッドはほとんど使用されていません.
    したがって、Oracleのエンジニアは、文字列定数プールの場所をJava 7からPerm領域ではなくHeap領域に変更し、String定数プールのオブジェクトがGCのターゲットになります.詳細については、ここです。を参照してください.

    Reference


    https://starkying.tistory.com/entry/what-is-java-string-pool?category=689625
    https://medium.com/@joongwon/string-%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-57af94cbb6bc
    https://starkying.tistory.com/entry/what-is-java-string-pool