読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

Java言語仕様の勉強 3日目

言語仕様 Java

あけましておめでとうございます。
寝正月とはよく言ったもので、実家に戻ってゴロゴロしてると本を読んでいても気が付くと爆睡してしまっている元旦…続けて「プログラミング言語Java (The Java Series)第4版」を読みますが、つい寝ちゃって中々進みません(^^;


ジェネリクスの章を通ったのですが、ワイルドカードがイマイチ理解できていないので、ちゃんと理解してから書こうと思います。

ラベル

Javaだとこんな制御があるんですね。本では「10.6 ラベル」で、続けて「ラベル付きbreak」「ラベル付きcontinue」が紹介されてました。C#だと…goto使うしかない?

とりあえず試してみました。

package jp.kikutaro.label;

public class LabelTry {
    
    private int[] arr = {0, 1, 2, 3, 4};
    
    public void useLabel(){
        
        これがラベルだ:
        {
            for(int intVal : arr){
                if(intVal == 2){
                    break これがラベルだ;
                }
            }
            
            System.out.println("ここには到達しない!?");
        }
        
        System.out.println("メソッドの末端");
    }   
}

実行結果
run:
メソッドの末端

「ここには到達しない!?」はすっ飛ばしてる。地味だけど使いそうな気が。

Stringの同値

「13.2.3 文字列リテラル、同値性、インターン」すごい基礎的な気がするのだけど、地味に頭がこんがらがってしまいました。

13.2.3の冒頭で「一般に、文字列を比較するのに==を使用すると誤った結果となります。」と記述があります。文字列の内容の比較と参照の比較の件ですね、と。

で、お試し

String str1 = "aaa";
String str2 = "aaa";
System.out.println(str1 == str2 ? "Equal" : "Not Equal"); //NetBeans警告あり

実行結果
Equal
このお試しも一瞬「あれ?」と思ったのですが、"aaa"で同じ参照が利用される、という理解であっている…のかな。ちなみに3行目はNetBeansの警告がでます。文字列を==で比較すな、と。

続けて明示的に参照が違うようにしてみました。

String str3 = new String("aaa"); //NetBeans警告あり
String str4 = new String("aaa"); //NetBeans警告あり
System.out.println(str3 == str4 ? "Equal" : "Not Equal"); //NetBeans警告あり

実行結果
Not Equal
確かに参照の比較になってるようです。

「13.2.2 文字列比較」でStringクラスのequalsについて触れられています。これがベストですかね。

String str5 = new String("aaa"); //NetBeans警告あり
String str6 = new String("aaa"); //NetBeans警告あり
System.out.println(str5.equals(str6) ? "Equal" : "Not Equal");

実行結果
Equal
参照は違うけれど、同値なので、equalsでは同値と判定されました。

てか、compareToも紹介されてたよな…と。

String str7 = new String("aaa");
String str8 = new String("aaa");
System.out.println(str7.compareTo(str8) == 0 ? "Equal" : "Not Equal");

実行結果
Equal

13.2.3ではinternメソッドも紹介されてたぞ…と。これは同じ文字列のStringを返すメソッドとのことです。

String str9 = new String("aaa");
String str10 = new String("aaa");
System.out.println(str9.intern() == str10.intern() ? "Equal" : "Not Equal");

実行結果
Equal

結局、同値調べるにはどれがベストなの!!と元旦早々わからなくなったのですが、ネット上では(当然ですが…)色々情報がありそうなので、いったん本を離れて調べてみようと思います。
StackOverflowでも色々意見が
Is it good practice to use java.lang.String.intern()?

2013/1/2追記
equalsを利用し、文字列にnullがありえるか・ありえないかで使い分ける。こちらの方法が良さそうです。とても参考になりました。
http://www.ne.jp/asahi/hishidama/home/tech/java/string.html

なんかやってることが情報系学生レベルな気が…いいのか自分。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村