AXIS合同会社代表(熊本在住40代おっさん)が日々戯言を書きなぐるブログです。
C言語から学ぶC#とJava② 文字列編

C言語から学ぶC#とJava② 文字列編

どもども、毎日大体呑んだくれてるはっし~だす。

今回はC言語から学ぶC#・Javaの2回目という事で、文字列編です。基本的にプログラムを学び始めた方を対象としたお話になります。

C#とJavaにおける文字列の振る舞い

前回は値型と参照型の概要をやりましたが、その中でも少し特殊な振る舞いをするように感じるのが文字列型です。
その前に以下のコードを見てみましょう。

int a = 1;
if(a == 1) {
    System.out.print("aは1です");
}else {
    System.out.print("aは1ではありません");
}
// 結果:aは1です
int a = 1;
if(a == 1) {
    Console.WriteLine("aは1です");
} else {
    Console.WriteLine("aは1ではありません");
}
// 結果:aは1です

想定通りの動きではないでしょうか?
では以下のJavaサンプルコードを実行してみましょう。

String a = "あいうえお";
if(a == "あいうえお") {
	System.out.println("aは[あいうえお]です");
}else {
	System.out.println("aは[あいうえお]ではありません");
}
// aは[あいうえお]です
// IDを確認
System.out.println("aのID:" + System.identityHashCode(a));
System.out.println("[あいうえお]のID:" + System.identityHashCode("あいうえお"));
//	aのID		    :2073539654
//	[あいうえお]のID	:2073539654
		
String b = "あいう";
b += "えお";
if(b == "あいうえお") {
	System.out.println("bは[あいうえお]です");
}else {
	System.out.println("bは[あいうえお]ではありません");
}
// bは[あいうえお]ではありません
// IDを確認
System.out.println("bのID:" + System.identityHashCode(b));
System.out.println("[あいうえお]のID:" + System.identityHashCode("あいうえお"));
//	bのID		    :1739069767
//	[あいうえお]のID	:2073539654
String c = new String("あいうえお");
if(c == "あいうえお") {
	System.out.println("cは[あいうえお]です");
}else {
	System.out.println("cは[あいうえお]ではありません");
}
// cは[あいうえお]ではありません
// IDを確認
System.out.println("cのID:" + System.identityHashCode(c));
System.out.println("[あいうえお]のID:" + System.identityHashCode("あいうえお"));
//	cのID		    :972176900
//	[あいうえお]のID	:2073539654

//	equalsで比較
if(c.equals("あいうえお")) {
	System.out.println("cは[あいうえお]です");
}else {
	System.out.println("cは[あいうえお]ではありません");
}
//	cは[あいうえお]です

aだけが一致し、b・cはやってることは同じように見えますが一致しないのです。

実はaが一致しているのも文字列リテラル(ソースコード内に書いた文字列)”あいうえお”の参照先が同じだからです。
ソースコード内では何度も出てきていますが、コンパイル時に”あいうえお”の参照先は一つだけ用意しているのです。

JavaではC言語のようにメモリアドレスを直接参照する事はできません。
しかし固有のオブジェクトIDを取得する事はできますので表示していますが、文字列リテラルのIDと変数aのIDが一致している事が分かると思います。
※ガベージコレクションという機能でメモリ管理しているので、不変の固有IDというわけではないのですが、今回のようなシンプルなプログラムでは問題なく使用できます。
※if文で比較しているのはオブジェクトIDでもありません。あくまで参照先が同じであるかどうかという事です。

そして最後にがequals()をしようした比較です。

Javaで文字列の比較を行うにはequals()を使用する。

まずはこれをしっかりと覚えてください。

では次にC#のサンプルコード。

ObjectIDGenerator objectID = new ObjectIDGenerator();
bool firstTimeFlg;

string a = "あいうえお";
if(a == "あいうえお") {
	Console.WriteLine("aは[あいうえお]です");
} else {
	Console.WriteLine("aは[あいうえお]ではありません");
}
// aは[あいうえお]です
// IDを確認
Console.WriteLine("aのID:" + objectID.GetId(a, out firstTimeFlg));
Console.WriteLine("[あいうえお]のID:" + objectID.GetId("あいうえお", out firstTimeFlg));
//	aのID		   :1
//	[あいうえお]のID:1

string b = "あいう";
b += "えお";
if(b == "あいうえお") {
	Console.WriteLine("bは[あいうえお]です");
} else {
	Console.WriteLine("bは[あいうえお]ではありません");
}
// bは[あいうえお]です
// IDを確認
Console.WriteLine("bのID:" + objectID.GetId(b, out firstTimeFlg));
Console.WriteLine("[あいうえお]のID:" + objectID.GetId("あいうえお", out firstTimeFlg));
//	bのID		   :2
//	[あいうえお]のID:1

string c = new string(new char[]{ 'あ','い','う','え','お' });
if(c == "あいうえお") {
	Console.WriteLine("cは[あいうえお]です");
} else {
	Console.WriteLine("cは[あいうえお]ではありません");
}
// cは[あいうえお]です
// IDを確認
Console.WriteLine("cのID:" + objectID.GetId(c, out firstTimeFlg));
Console.WriteLine("[あいうえお]のID:" + objectID.GetId("あいうえお", out firstTimeFlg));
//	cのID		   :3
//	[あいうえお]のID:1

Console.WriteLine("何かキーを押してください...");
Console.ReadKey();

C#では文字列を「==」で比較しても問題ないことが分かります。しかし変数のIDを見るとJavaと同じような構成になっていることも分かると思います。

どちらの場合も参照型として扱っていますが、

C#の場合は文字列を比較する場合は値型として比較している

という事ですね。

次回は値型と参照型の引数についてやります。

でわでわ

C言語から学ぶC#とJava① 概要・変数 << Back  Next >> C言語から学ぶC#とJava③ 引数編

LINEで送る
Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です