JavaでList <String>オブジェクトを初期化する方法は?


405

次のコードのようにリストを初期化できません:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

私は次のエラーに直面します:

タイプをインスタンス化できません List<String>

どうすればインスタンス化できますList<String>か?

回答:


733

あなたがチェックした場合はAPIをするためにListあなたは気づくでしょう、それは言います:

Interface List<E>

ビーイングinterfaceそれは(NOはインスタンス化できない手段でnew List()も可能です)。

そのリンクを確認するとclass、実装するesがいくつか見つかりますList

すべての既知の実装クラス:

AbstractListAbstractSequentialListArrayListAttributeListCopyOnWriteArrayListLinkedListRoleListRoleUnresolvedListStackVector

それらはインスタンス化できます。それらのリンクを使用して、それらについて詳しく知る、IE:どちらがニーズにより適しているかを知る。

最も一般的に使用される3つはおそらく次のとおりです。

 List<String> supplierNames1 = new ArrayList<String>();
 List<String> supplierNames2 = new LinkedList<String>();
 List<String> supplierNames3 = new Vector<String>();

おまけ:次の
ように、を使用してArrays class、簡単に値でインスタンス化することもできます。

List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

ただし、そのため、リストに要素を追加することはできませんfixed-size


1
Arrays.asListは素晴らしいですが、気づかれたように、このような場合に期待int[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
どおり

1
@JAILそれは何が起こっているのかではありません。これは、1つの要素のリストで、1つの要素は整数の配列です。欲しかった行動は、おそらく三つの要素1、2のリストで、3
クリストファーHammarström

1
@ChristofferHammarströmこの機能は、すでに与えられているので、リストや配列を印刷するには、あなたがjava.util.Arrays.toString(配列);,使用することができます。..
Maxr1998

1
これここのようなVectorの使用を損なうものがあります。スレッドの問題のため
Nuno Rafael Figueiredo

3
結果のリストをにする必要がある場合はArrayListnew ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

114

インターフェイスをインスタンス化することはできませんが、いくつかの実装があります:

JDK2

List<String> list = Arrays.asList("one", "two", "three");

JDK7

//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");

JDK8

List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());

JDK9

// creates immutable lists, so you can't modify such list 
List<String> immutableList = List.of("one", "two", "three");

// if we want mutable list we can copy content of immutable list 
// to mutable one for instance via copy-constructor (which creates shallow copy)
List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));

さらに、Guavaのような他のライブラリによって提供される他の多くの方法があります。

List<String> list = Lists.newArrayList("one", "two", "three");

38

リストはインターフェイスです。インターフェイスは慣例であるため、インターフェイスをインスタンス化することはできません。どのメソッドにクラスが必要ですか。インスタンス化するには、そのインターフェースのいくつかの実現(実装)が必要です。以下のコードを、Listインターフェースの非常に一般的な実装で試してください。

List<String> supplierNames = new ArrayList<String>(); 

または

List<String> supplierNames = new LinkedList<String>();

14

ArrayList<String>などを使用する必要があります。

List<String> インターフェースです。

これを使って:

import java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();

13

リストはインターフェースであり、インターフェースを初期化することはできません。代わりに実装クラスをインスタンス化してください。

お気に入り:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();

9

リストは単なるインターフェースであり、いくつかの一般的なリストの定義です。このリストインターフェイスの実装を提供する必要があります。最も一般的な2つは次のとおりです。

ArrayList-配列に実装されたリスト

List<String> supplierNames = new ArrayList<String>();

LinkedList-要素の相互接続チェーンのように実装されたリスト

List<String> supplierNames = new LinkedList<String>();


7

使用するリストの種類に応じて、次のようなもの

List<String> supplierNames = new ArrayList<String>();

あなたが行くはずです。

Listはインターフェースで、ArrayListはListインターフェースの1つの実装です。ListインターフェースのJavaDocsを読むと、ニーズにより適した実装がさらに見つかることがあります


7

オブジェクトが1つだけの不変 オブジェクトを作成する場合は、次のAPIを使用できます。List<T>

List<String> oneObjectList = Collections.singletonList("theOnlyObject”);

詳細:ドキュメント


5

リストはインターフェースです。Listを使用して初期化することはできません。

  List<String> supplierNames = new ArrayList<String>();

これらは、いくつかのList impelementedクラスです。

ArrayList, LinkedList, Vector

要件に応じて、これらのいずれかを使用できます。これらの各クラスには独自の機能があります。


これここのようなVectorの使用を損なうものがあります。スレッドの問題のため
Nuno Rafael Figueiredo

3

念のため、この質問についてはまだ誰もが残っています。、私は、1人のまたは2つの新しいユーザ再び同じ質問をし、誰もが、その後伝えるを参照するので、ありませんあなたがそれを行うことができない、親愛なる慎重さは、はい、あなたが実際にすることができます- 、別にここで与えられたすべての答えから、私は追加情報を提供したいと思います行う、リストリスト=新しいリスト(); しかし、インターフェースのすべてのメソッドの実装を書くことを犠牲にして。概念は単純にList list = new List();ではありません。だが

List<Integer> list = new List<Integer>(){

        @Override
        public int size() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return false;
        }

.....など(すべてのメソッドを記述できません。)

これは匿名クラスの例です。誰かが言ったときに正しい、いいえ、あなたはインターフェースをインスタンス化することはできません、そしてそれは正しいです。しかし、あなたは決して言うことはできません、あなたは書くことができますList list = new List(); しかし、明らかにあなたはそれを行うことができそれはあなたができないことを作るのが難しい声明です


ただし、明確にするために、実際のタイプがであるオブジェクトは作成されませんList。むしろ、名前を持たず、を実装する新しいクラスを宣言し、List実行時に、新しく宣言されたクラスの新しいオブジェクトを作成します。
Radiodef

0

私たちは、作成したソユーズにどのように変換するには:1つの問題簡素化するためXY(例えばStringにしますInteger)。それが構築するための簡単な機能を持っているような種類の変換でもオブジェクトである構築MapListSet

import io.thedocs.soyuz.to;

List<String> names = to.list("John", "Fedor");

それをチェックしてください-それは他の多くの便利な機能を持っています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.