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

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

ただいまの
回答率

90.52%

  • Java

    13785questions

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

aslistとはなにか?

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 192

rerarail

score 2

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

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+7

まずリファレンスを読みましょう。

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)の点に注意が必要になります。

import java.util.*;

class T {
  public static void main(String[] args) {
    List<Integer> a = foo();
    a.set(1, 22);
    dump(a);

    List<Integer> b = foo();
    dump(b);
  }

  static void dump(List<Integer> list) {
    for (int i = 0; i < list.size(); i++) {
      System.out.format("[%d] %d%n", i, list.get(i));
    }
  }

  static Integer[] values = { 1, 2, 3, 4 };

  static List<Integer> foo() {
    return Arrays.asList(values);
  }
}


これを動かしてみると分かりますが、同じfooを呼び出して生成しても1回目の呼び出しで要素を書き換えてしまうと2回目の呼び出しでは書き換えた内容のリストが生成されてしまいます。これは(A)に書いてあるようにasListで生成したリストの要素を書き換えるとasListの引数に指定した配列の要素も書き換わってしまうからです。

そこでそういう心配がないよう、asListの結果をArrayListのコンストラクター引数に指定して「要素がコピーされた新たなリスト(ArrayList)」を生成するという方法を採ることがあります。

ただしasList(1, 2, 3, 4)のように引数に直接要素を並べる方法で生成するとasListに渡される配列が実行の度に生成されるため実は(D)のように書いてもなんら問題ありません。

また上記の説明はvoid foo(int[] elements)void foo(int... elements)(訂正:間違えました!失礼しました)というメソッドに対して下記のどちらで書いてもよいことを知っている前提で述べてます。こうした言語仕様の知識もライブラリーの機能を把握するためには当然ながら必要な「前提知識」になります。

int[] values = { 1, 2, 3 };
foo(values);
foo(1, 2, 3);

とにかく「知っておかなければならない言語仕様やライブラリーの仕様は山のようにある」ので一度ではとても覚えられません。覚えるためには沢山仕様を学び、コードも書いて「仕様の意味が有機的に自分の頭の中で結びつけられるようになるまで」把握できるよう努めるのがよいと思います。

特に初心者のころは「体育会系」のノリがいいです。ひたすら仕様書や解説を読みふけり、かつ実際にコードを書き動かし多くの知識を「頭というより体に」叩き込みます。知識がついてきたらそういうノリはだんだんいらなくなります。仕様を読めば何を言っているかすぐわかるようになりますし、仕様を読む前から「まぁこういう感じだろう」という勘が働くようになるからです。もちろん勘が外れることはありますが・・・

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/09 06:21

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

    キャンセル

  • 2018/06/09 12: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行で書けるという感覚ではないでしょうか。

    キャンセル

  • 2018/06/09 12:30

    addAllもCollectionだったような気が

    キャンセル

  • 2018/06/09 12:43 編集

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

    キャンセル

+1

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

最終的な結果として、やっていることは次と同じです。

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);


端的に言えば、これを1行でやっているのが質問のコードです。

ArrayListの内容を初期化する方法として、初期値内容をコンストラクタで渡すという方法なのですが、渡せるものがCollectionインタフェースを実装するオブジェクトと決められており、配列や要素の羅列を渡すことはできないのです。

その「配列や要素の羅列」をList(Collectionインタフェース実装)として扱えるよう変換するメソッドがArrays.asListなのです。このような例で、「配列をList型に変換する」という場面で役に立つメソッドです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13785questions

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