[JAVA構文]Stringビュー1(作成、比較)


String Paveビュー


C, Python, C++... いろいろな言語を使うと、似たような点がたくさんあるので、すぐに他の言語をマスターしました.軽い気持ちでJAVAを始めましたが….資料型から、混乱のクライマックスを経験して、私をとても慌てさせて、ほほほ;毎回見つけて理解して通り過ぎるのですが、帰ってくるとまた紛らわしいのがJava資料お兄さんたちなので、ちゃんと整理しておきたいと思います!まずは氷山の一角か、皮をむいて出てくるタマネギのようなStringか.

Stringを作成する2つの方法


stringは、次の2つの方法で作成できます.そしてそれぞれの方法には大きな違いがあります.

オブジェクトモード


1つ目のオブジェクトメソッドは、次のように文字列変数を作成します.s 3という変数はstackに格納され、helloはheap領域に格納されます.このアドレスはs 3変数に格納される.すなわちstr変数は、「hello」が格納されたheap領域にアドレスを格納する.
String s3 = new String("hello"); //객체 

テキストモード


2つ目の方法は、以下に示すように文字列を直接伝達することです.s 1はスタックに格納され、「hello」はスタック領域のString Constant Poolという個別空間に入る.このアドレスはs 1変数に格納される.
String Constant Poolは、同じ値を持つ文字列(「hello」)を受信すると、キャッシュ内のアドレスを検索します.最終的に、同じ文字列は同じアドレスを指します.
これは、Constant PoolがHashMap形式で文字列アドレスを管理するため、同じ文字列を複数格納する必要がないためである.メモリを節約できるでしょう?
String s1 = "hello"; // 리터럴 
String s2 = "heㅣlo";

String比較


等しい演算子(==)


変数に含まれる値を比較します.このように、サブ変数のアドレスを比較するのではなく、比較値だと勘違いするかもしれませんが、よく考えてみると、String変数は文字列を格納する空間(heap)にアドレスが含まれています!!
したがって、文字方式とオブジェクト方式でそれぞれ生成された文字列を同等に比較すると、String Constant Poolでは文字方式が同じアドレスを持つためtrueが発生し、オブジェクトで作成された文字列は毎回異なる空間に割り当てられ、このアドレスによってfalseが発生する.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");

System.out.println(str1 == str2);  //true
System.out.println(str3 == str4); //false

比較関数(equals)


equals()は、すべてのクラスがトップクラスのオブジェクトであることを継承するオブジェクトで定義されたメソッドです.したがって、定義なしで使用できます.(必要に応じて再定義可能)equalsは最終的に==として演算されるため、equalsを使用すると==と何の違いもありません.
public boolean equals(Object obj) {
        return (this == obj);
    }
でもStringJavaでは、次のようにオブジェクトのequalsが再定義されます.変数のアドレスに移動し、その値を比較します.これは、実際の文字列の値を比較できることを意味します.
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }
今回はすべてtrueを「hello」と出力します.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");

System.out.println(str1.equals(str2)); // true
System.out.println(str3.equals(str4)); // true