Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

書籍 パーフェクトJava | 文字列の比較

パンくず

書籍 パーフェクトJava
文字列の比較

概要

Javaで文字列を比較する方法について

Stringの文字列の中身を比較する際の注意点

String同士を==で比較してもオブジェクトの比較になるため
文字列が同一でも真とならず、偽を返却します。

文字列リテラルによる文字生成を行った場合、
同じ文字列であれば同じオブジェクトを参照するために
問題なく比較を行うことが出来る。
これは文字列同士を+演算子で結合した場合も同様である。

これに対して、new Stringによる文字列生成や
文字列リテラルによって生成されたStringオブジェクト同士を結合した場合は
別のオブジェクトを参照するため==による比較は偽となる。

文字列自体の比較を行いたい場合は必ず、String#equalsを利用すること。

文字列比較のサンプルコード

public class Perfect2_2_6_1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		String stringLiteral1 = "hoge";
		String stringLiteral2 = "hoge";
		String stringLiteral3 = "ho" + "ge";
		String stringLiteral4 = "ho";
		stringLiteral4 += "ge";
		String stringNew = new String("hoge");

		// => 文字列リテラルによる生成は同じ文字列であれば同じオブジェクトを参照する
		System.out.println(stringLiteral1 == stringLiteral2);
		// => 文字列リテラル同士の文字列生成時も同じ文字列であれば同じオブジェクトを参照する
		System.out.println(stringLiteral1 == stringLiteral3);
		// => 文字列結合時は別のオブジェウクとを参照する
		System.out.println(stringLiteral1 == stringLiteral4);
		// => Stringのコンストラクタによる文字列生成時は別のオブジェクトを参照する
		System.out.println(stringLiteral1 == stringNew);

		// => 以下、二例とも別々のオブジェクトを参照しているが文字列自体を比較すれば真を返す
		System.out.println(stringLiteral1.equals(stringNew));
		System.out.println(stringLiteral1.equals(stringLiteral4));
	}
}

出力

true
true
false
false
true
true

StringBuilderの比較

Stringの例同様StringBuilderを行う場合は以下のメソッドを利用する。

boolean contentEquls(CharSequence cs)

サンプルコード

public class Perfect2_2_6_2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		StringBuilder sb1 = new StringBuilder("hoge");
		StringBuilder sb2 = new StringBuilder("hoge");
		System.out.println(sb1 == sb2); // => 文字列は同じだがオブジェクトは異なるため偽
		System.out.println(sb1.toString().contentEquals(sb2)); // => 文字列は同一なため真
		System.out.println("hoge".contentEquals(sb2)); // => 文字列は同一なため真
	}
}

出力

false
true
true