[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になります。

 今までの僕だと
「そんなの当然ジャン!」って感じだけど
今までのメールを読んでた僕にとっては
驚きです!

 文字列プールって何???