- PR -

equalsメソッドについて

1
投稿者投稿内容
しん
常連さん
会議室デビュー日: 2004/04/04
投稿数: 48
投稿日時: 2005-07-23 13:09
equalsメソッドを用いて下記のようなサンプルを作成してみました。
期待した結果としては"同じ"という文字がコンソールに表示されると思ったのですが
出ませんでした。Stringクラスのequalsは「同じ文字シーケンスを表す
Stringオブジェクトである場合にだけ、結果は true」とありますので
オブジェクト同士を比較するのではなくオブジェクトの中身を比較していると
思ったのですがそうではないのでしょうか?
コード:

public class equaltest{
public static void main(String[] args){
String s1 = "a";
String s2 = "bc";
String s3 = s1 + s2;
String s4 = "abc";

// if(s3 == s4){
if(s3.equals("s4")){
System.out.println("同じ");
}else{
System.out.println("違う");
}
}

}



[ メッセージ編集済み 編集者: かんたろう 編集日時 2005-07-23 13:11 ]
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2005-07-23 13:11
> if(s3.equals("s4")){

よーく見てみてください。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-07-23 13:13
>オブジェクト同士を比較するのではなくオブジェクトの中身を比較していると
>思ったのですがそうではないのでしょうか?
ご認識の通りです。

ただ・・・・、 "abc" と "s4" を比較していますので結果は false が返りますね。
しん
常連さん
会議室デビュー日: 2004/04/04
投稿数: 48
投稿日時: 2005-07-23 13:25
すみません。正しくは
if(s3.equals(s4)){
でした。上記のようにしたらうまくいきました。ありがとうございました。
しん
常連さん
会議室デビュー日: 2004/04/04
投稿数: 48
投稿日時: 2005-07-24 02:11
上記でもありましたように下記のようなコードを書くとコンソールへの出力結果は
s3とs4のオブジェクト比較となるため「異なる」となります。
ところがs1とs2にfinalの修飾子を付加すると出力結果は「同じ」となってしまいます。
コンパイラによるオプティマイザ(s3="abc"とした場合、s3==s4の結果は同じになる)
を避けるため s3=s1+s2 とあえて記述しているのですがfinalの修飾子を付ける事で
コンパイラの力により同様のことが起こるのでしょうか?
コード:

public class equaltest{

public static void main(String[] args){

String s1 = "a";
String s2 = "bc";
String s3 = s1 + s2;
String s4 = "abc";

if(s3 == s4){
// if(s3.equals(s4)){
System.out.println("同じ");
}else{
System.out.println("違う");
}
}
}



[ メッセージ編集済み 編集者: かんたろう 編集日時 2005-07-24 02:17 ]

[ メッセージ編集済み 編集者: かんたろう 編集日時 2005-07-24 02:24 ]

[ メッセージ編集済み 編集者: かんたろう 編集日時 2005-07-24 02:25 ]
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-07-25 10:58
コンパイラによる最適化の結果ですね。
finalをつける前後で、コンパイル後の.classを逆コンパイルしてみると...

finalをつけない
コード:
/*   5*/		String s1 = "a";
/*   7*/		String s2 = "bc";
/*   9*/		String s3 = s1 + s2;
/*  11*/		String s4 = "abc";



finalをつける
コード:
/*   5*/		String s1 = "a";
/*   7*/		String s2 = "bc";
/*   9*/		String s3 = "abc";
/*  11*/		String s4 = "abc";



のように、finalをつけると、s3の値がリテラルに置き換わっています。

1

スキルアップ/キャリアアップ(JOB@IT)