Javaのaslistがイマイチわかりません。
List< Integer> List = new ArrayList< Integer>(Arrays.asList(1,2,3,4,5));
上のコードはどういういみでしょうか??
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
まずリファレンスを読みましょう。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html#asList-T...-
指定された配列に連動する固定サイズのリストを返します。(A)返されたリストへの変更は、そのまま配列に書き込まれます。(B)このメソッドは、Collection.toArray()と組み合わせることで、配列ベースのAPIとコレクションベースのAPIの橋渡し役として機能します。...
このメソッドは、(C)次の数種類の要素を含むように初期化する固定サイズのリストを作成するための便利な方法も提供します。
`List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");`
((A)
, (B)
, (C)
は回答者が追記)
・・・なのですが初心者の方にはリファレンスを見ても前提知識が不足しすぎていて「読んでもわからん」ということもあるでしょう。それは「前提知識をガンガン学んでいくこと」でしか解消できません。Javaに限らず言語を学ぶということは「仕様を読み、それを理解し、理解できなければ参考書なり解説記事などで理解の手掛かりをつかみ、自分で納得できるまで実際に書いて動かしてみる」ということの繰り返しです。
Javaをある程度学ぶと上記のリファレンスの記述から概ね以下のようなことが把握できるようになります。
List< Integer> list = new ArrayList< Integer>(Arrays.asList(1,2,3,4,5));
(1) Arrays.asList(1,2,3,4,5)
で5つの要素を持つList<Integer>のインスタンスを生成する。リファレンスで言えば(C)。
(2) new ArrayList<Integer>(Arrays.asList(1,2,3,4,5))
は(1)で生成したリストと同じ内容を持つ新たなArrayListのインスタンスを生成する。リファレンスの(B)。
(3) (A)に注意が必要。
大抵の場合
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
... (D)
でも充分なのですが、asListの引数に配列を用いると(A)の点に注意が必要になります。
java
1import java.util.*; 2 3class T { 4 public static void main(String[] args) { 5 List<Integer> a = foo(); 6 a.set(1, 22); 7 dump(a); 8 9 List<Integer> b = foo(); 10 dump(b); 11 } 12 13 static void dump(List<Integer> list) { 14 for (int i = 0; i < list.size(); i++) { 15 System.out.format("[%d] %d%n", i, list.get(i)); 16 } 17 } 18 19 static Integer[] values = { 1, 2, 3, 4 }; 20 21 static List<Integer> foo() { 22 return Arrays.asList(values); 23 } 24}
これを動かしてみると分かりますが、同じfooを呼び出して生成しても1回目の呼び出しで要素を書き換えてしまうと2回目の呼び出しでは書き換えた内容のリストが生成されてしまいます。これは(A)に書いてあるようにasListで生成したリストの要素を書き換えるとasListの引数に指定した配列の要素も書き換わってしまうからです。
そこでそういう心配がないよう、asListの結果をArrayListのコンストラクター引数に指定して「要素がコピーされた新たなリスト(ArrayList)」を生成するという方法を採ることがあります。
ただしasList(1, 2, 3, 4)
のように引数に直接要素を並べる方法で生成するとasListに渡される配列が実行の度に生成されるため実は(D)のように書いてもなんら問題ありません。
また上記の説明は~~void foo(int[] elements)
~~void foo(int... elements)
(訂正:間違えました!失礼しました)というメソッドに対して下記のどちらで書いてもよいことを知っている前提で述べてます。こうした言語仕様の知識もライブラリーの機能を把握するためには当然ながら必要な「前提知識」になります。
java
1int[] values = { 1, 2, 3 }; 2foo(values); 3foo(1, 2, 3);
とにかく「知っておかなければならない言語仕様やライブラリーの仕様は山のようにある」ので一度ではとても覚えられません。覚えるためには沢山仕様を学び、コードも書いて「仕様の意味が有機的に自分の頭の中で結びつけられるようになるまで」把握できるよう努めるのがよいと思います。
特に初心者のころは「体育会系」のノリがいいです。ひたすら仕様書や解説を読みふけり、かつ実際にコードを書き動かし多くの知識を「頭というより体に」叩き込みます。知識がついてきたらそういうノリはだんだんいらなくなります。仕様を読めば何を言っているかすぐわかるようになりますし、仕様を読む前から「まぁこういう感じだろう」という勘が働くようになるからです。もちろん勘が外れることはありますが・・・
投稿2018/06/08 02:17
編集2018/06/08 10:35総合スコア18394
0
最終的な結果として、やっていることは次と同じです。
java
1List<Integer> list = new ArrayList<Integer>(); 2list.add(1); 3list.add(2); 4list.add(3); 5list.add(4); 6list.add(5);
端的に言えば、これを1行でやっているのが質問のコードです。
ArrayListの内容を初期化する方法として、初期値内容をコンストラクタで渡すという方法なのですが、渡せるものがCollectionインタフェースを実装するオブジェクトと決められており、配列や要素の羅列を渡すことはできないのです。
その「配列や要素の羅列」をList(Collectionインタフェース実装)として扱えるよう変換するメソッドがArrays.asListなのです。このような例で、「配列をList型に変換する」という場面で役に立つメソッドです。
投稿2018/06/09 01:46
総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2018/06/08 01:36
編集2018/06/08 01:37総合スコア163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2018/06/08 01:37
総合スコア5572
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/08 21:21
2018/06/09 03:10
2018/06/09 03:30
2018/06/09 03:44 編集