2015年10月7日水曜日

Java初心者がはまったこと(文字列比較)

はじめまして。WebエンジニアのKと申します。
これまでサーバサイドはほぼPHPで実装してきましたが、最近ではJavaへの挑戦も始めました。
慣れたPHPの感覚でJavaを書き始めると、思わぬところではまってしまうことがあり、
ここでは自戒の念を込めてはまったポイントを記しておこうと思います。

■文字列比較ではまる

こんなif文を書いて、判定がtrueとならず、頭を悩ませていました。
※str = “hoge”だと、この単純な例の場合たまたま判定がtrueになってしまうので、わかりにくいですが”hog”と”e”にわけて宣言しています。【参考
String str = "hog";
str += "e";
if (str == "hoge") { // false...
    // do something
}
PHPだと文字列はプリミティブ型なので、上記のような文字列が格納された変数(str)と文字列リテラル(“hoge”)の比較でうまくいくのですが、
Javaの場合だと文字列は参照型で、文字列リテラルも一見プリミティブのように見えますが、内部ではString型のオブジェクトとして扱われます。
イメージとしては以下のようにStringクラスをnewしている形ですね。
String str = new String("hoge");
※ただ、これはあくまでイメージで、本当にこの書き方をすると文字列リテラルから変換されたString型オブジェクトを、さらにStringクラスのコンストラクタに渡していることになるので、二度手間となってしまいます。

“hoge”がString型のオブジェクトだとわかれば、比較演算子(==)でtrueとならないことを受け入れることができました。

■結局

で、結局どうすればよかったというと、Stringクラスに実装されている文字列比較用のメソッド”equals”を使いましょうというお話でした。
String str = "hog";
str += "e";
if (str.equals("hoge")) { // true!
    // do something
}
なんとなく見よう見まねで書けても、きちんと入門書などで言語仕様を把握しておくことが重要だと痛感した一日でした。

Related Posts:

  • 【Java】UTC時間の文字列をTimestamp型に変換する方法こんにちは。エンジニアのKです。 solrのレスポンスに含まれる時間文字列をTimestamp型に変換しようとしたときに、少しはまったので覚書です。 solrに格納される時刻はデフォルトでUTC時間とのことで、ぱっと見、日本時間から9時間前の表記となります。 solrのdate型カラムのレスポンス… Read More
  • Java初心者がはまったこと2(ラッパークラス)こんにちは。Java初心者のWebエンジニアKです。 PHPのノリでJavaを書いていたらはまったこと第二弾として、今回はラッパークラスについて書きたいと思います。 ■intとIntegerではまる Javaのソースコードを見ていると、例えば数値を扱う変数を作るとき、以下の2通りの宣言があるこ… Read More
  • Java初心者がはまったこと(文字列比較)はじめまして。WebエンジニアのKと申します。 これまでサーバサイドはほぼPHPで実装してきましたが、最近ではJavaへの挑戦も始めました。 慣れたPHPの感覚でJavaを書き始めると、思わぬところではまってしまうことがあり、 ここでは自戒の念を込めてはまったポイントを記しておこうと思います。 … Read More

0 コメント:

コメントを投稿