Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(二次元リストの作成)
閲覧数:1487
掲示板(二次元リストの作成)
名前
匿名
題名 二次元リストの作成
質問内容

質問を評価する
(0ポイント)
配列のような二次元リストが必要になったのでいろいろ試してみると次の方法で上手くいくことがわかりました。

List<List<String>> bigList = new ArrayList<List<String>>();
for(int i = 0;i < 3;i++){
 List<String> list = new ArrayList<String>();
 list.add(i+"の第一項");
 list.add(i+"の第二項");
 bigList.add(list);
}
for(List<String> list : bigList){
 System.out.println(list);
}

実行結果:
[0の第一項, 0の第二項]
[1の第一項, 1の第二項]
[2の第一項, 2の第二項]

listがfor文の中で宣言されているにもかかわらず、for文が閉じたあとでもlistの中身が有効なのがすごく不思議です。
プリミティブ型出なければ参照渡しだと理解しているのですが間違っているでしょうか。
for文が閉じたため参照する先がないように感じるのですが。
質問日時 2013-05-03 03:05:06
名前
回答内容

回答を評価する
(0ポイント)
ご質問の意味が理解出来ません。
list は for 文の中にしか見当たりませんが?
閉じたらなくなりますがまた宣言出来ます。
もしなくなってくれなかったら二つ目の for 文で重複宣言エラーします。
回答日時 2013-05-03 05:42:32
名前
匿名
回答内容

回答を評価する
(0ポイント)
>for文が閉じたため参照する先がないように感じるのですが。
参照は、宣言した位置に拠るのではない。
変数を代入した先への参照が生きているかどうかに拠る。
この場合ではbigListがそれ。
bigListが生きていればその中の2つのlistは生きており、
各listの中の文字列もまた生きている。

bigListのスコープを外れるか、bigListに別のインスタンスが
代入されるかすると、今のbigListインスタンスへの参照が
なくなるので、2つのlistとその中の文字列もまた参照を失う
ことになり、全てガベージコレクトの候補になる。
回答日時 2013-05-03 13:57:11
名前
匿名
回答内容

回答を評価する
(0ポイント)
別のインスタンスの代入には、nullの代入も含む。念の為。
回答日時 2013-05-03 14:02:46
名前
匿名
回答内容

回答を評価する
(0ポイント)
>仙人さま
>匿名さま
回答ありがとうございます。
for文が閉じたところで変数が廃棄されると思っていましたがそこが間違いだったようです。
変数への参照が存在する限りは変数も存在し続けるということですね。
よく理解できました。
回答日時 2013-05-03 15:09:24
名前
回答内容

回答を評価する
(0ポイント)
Java の参照型変数、例えばあなたのコードの list は参照を保持します。
new で作ったインスタンス自体が list に入ってるのではありません。
add したとき list に保持されていた参照が
new ArrayList<List<String>>() で作った外側のリストの
インスタンス内にコピーされます。
for をぬければ list は 消滅します。list からの参照も無くなりますが
外側のリスト内に残っています。
改めて別の for 文で bigList から取り出せば出てきます。
回答日時 2013-05-03 15:55:03

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道