• ベストアンサー

Javaで配列を定義する方法

こんにちは、片岡といいます。 Java言語で配列を定義する場合、以下の二つの書式に違いはありますか。 違いがあるとすれば、どのような違いですか。 また、違いがないのならば、どちらの記述がよいのですか。 ご存知の方はいらっしゃいませんか。 (1) public class Main1 { public static void main(String[] args) { String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2) public class Main2 { public static void main(String[] args) { String str[] = { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.4.2_13" 検索エンジンで"配列 オブジェクト java"を検索しましたが、 解決に役立つ情報は見つかりませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • tthe_mine
  • ベストアンサー率46% (19/41)
回答No.1

そういうときはコンパイルした後のコードが同じになるか確かめると良いと思います。 javap -c <クラス名> というコマンドで逆アセンブルしたコードを表示できるので、これを比較してみてください。 どうなるかはやってのお楽しみということで。 私が String の配列を定義するときは、よく下のようにやるのですが、これも比較してみると良いと思います。 String str[] = { "itiban", "niban", "sanban", };

noname#91531
質問者

お礼

tthe_mineさん回答ありがとうございます。 アドバイスを試したところ、 String str[] = {"itiban", "niban", "sanban"}; と書くと一番無駄がないように思いました。 私がやったこと、 (1)以下のプログラムを作りました。 public class Main3 { public static void main(String[] args) { String str[] = { "itiban", "niban", "sanban" }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2)次に以下のコマンドを実行しました。 D:\>javap -c Main1 > Main1.txt D:\>javap -c Main2 > Main2.txt D:\>javap -c Main3 > Main3.txt (3)結果1 String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban") }; を逆アセンブルしたMain1.txtと String str[] = { new String("itiban"), new String("niban"), new String("sanban") }; を逆アセンブルしたMain2.txtは、どちらも同じコードになりました。 以下がMain2.txtの一部です。 public static void main(java.lang.String[]); Code: 0: iconst_3 1: anewarray #2; //class String 4: dup 5: iconst_0 6: new #2; //class String 9: dup 10: ldc #3; //String itiban 12: invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/String;)V 15: aastore 16: dup (4)結果2 String str[] = { "itiban", "niban", "sanban" }; を逆アセンブルしたMain3.txtには、 Main1.txtやMain2.txtと違い"invokespecial"がありませんでした。 以下がMain3.txtの一部です。 public static void main(java.lang.String[]); Code: 0: iconst_3 1: anewarray #2; //class String 4: dup 5: iconst_0 6: ldc #3; //String itiban 8: aastore 9: dup 間違っているかもしれませんが、"itiban"のような文字列リテラルは、 それのみで、Stringオブジェクトの参照を表すのだと思います。 tthe_mineさんありがとうございます。

その他の回答 (1)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

面白い疑問ですね。 ANo.1さんの回答も含めて興味ある内容です(笑) 少なくとも、配列に関する記述の部分はどんな書き方をしても同じです。 配列自身がクラスとして扱われますので、生成内容に変化が生まれることはないでしょう。 むしろ変化が出るのは文字列操作の部分ですかね。 ご質問者さんの内容だと、どちらで書かれても同じではないかと思います。 たぶん、ANo.1さんの回答の書き方が効率がよいと思いますよ。 理由はStringクラスの特殊性でしょうか。 "aaaaa".substring(1,2);  みたいに書けるって事は・・・・ ・・・って事に気づけば答えは出たも同然ですが。 キーワードは[Java String 変更]です。

noname#91531
質問者

お礼

PED02744さん回答ありがとうございます。 "Java String 変更"をgoogleで検索したところ、 http://segroup.fujitsu.com/sdas/technology/java-tips/01-StringBuffer.html というページがヒットしました。 Stringオブジェクトの勉強に、とても参考になりました。 PED02744さん、ありがとうございます。

関連するQ&A