Javaでの文字列初期化

1. 前書き

Java _String_は最も重要なクラスの1つで、https://www.baeldung.com/java-string [_String_-related series of tutorials]でその側面の多くをすでに取り上げています。
このチュートリアルでは、Javaでの_String_初期化に焦点を当てます。

2.  作成

まず、Javaで__String__sを作成する方法を覚えておく必要があります。
_new_キーワードまたはリテラル構文を使用できます。
String usingNew = new String("baeldung");
String usingLiteral = "baeldung";
また、https://www.baeldung.com/java-string-pool [__String__sが特殊なプールで管理される方法]を理解することも重要です。

3. _String_宣言のみ

まず、値を明示的に割り当てずに、単に_String_ *を宣言します。
これをローカルで行うか、メンバー変数として行うことができます。
public class StringInitialization {

    String fieldString;

    void printDeclaredOnlyString() {
        String localVarString;

        // System.out.println(localVarString); -> compilation error
        System.out.println(fieldString);
    }
}
ご覧のとおり、値を指定する前に_localVarString_を使用しようとすると、コンパイルエラーが発生します。 一方、コンソールには「_null」_の「_fieldString_」の値が表示されます。
クラスが構築されると、*メンバー変数はデフォルト値で初期化されます*、_ String_の場合は_null_を参照してください。 しかし、*ローカル変数を自分で初期化する必要があります。*
_localVarString_に_null_の値を指定すると、2つが実際に等しくなっていることがわかります。
String localVarString = null;
assertEquals(fieldString, localVarString);

4. _String_リテラルを使用した初期化

同じリテラルを使用して、2つの__String__sを作成しましょう。
String literalOne = "Baeldung";
String literalTwo = "Baeldung";
参照を比較して、1つのオブジェクトのみが作成されることを確認します。
assertTrue(literalOne == literalTwo);
この理由は、https://www.baeldung.com/java-string-pool [__String__sがプールに格納されている]という事実に似ています。 * __ literalOne ___ _String_“baeldungâをプールに追加し、__literalTwo ___ reuses。*

5. String_を使用した初期化_new

ただし、_new_キーワードを使用すると、いくつかの異なる動作が見られます。
String newStringOne = new String("Baeldung");
String newStringTwo = new String("Baeldung");
両方の__String__sの値は以前と同じですが、今回は異なるオブジェクトを使用する必要があります。
assertFalse(newStringOne == newStringTwo);

6. 空のStrings

3つの空の__String__sを作成しましょう。
String emptyLiteral = "";
String emptyNewString = new String("");
String emptyNewStringTwo = new String();
これでわかるように、* _ emptyLiteral_は_String_プールに追加され、他の2つは直接ヒープに追加されます。*
これらのlink:/java-compare-strings [同じオブジェクトにはなりませんが、すべて同じ値になります]:
assertFalse(emptyLiteral == emptyNewString)
assertFalse(emptyLiteral == emptyNewStringTwo)
assertFalse(emptyNewString == emptyNewStringTwo)
assertEquals(emptyLiteral, emptyNewString);
assertEquals(emptyNewString, emptyNewStringTwo);

7. _null_値

最後に、null __String__sの動作を見てみましょう。
null _String_を宣言して初期化しましょう:
String nullValue = null;
_nullValue_を印刷すると、以前に見たように、「null」という単語が表示されます。 そして、_nullValue、_でメソッドを呼び出そうとした場合、期待どおり_NullPointerException、_を取得します。
しかし、*「null」が印刷されるのはなぜですか? _null_とは実際には何ですか?*
さて、https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.4 [JVM specification]では、_null_がすべての参照のデフォルト値であるため、そうではない特に_String_に関連付けられています。 実際、仕様では、_null_の具体的な値のエンコードは義務付けられていません。
*それでは、_String_を印刷するために「null」はどこから来るのでしょうか?*
_PrintStream#println_実装を見ると、_String#valueOf_を呼び出していることがわかります。
public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}
そして、* _ St​​ring#valueOf、_を見ると、答えが得られます:*
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
そして、明らかに、それが「null」の理由です。

8. 結論

この記事では、_String_初期化について説明しました。 宣言と初期化の違いを説明しました。 また、_new_の使用とリテラル構文の使用についても触れました。
最後に、_null_値を_String_に割り当てることの意味、_null_値がメモリ内でどのように表されるか、印刷時にどのように見えるかを調べました。
この記事で使用されているすべてのコードサンプルは、https://github.com/eugenp/tutorials/tree/master/java-strings-2 [Github上]で入手できます。