- PR -

二種類のString[]生成法の間の違いは?

投稿者投稿内容
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-08-10 18:04
お久しぶりです。

ちょっとお聞きしたいのですが、
String[] s = new String[] {"abc", "def", "ghi"};
で生成したsと
String[] s = {"abc", "def", "ghi"};
で生成したsと
何が違うのでしょうか。
よろしくお願い致します。


しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-08-10 18:31
IBMJDK 1.3 でコンパイルした .class を javap -c で dump しましたが、
クラス名、メソッド名以外は同じでした。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-08-11 00:04
今、言語仕様をちら〜と見てたのですが、
String[] s = new String[] {"abc", "def", "ghi"};
という書式についての記述が見当たりません。『配列』『文字列』『式』のところを見たのですけどどこかでちゃんと規定されてるのでしょうか?

String[] s = {"abc", "def", "ghi"};
はちゃんと規定されています。

多分、実行時の処理は同じでしょうが 
String[] s = {"abc", "def", "ghi"};
のほうが私は好きです。(思い切り主観が入ってます 笑)
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-08-11 02:27
ご返事ありごとうございます。

考えてみればよく馴染んできた
String[] s = {"abc", "def", "ghi"};
のほうは実に異質的な存在ではないかと思うようになりました。
この右、{"abc", "def", "ghi"} はなんですか。可笑しくない?
左は参照であれば、右はnewでオブジェクトを生成するのは通常ですね。

恐らく、String[] s = {"abc", "def", "ghi"};は
String[] s = new String[]{"abc", "def", "ghi"};の場当たりの簡略記法ではないか、
今、気がついたようです。コンパイラは足りない部分を補ってくれるのでしょう。
ようするに new String[]{"abc", "def", "ghi"};は本来的&一般的なので、
{"abc", "def", "ghi"}は特殊的な記法だと思います。

例:

function(String[] hoge) があるとします。
× function({"abc", "def", "ghi"}); // コンパイラーエラー
× function(new {"abc", "def", "ghi"}); // コンパイラーエラー

○ function(new String[]{"abc", "def", "ghi"});

また宜しくお願い致します。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-08-11 08:23
言語仕様を見直してみました。(暇人だ・・・)んで分かりました。

コンパイル時には以下のコードは
コード:

String[] s = {"abc", "def", "ghi"};  //<-- 宣言(Declaration)
String[] s = new String[]{"abc", "def", "ghi"}; //<-- 配列生成式(ArrayCreationExpression)

と2種類に分類されます。

{ から } までは 配列初期化子(ArrayInitializer)と呼ばれ、宣言中もしくは配列生成式の最後に現れてよいことになっています。
引用:

--10.6 Array Initializers--より
An array initializer may be specified in a declaration, or as part of an array creation expression (§15.10), creating an array and providing some initial values:



両方とも処理されることは同じです。配列の空間を確保し、配列の中身を配列初期化子で指定されたものにします。
引用:

--15.10 Array Creation Expressions--より
If an array initializer is provided, the newly allocated array will be initialized with the values provided by the array initializer as described in §10.6.



引用:

function(String[] hoge) があるとします。
× function({"abc", "def", "ghi"}); // コンパイラーエラー
× function(new {"abc", "def", "ghi"}); // コンパイラーエラー

○ function(new String[]{"abc", "def", "ghi"});


での最初の文のコパイルエラーの原因はメソッドの呼び出しでの引数に「宣言」が記述されているからです。コンパイルできる書式の方は、「配列生成」が記述されているのでOK。そういう違いです。

ですので、ただの『簡略記法ではないか』では無いようです。言語仕様中ではどっちが良いかとは書かれてはいませんが、例では宣言の方しか使ってないですねぇ。

[ メッセージ編集済み 編集者: H2 編集日時 2002-08-11 08:32 ]
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-08-11 14:15
H2さん
こんにちは
暑い日に負けてはいけない(^o~)
再引用:
----------------------------------------------------------------
--10.6 Array Initializers--より
An array initializer may be specified in a declaration, or as part of an array creation expression (§15.10), creating an array and providing some initial values:
----------------------------------------------------------------

"An array initializer may be specified in a declaration..."
"a declaration"って、結局その場で文字列の配列オブジェクトを生成するでしょ。
それに{}の中身で初期化をするのでしょ。
これじゃ、"creating an array and providing some initial values"とは何が違うの?
という質問の原点に戻ってしまいますね。(__;;
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-08-11 19:05
日本は暑いみたいですね。夏ばてなどしないよう気をつけてくださいね。

引用:

"An array initializer may be specified in a declaration..."
"a declaration"って、結局その場で文字列の配列オブジェクトを生成するでしょ。
それに{}の中身で初期化をするのでしょ。
これじゃ、"creating an array and providing some initial values"とは何が違うの?
という質問の原点に戻ってしまいますね。(__;;



"If an array initializer is provided, the newly allocated array will be initialized with the values provided by the array initializer as described in §10.6."と書いてあるので、実際の配列生成方法に違いはないはずです。

唯一の違いは、ひとつはexpression(式)として認識され、もうひとつはdeclarartion(宣言)として処理されることです。つまり、両者は文法が違うので使える所が違います。

でも、どちらを使うかは個人の好みですよね〜。私は面倒くさがりなので、String[] s = new String[]{"abc", "def", "ghi"};のような書き方はしません。 String s = new String("Hello") なんて書き方しませんよね
isseki
大ベテラン
会議室デビュー日: 2001/11/05
投稿数: 107
投稿日時: 2002-08-11 23:04
H2さん
こんばんは
> 日本は暑いみたいですね。夏ばてなどしないよう気をつけてくださいね。
ありがとうございます。

>唯一の違いは、ひとつはexpression(式)として認識され、もうひとつはdeclarartion(宣言)として処理されることです。つまり、両者は文法が違うので使える所が違います。
あぁーッ、お陰さまで記憶が戻りました!
expressionとdeclarartionですよね、
C言語や他の言語にも通用するような気がしますが、
int i=2;

i=2;
との区別と同じですねぇ。

要は
静的に初期化するか(コンパイル段階)、動的に初期化するか(実行段階)の違いですね。
どうもありがとうございました。

>String s = new String("Hello") なんて書き方しませんよね。
そうですね。メモリの無駄使いとなりますから。

今後ともよろしくお願いします。

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