miyupaca log

Javaの文字列比較について

2020/08/13

Javaの文字列比較で学んだことを書いてみます。

初学者が学習の一貫で発信しています。
気になる点があればご意見お待ちしております!


Javaで文字列の比較をする方法

左辺と右辺の値が等しいかどうかを比較する時は==を使用するが、Javaでは文字列を比較をする時にはequals()を使用する。

// 文字列1が文字列2と等しいかどうか調べる
文字列型の変数.equals(比較する文字列) 

変数str1にequalsを使ってstr2と同じか調べたい時はこんな感じ。

String str1 = "ラーメン";
String str2 = "おすし";
System.out.println(str1.equals(str2)); // false

文字列比較と「==」

文字列比較で==を使おうとするとエラーが起きるのならそこで気付けるが、実際は使ってもエラーは起きず、結果もtrueを返す場合とfalseを返す場合がある。

String str3 = "やきにく";
String str4 = new String("やきにく");
String str5 = "やき" + "にく";

System.out.println(str3 == str4); // false
System.out.println(str3 == str5); // true

str3とstr4は記述方法は違うものの、どちらも同じようにやきにくという文字列をStringクラスの変数に格納している。しかし、記述方法が違うだけでfalseが返ってきてしまう。一方でstr5と比較した場合はtrueとなる。
この原因は「コンスタントプール」というものによって起きている。


コンスタントプールとは

文字列を保管している領域のこと。Stringクラスは参照型なので、宣言された時に文字列の保管される領域が生成されて、変数がそこをみているイメージ。
同じ文字列がプログラム内で登場すると同じ領域を参照される。

String str3 = "やきにく";
String str4 = new String("やきにく");
String str5 = "やき" + "にく";

str5に入れる文字列は2つの文字列が合わさって「やきにく」になっているが、str5には「やきにく」という文字列の入った領域を参照するため、str3と同じ領域を参照していることになる。
str4のようにnew演算子を使って宣言をした場合、先に宣言されているstr3と同じ文字列であっても別の領域に文字列が保存される。


「==」とequals()の違い

==は参照先が同じかどうかを比較するため、文字列の場合は見かけが同じであっても参照先が違う場合はfalseが返ってきてしまう。equals()は参照している値そのものが等しいかどうかを比較する。


まとめ

Javaを初めて学ぶ人、特に他の言語を学んでいた人は最初あれってなることの1つなのではと思う。
意図せぬ挙動に振り回されないよう、文字列比較にはequals()を使う!


参考

”==“とequalsとコンスタントプール【Java】 - あるぱかになりたい
Java 文字列の値を比較する(equals/compareTo) | ITSakura
Stringとheap領域とconstant pool - Qiita


miyupaca

miyupacaの学習記録ブログです。