JAva-可変文字列


文字列のアイテムが配置されると、その内容は固定的で可変であり、例えば以下の宣言である.
String str = "caterpillar";
この宣言は長さ11の文字列を構成し、内容を変更することはできません.次の宣言は文字列の内容を変えるとは思わないでください.
String str = "just"; str = "justin";
実際、このプログラムのセグメントには、2つの文字列のアイテムがあります.1つは「just」で、長さは4で、1つは「justin」で、長さは6で、2つは異なる文字列のアイテムです.「just」の文字列の後に「in」の文字列を付けるのではなく、str名を新しい文字列のアイテムに参照させます.以下に示します.
もとはこれまでstr------>「just」で再指定した後str------>「justin」で新しい文字列を参考にしたものです
Javaでは、=文字列のオブジェクトを名前に指定します.名前を変更する参照オブジェクトを意味します.元の文字列のオブジェクトは、他の名前を参照しなければ、Javaの「ゴミ回収」(Garbage collection)メカニズムによって適切なタイミングで回収されます.Javaでは、プログラム設計者は通常、不要なオブジェクトのリソース解放問題に関心を持っていません.Javaは、オブジェクトが参照されなくなったかどうかをチェックし、名前が参照されていないオブジェクトが回収されます.プログラムで次の方法で宣言する場合は、実際には同じ文字列のオブジェクトを指します.
String str1 = "flyweight"; String str2 = "flyweight"; System.out.println(str1 == str2);
プログラムの実行結果にはtrueが表示され、JavaではString Poolが維持され、共有可能な文字列のアイテムについては、String Poolで同じStringコンテンツが存在するかどうかを検索し(文字元が同じ)、ある場合は直接伝え、新しいStringアイテムを直接作成するのではなく、メモリの消費を減らすことができます.例として、Stringのintern()メソッドを見て、APIの説明のセクションを見てみましょう.
Returns a canonical representation for the string object. A pool of strings, initially empty, is maintained privately by the class String. When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
この話では、Flyweightモードの動作方法を説明しています.例を挙げて説明すると、より明確になります.
  • StringIntern.java
  • public class StringIntern { 
        public static void main(String[] args) { 
            String str1 = "fly"; 
            String str2 = "weight"; 
            String str3 = "flyweight"; 
            String str4; 
    
            str4 = str1 + str2; 
            System.out.println(str3 == str4); 
    
            str4 = (str1 + str2).intern(); 
            System.out.println(str3 == str4); 
        } 
    } 
    

    プログラムでstr 3とstr 4のアイテムが同じものかどうかを初めて比較すると、結果はfalseであることがわかりますが、intern()メソッドでは、String Poolに同じ文字列のアイテムが存在するかどうかをチェックし、ある場合は戻ります.プログラムの前に「flyweight」文字列のアイテムがあり、intern()はString Poolで発見されたので、直接戻ります.この場合、str 3とstr 4が指すのは実は同じ物なので、結果はtrueになります.
    気づいたか?==演算はJavaで2つの名前が同じオブジェクトに参照されているかどうかを比較するために使用されるので、==で2つの文字列の内容が同じかどうかを比較することはできません.たとえば、次のようにします.
    String str1 = new String("caterpillar"); String str2 = new String("caterpillar"); System.out.println(str1 == str2);
    str 1とstr 2はそれぞれ異なる文字列オブジェクトに参照されるため、falseの結果が表示されます.2つの(文字列)オブジェクトが同じかどうかを比較するには、equals()メソッドを使用します.たとえば、次のようにします.
    String str1 = new String("caterpillar"); String str2 = new String("caterpillar"); System.out.println(str1.equals(str2));
    このような結果は、所望の比較結果:trueを表示します.