Stringクラスの内部化方法の疑いを解く



ほとんどの人はStringクラスのinternメソッドを使用しないと信じています.Stringクラスのソースコードを開くと、public native String intern()というローカルメソッドであることがわかります.ドキュメントでは、このメソッドが文字列オブジェクトの内部参照を返すことを示します.Stringクラスによって最初に空の文字列のオブジェクトプールが維持され、internメソッドが呼び出されると、オブジェクトプールに等しい文字列オブジェクトが含まれている場合は、オブジェクトプールのインスタンスが返されます.そうしないと、オブジェクトプールに文字列が追加され、文字列の参照が返されます.プログラムの角度からどのようにこの方法を見て、私達は2つの文字列s 1,s 2があると仮定して、s 1.equals(s 2)の場合、s 1.intern()==s2.intern()、すなわち、この2つの文字列はメモリで同じインスタンスを使用します.Java言語仕様で文字列文字とより一般的な定数式の値を定義する文字列は、同じインスタンスを共有するために内部化されています.次のコードを試してみましょう
String s1 = "  ,Java   ";
String s2 = "  ," + "Java   ";
System.out.println(s1==s2);
System.out.println(s1.intern()==s2.intern());

このコードは、文字列s 1とs 2が同じインスタンスを共有する2つのtrueを印刷します.ただし、式が使用されているにもかかわらず、式は定数でなければなりません.
もちろん、この方法が何の役に立つのかはまだ考えられませんが、Java仮想マシンの内部組織構造についてのいくつかの理解です.また、この処理メカニズムを理解することで、文字列定数を使用するときに、これらの文字列が消費するメモリを節約する方法を理解することができます.
不思議なことにinternという方法はJBuilder 2005で未定義の方法であることが知られ、Eclipseでは正常に表現されている.