Javaにおける定数プールとキャッシュクラスの理解

1075 ワード

まずこのようなコードを見てみましょう
String str1 = "123";  
String str2 = "123";  
System.out.println(str1 == str2);  
String str3 = new String("123");  
System.out.println(str1 == str3);  
str3 = str3.intern();  
System.out.println(str1 == str3);     

出力はtrue,false,trueです.
String str=「abc」の形式でオブジェクトを作成すると、まず文字列プールにabcが存在するかどうかを探し、存在する場合は参照を返します.ない場合は、abcを文字列プールに追加し、参照を返します.
ただしnewでオブジェクトを作成する場合は、文字列プールをチェックせずに新しいオブジェクトを直接作成するため、str 1とstr 3の両方がメモリアドレスを指すのは異なります.
文字列プールをアクティブに拡張するにはStringを使用します.intern()は、メソッドを呼び出す文字列と同じUnicodeコードを持つ文字列を文字列プールで検索し、ある場合は参照を返します.ない場合は、文字列プールに文字列を追加し、参照を返します.コードの最後の2行はstr 3を文字列定数に追加しstr 3に割り当てるので、str 1とstr 3はまた同じオブジェクトを指します.
次のコードを見てみましょう
Integer a = 12;  
Integer b = a;  
a= 3;  
System.out.println(a);  
System.out.println(b);  

最後に出力されたのは3,12です.
b=aを実行すると,aの参照がbに渡される.a=3を実行すると、bの値も変わると思っていたが、そうではなかった.
ここには、-127から128まで事前にキャッシュされているInteger Cacheクラスがあります.そのため、Integer a=12になると、実はこの前から12の例が存在していて、その引用をaに与えただけなので、次のa=3はaの引用を変えただけで、もちろんbには影響しませんよ.