3933

次のように初期化される配列があります。

Element[] array = {new Element(1), new Element(2), new Element(3)};

ArrayListこの配列をクラスのオブジェクトに変換したいと思います。

ArrayList<Element> arraylist = ???;
4

39 に答える 39

4937
new ArrayList<>(Arrays.asList(array));
于 2008-10-01T14:39:12.010 に答える
975

与えられた:

Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };

最も簡単な答えは次のとおりです。

List<Element> list = Arrays.asList(array);

これはうまくいきます。ただし、いくつかの注意事項があります。

  1. asList から返されるリストのサイズは固定です。したがって、コードで返されたリストに要素を追加または削除できるようにする場合は、それを new でラップする必要がありますArrayList。それ以外の場合は、UnsupportedOperationException.
  2. から返されるリストはasList()、元の配列に基づいています。元の配列を変更すると、リストも変更されます。これは驚くべきことかもしれません。
于 2008-10-01T15:39:06.903 に答える
375

(古いスレッドですが、グアバやその他のライブラリやその他の詳細について言及していないため、わずか2セントです)

可能であれば、グアバを使用してください

これらの悪ふざけを大幅に簡素化するグアバの方法を指摘する価値があります。

使用法

不変リストの場合

ImmutableListクラスとそのof()ファクトリcopyOf()メソッドを使用します(要素を null にすることはできません)

List<String> il = ImmutableList.of("string", "elements");  // from varargs
List<String> il = ImmutableList.copyOf(aStringArray);      // from array

可変リストの場合

ListsクラスとそのnewArrayList()ファクトリ メソッドを使用します。

List<String> l1 = Lists.newArrayList(anotherListOrCollection);    // from collection
List<String> l2 = Lists.newArrayList(aStringArray);               // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs

他のクラスの他のデータ構造の同様のメソッドにも注意してくださいSets

なぜグアバ?

主な魅力は、Guavaファクトリ メソッドを使用するとほとんどの場合型を推測できるため、型安全のためのジェネリックスによる混乱を減らすことです。ただし、Java 7 が新しい diamond 演算子とともに登場して以来、この引数の根拠は少なくなりました。

しかし、それが唯一の理由ではありません (Java 7 はまだどこにでもあるわけではありません)。短縮構文も非常に便利であり、上記のメソッド初期化子を使用すると、より表現力豊かなコードを記述できます。現在のJavaコレクションで2回かかることを1回のグアバ呼び出しで行います。


できない場合...

不変リストの場合

でラップされた JDK のArraysクラスとそのasList()ファクトリ メソッドを使用しCollections.unmodifiableList()ます。

List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));

返される型asList()List具体的なArrayList実装を使用していますが、 NOT で java.util.ArrayListあることに注意してください。これは内部型であり、エミュレートしますArrayListが、実際には渡された配列を直接参照し、それを「ライトスルー」にします (変更は配列に反映されます)。

List単純に を拡張することによる API のメソッドの一部による変更を禁止しますAbstractList(そのため、要素の追加または削除はサポートされていません) が、set()要素をオーバーライドするための の呼び出しを許可します。したがって、このリストは本当に不変ではなく、への呼び出しasList()は でラップする必要がありCollections.unmodifiableList()ます。

変更可能なリストが必要な場合は、次の手順を参照してください。

可変リストの場合

上記と同じですが、実際のjava.util.ArrayList:でラップされています。

List<String> l1  = new ArrayList<String>(Arrays.asList(array));    // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array));          // Java 1.7+
List<String> l2  = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b"));       // Java 1.7+

教育目的: 古き良きマニュアルの方法

// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
  final List<T> l = new ArrayList<T>(array.length);

  for (final T s : array) {
    l.add(s);
  }
  return (l);
}

// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
  final List l = new ArrayList(array.length);

  for (int i = 0; i < array.length; i++) {
    l.add(array[i]);
  }
  return (l);
}
于 2012-11-16T17:16:41.463 に答える
248

この質問はかなり古いので、誰もまだ最も単純な形式を提案していないことに驚いています。

List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));

Java 5以降Arrays.asList()、varargsパラメーターを取り、配列を明示的に作成する必要はありません。

于 2011-06-22T11:30:23.463 に答える
223
new ArrayList<T>(Arrays.asList(myArray));

myArrayが と同じ型であることを確認してくださいT。たとえばList<Integer>、 の配列からを作成しようとすると、コンパイラ エラーが発生します。int

于 2008-10-01T14:40:46.607 に答える
111

