質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

4回答

1906閲覧

aslistとはなにか?

rerarail

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/06/08 01:29

Javaのaslistがイマイチわかりません。

List< Integer> List = new ArrayList< Integer>(Arrays.asList(1,2,3,4,5));

上のコードはどういういみでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/08 21:21

asListの結果をArrayListのコンストラクターに渡すのは追加・削除がしたいから、ということが多いと思います。
KSwordOfHaste

2018/06/09 03:10

そうですね。追加・削除がしたい意志はArrayListを使っている点にあると思います。追加・削除・書き換えが不要で積極的に抑止したいならCollections.unmodifiableList(...)を使ったりすると思います。 追加・削除がしたいのでArrayListを用いる =>初期値も指定したいが初期値はCollectionでしか指定できない =>N個の固定的な要素、あるいは既に存在する配列の中身を初期値にしたいならArrays.asList こういう発想になるのだと思います。つまりこのコードを書く時のプログラマーの思考はswordoneさん回答にあるようなものだと思います。 a = new Array<Integer>(); a.addAll(1, 2, 3); と書けばArrays.asListを使わなくても少ない行でかけますが、それならいっそ a = new Array<Integer>(Arrays.asList(1, 2, 3)); と書けば1行で書けるという感覚ではないでしょうか。
swordone

2018/06/09 03:30

addAllもCollectionだったような気が
KSwordOfHaste

2018/06/09 03:44 編集

失礼しました。ご指摘ありがとうございます。 2つ上のコメントで a = new Array<Integer>(); a.addAll(1, 2, 3); と書きましたがこれは間違いです!以下のコードをイメージしてました。 a = new Array<Integer>(); Collections.addAll(a, 1, 2, 3);
guest

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

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2018/06/08 01:36

編集2018/06/08 01:37
ladybird

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2018/06/08 01:37

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問