文字列を作成する

Java で文字列を利用するには、文字列リテラルを使って String クラスのインスタンスを作成する方法が一番よく使用されますが、 String クラスのコンストラクタを使用してインスタンスを作成することもできます。ここでは Java で文字列を作成する方法について解説します。

(Last modified: )

文字列リテラルを使って文字列を作成する

Java のプログラムの中で文字列は複数の文字の集まりをダブルクオーテーション(")で囲って記述します。これを文字列リテラルと呼びます。

"こんにちは"

文字列リテラルは 0 文字以上の文字の集まりです。 0 文字の場合は空文字とも呼ばれますが次のように記述することができます。

""

文字列リテラルを記述すると文字列の本体である String クラスのインスタンスが作成され文字列リテラルはインスタンスへの参照を表すことになります。文字列リテラルを String 型の変数に代入することで、変数には文字列本体への参照が代入されます。

String 変数名 = 文字列リテラル

次のサンプルでは String 型の変数 msg に対して "こんにちは" という値を持つ文字列への参照が代入されます。

String msg = "こんにちは";

String 型は参照型のデータ型ですので、「こんにちは」という値そのものが変数に格納されるのではなく、文字列が保管されている場所への参照が変数に格納される点に注意してください。

文字列リテラルを使って文字列を作成する(1)

なお Java では文字列リテラルを記述するときにシングルクオーテーションを使って 'こんにちは' のように記述することはできません。 Java ではシングルクオーテーションは一つの文字を表す文字リテラルで使用されます。

〇 "こんにちは"
✕ 'こんにちは'

Stringクラスのコンストラクタを使って文字列を作成する

Java で文字列を作成するには文字列リテラルを使用するケースが多いのですが、 String クラスのコンストラクタを使って文字列を作成することもできます。コンストラクタの種類は 10 数種類用意されていますが、その中でいくつかをピックアップしてご紹介します。

最初は char 型の配列を引数に指定するコンストラクタです。

public String(char[] value)

パラメータ:
value - 文字列の初期値

char 型は 1 つの文字を格納するデータ型です。文字列の初期値となる文字が格納された char 型の配列の値を引数に指定して String クラスのインスタンスを作成します。

次のサンプルをみてください。

char[] c = {'こ', 'ん', 'に', 'ち', 'は'};
String msg = new String(c);

System.out.println(msg);  // こんにちは

char 型の配列に格納されている文字をもとに文字列を作成しました。なお配列の要素の値をコピーして文字列を作成しているので、文字列を作成したあとに char 型の配列の要素の値を変更しても文字列には影響しません。

次は別の文字列を引数に指定するコンストラクタです。

public String(String original)

パラメータ:
original -A String

新しい文字列を作成し、引数に指定した文字列の値をコピーして初期値として保管します。

次のサンプルをみてください。

String original = "Hello";
String msg = new String(original);

System.out.println(msg);  // Hello

引数に指定した文字列と新しい文字列は、別々の場所に同じ値で作成されます。

他にも StringBuffer クラスのインスタンスを引数に指定して文字列を作成するコンストラクタや StringBuilder クラスのインスタンスを引数に指定して文字列を作成するコンストラクタが用意されています。こちらはそれぞれのクラスのページで解説します。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample2-1.java という名前で保存します。

class JSample2_1{
  public static void main(String[] args){
    String msg1 = "Hello";

    char[] c = {'B', 'y', 'e'};
    String msg2 = new String(c);

    String msg3 = new String(msg1);

    System.out.println(msg1);
    System.out.println(msg2);
    System.out.println(msg3);
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample2_1.java

その後で、次のように実行してください。

java JSample2_1

文字列を作成する(2)

文字列リテラルを使用する方法と、 String クラスのコンストラクタを使用する方法でそれぞれ文字列を作成し、そのあとで画面に文字列の値を出力しました。

型推論を使用した文字列の作成

変数宣言で型推論を利用する」で解説したとおり Java のバージョンによっては型推論が利用できますが、文字列を作成するときにも型推論を利用できます。書式は次のとおりです。

var 変数名 = 文字列リテラル

例えば次のように記述することができます。

var msg = "Hello";

String クラスのコンストラクタを使用する場合も同じように型推論を使用できます。

char[] c = {'こ', 'ん', 'に', 'ち', 'は'};
var msg = new String(c);

String型の変数に別の文字列を代入する

文字列を作成して変数に代入すると、変数には文字列への参照が格納されます。この変数を別の String 型の変数に代入することができます。

String msg1 = "こんにちは";
String msg2 = msg1;

System.out.println(msg1);  // "こんにちは"
System.out.println(msg2);  // "こんにちは"

元々の変数に格納されていた文字列への参照が、別の変数に代入されるため、 2 つの String 型の変数は同じ文字列を参照するようになります。

String型の変数に別の文字列を代入する(1)

では 2 つの変数に同じ文字列への参照が代入されている状態で、どちらかの変数に新しい文字列を代入したらどうなるでしょうか。

String msg1 = "こんにちは";
String msg2 = msg1;

msg2 = "さようなら";

Java の文字列は一度作成されると内容を変更することができない不変オブジェクトです。変数に新しい文字列を代入したとき、元々その変数が参照していた文字列が保管している値が変更されるのではなく、新しい文字列が作成されてその新しい文字列への参照が変数に代入されます。

String型の変数に別の文字列を代入する(2)

このように複数の変数が同じ文字列を参照していた場合に、いずれかの変数に新しい文字列を代入しても他の変数が参照している文字列には影響がありません。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample2-2.java という名前で保存します。

class JSample2_2{
  public static void main(String[] args){
    String msg1 = "Hello";
    String msg2 = msg1;

    System.out.println(msg1);
    System.out.println(msg2);

    System.out.println("----");

    msg2 = "Bye!";

    System.out.println(msg1);
    System.out.println(msg2);
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample2_2.java

その後で、次のように実行してください。

java JSample2_2

String型の変数に別の文字列を代入する(2)

文字列リテラルを使用する方法と、 String クラスのコンストラクタを使用する方法でそれぞれ文字列を作成し、そのあとで画面に文字列の値を出力しました。

-- --

Java で文字列を作成する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。