読者です 読者をやめる 読者になる 読者になる

A Clockwork …

~雑記メモ~

Stringに関して

Stringってなんなのでしょうか。
プリミティブ?クラス?インタフェイス?

答えは、クラスです。
「String」の頭の"S"が大文字であることからわかるように、クラス型変数なのです。

実際に例を見てみましょう。

		String s = new String("hoge");

こう書けます。
クラスの場合は、オブジェクトの生成のために、"new"演算子を使います。

しかし、実はStringの場合はプリミティブのようにも使えますよね。

		String s = "hoge";

定義したオブジェクトsは2つとも同じ価値を持っています。
このような、クラスであるのにプリミティブのように使えるのは、String独自の仕様となります。

しかし、なぜこのような仕様が許されているのでしょうか。

理由としては様々あるかと思いますが、次のような理由があります。

1つ目の例と2つ目の例では、実際にはオブジェクトsの価値は同じですが、
より最適なコードを書いているのは、2つ目の例なのです。

原因は""(ダブルクォテーション)にあります。

実はこの""で囲まれた文字列は、すでにString型で定義されています。
よって、2つ目の例では、それをそのままオブジェクトsへ代入しているため、無駄なく定義ができていると言えます。

しかし、1つ目の例を見てみます。
ここでは、"hoge"というString型の値をStringオブジェクトとしてインスタンスし、それをオブジェクトsへ代入する、
といった手順を踏んでいます。

違いがわかりましたでしょうか。

1つ目は、すでにString型のオブジェクトを改めてString型のオブジェクトとして置き換えると言った無駄な処理が含まれています。
つまり、1回ほど無駄なオブジェクト生成が発生しているのです。
よって、Stringを用いる場合は、以下のように書きましょう。

		String s = "hoge";


さて本題に入ります。

前回は==とequalについて説明しました。
Stringでは、Stringをプリミティブと勘違いしやすいため注意が必要です。
文字列の比較をしたかった場合、2つの対象を比較するときの次の例を見てください。

		String str1 = new String("fuga");
		String str2 = "fuga";
		System.out.println(str1 == str2);
		System.out.println(str1.equals(str2));

str1とstr2の比較ですが、結果は次のようになります。

false
true

このような結果となってしまうのは、理解できると思います。
Stringはプリミティブではなくクラスであることを忘れないようにしてください。

本日は以上です。