別の方法 (基本的にはnew ArrayList(Arrays.asList(array))ソリューションのパフォーマンスと同等ですが、次のようになります。

Collections.addAll(arraylist, array);
于 2012-04-03T23:20:55.823 に答える
109

Java 9

Java 9では、List.of静的ファクトリ メソッドを使用してListリテラルを作成できます。次のようなもの:

List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));

これは、 3 つの要素を含む不変のリストを返します。変更可能なリストが必要な場合は、そのリストをArrayListコンストラクターに渡します。

new ArrayList<>(List.of(// elements vararg))

JEP 269: コレクションのコンビニエンス ファクトリ メソッド

JEP 269は、 Java Collections APIのいくつかの便利なファクトリ メソッドを提供します。これらの不変の静的ファクトリ メソッドは、Java 9 以降のListSet、およびインターフェースに組み込まれています。Map

于 2016-04-17T16:58:35.317 に答える
90

おそらく、ArrayList ではなく、List が必要なだけです。その場合、次のことができます。

List<Element> arraylist = Arrays.asList(array);
于 2008-10-01T14:45:02.917 に答える
76

もう 1 つの更新は、ほぼ 2014 年に終了しますが、Java 8 でも実行できます。

ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));

これが単なるList

List<Element> list = Stream.of(myArray).collect(Collectors.toList());
于 2014-11-25T20:48:36.917 に答える
26

Java 8 以降、より簡単に変換する方法があります。

import java.util.List;    
import static java.util.stream.Collectors.toList;

public static <T> List<T> fromArray(T[] array) {
    return Arrays.stream(array).collect(toList());
}
于 2016-12-23T12:31:28.400 に答える
25

さまざまな方法で変換できます

  1. List<Element> list = Arrays.asList(array);

  2. List<Element> list = new ArrayList();
    Collections.addAll(list, array);

  3. Arraylist list = new Arraylist();
    list.addAll(Arrays.asList(array));

詳細については、http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.htmlを参照してください。

于 2016-05-02T08:40:44.647 に答える
24

すべてが言ったように、これはそうするでしょう

 new ArrayList<>(Arrays.asList("1","2","3","4"));

配列を作成する一般的な最新の方法はobservableArraysです

ObservableList:変更が発生したときにリスナーが追跡できるようにするリスト。

Java SEの場合は試すことができます

FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3));

それはOracle Docsによると

observableArrayList() arraylist に基づく新しい空の観測可能なリストを作成します。observableArrayList(E... items) アイテムが追加された新しいオブザーバブル配列リストを作成します。

Java 9 を更新する

また、Java 9では少し簡単です:

List<String> list = List.of("element 1", "element 2", "element 3");
于 2017-01-05T18:32:55.717 に答える
22

Java 8 のストリームでも実行できます。

 List<Element> elements = Arrays.stream(array).collect(Collectors.toList()); 
于 2016-02-06T08:56:21.030 に答える
9

次のコードを使用して、要素配列を ArrayList に変換します。

Element[] array = {new Element(1), new Element(2), new Element(3)};

ArrayList<Element>elementArray=new ArrayList();
for(int i=0;i<array.length;i++) {
    elementArray.add(array[i]);
}
于 2018-12-03T11:32:10.090 に答える
6

Java 8 の Arrays クラスは、プリミティブ配列とオブジェクト配列の両方を受け入れるオーバーロードされたバージョンを持つ stream() メソッドを提供します。

/**** Converting a Primitive 'int' Array to List ****/

int intArray[] = {1, 2, 3, 4, 5};

List<Integer> integerList1 = Arrays.stream(intArray).boxed().collect(Collectors.toList());

/**** 'IntStream.of' or 'Arrays.stream' Gives The Same Output ****/

List<Integer> integerList2 = IntStream.of(intArray).boxed().collect(Collectors.toList());

/**** Converting an 'Integer' Array to List ****/

Integer integerArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

List<Integer> integerList3 = Arrays.stream(integerArray).collect(Collectors.toList());
于 2019-05-19T11:20:27.540 に答える
5

以下のコードは、これを行う良い方法のようです。

new ArrayList<T>(Arrays.asList(myArray));
于 2019-12-04T07:59:42.910 に答える
3

通常のサイズの配列の場合、上記の答えは有効です。配列のサイズが大きく、Java 8 を使用している場合は、ストリームを使用して実行できます。

  Element[] array = {new Element(1), new Element(2), new Element(3)};
  List<Element> list = Arrays.stream(array).collect(Collectors.toList());
于 2020-11-18T12:45:57.733 に答える