[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 10181] Re: String クラスは flyweight ?
山本@テンプスタッフです。
結城浩さんのメールマガジン
"JAVA Q&A"の最新号にこんな記事が
載ってたんですけど・・・
===ここから====
はじめまして。先月からJAVAの勉強を始めているのですが
初歩的なところで悩んでいます。
String str = "end";
System.out.println(str == "end");
とすると true が表示されるのですが
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(str == "end");
に書き換えてDOS窓から end と入力したら
false になってしまいます。 なぜ・・・?
ちなみに equals() メソッドで比較したらどちらの場合も
true と表示されました。
String型を比較するときは == は使わない方が
良いのでしょうか?
-----------------------------------------------------------
●回答:==とequalsは意味が違います。
-----------------------------------------------------------
演算子==を使ってStringのインスタンスを比較した場合、
2つのインスタンスが同一かどうかを調べていることになります。
一方、equalsメソッドを使うと、
2つのインスタンスの文字列の内容が等しいかどうかを調べている
ことになります。
Stringのインスタンスの文字列の内容が同じであっても、
インスタンスは同一とは限りません。
==では「完全に同じインスタンス」でなければtrueになりません。
equalsでは「文字列の内容さえ同じ」ならtrueになります。
readLineメソッドが返す文字列は、
このメソッドの中でStringのインスタンスが新しく生成されていますので、
equalsメソッドを使って判断するのが正しいことになります。
基本型(int, char, byteなど)の場合には==で同一性の判断を行います。
===ここまで===
これ実際に実行するとfalseになります。
今までの僕だと
「そんなの当然ジャン!」って感じだけど
今までのメールを読んでた僕にとっては
驚きです!
文字列プールって何???