Java에서 List <String> 객체를 초기화하는 방법은 무엇입니까?


405

다음 코드와 같이 List를 초기화 할 수 없습니다.

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이 인스턴스화 할 수없는 수단을 (더 new List()불가능하다).

해당 링크를 확인하면 다음 class을 구현 하는 es가 있습니다 List.

알려진 모든 구현 클래스 :

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack,Vector

그것들은 인스턴스화 될 수 있습니다. 그들의 링크를 사용하여 그들에 대해 더 많이 알 수 있습니다.

가장 일반적으로 사용되는 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]
Mr_and_Mrs_D

1
@JAIL 그것은 일어나고 있지 않습니다. 하나의 요소가 int의 배열 인 하나의 요소 목록입니다. 원하는 행동은 아마도 세 가지 요소 1, 2, 3의 목록 일 것입니다.
Christoffer Hammarström

1
@Christoffer Hammarström은 목록이나 배열을 인쇄하기 위해 java.util.Arrays.toString (array);를 사용할 수
있으므로이

1
이것here 과 같은 Vector의 일부 불일치 사용 . 때문에 문제 스레딩의
누누 라파엘 Figueiredo의를

3
결과 목록이이어야하는 ArrayList경우new 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는 Interface 이며 인터페이스는 규칙이므로 클래스에 어떤 메소드가 있어야하는지 인터페이스를 인스턴스화 할 수 없습니다. 인스턴스화하려면 해당 인터페이스의 구현 (구현)이 필요합니다. 매우 인기있는 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는 인터페이스이므로 인터페이스를 초기화 할 수 없습니다. 대신 구현 클래스를 인스턴스화하십시오.

처럼:

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

9

List는 인터페이스 일 뿐이며 일부 일반 목록의 정의입니다. 이 목록 인터페이스의 구현을 제공해야합니다. 가장 일반적인 두 가지는 :

ArrayList- 배열에 구현 된 목록

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

LinkedList- 상호 연결된 요소 체인처럼 구현 된 목록

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


7

사용하려는 List의 종류에 따라

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

당신이 갈 수 있어야합니다.

List는 인터페이스이고 ArrayList는 List 인터페이스의 한 구현입니다. JavaDocs of List 인터페이스를 읽으면 더 적합한 구현을 찾을 수 있습니다 .


7

당신은 단지 만들려면 불변 List<T> 만에 하나 그 안에 오브젝트를,이 API를 사용할 수 있습니다 :

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

추가 정보 : 문서


5

List는 인터페이스입니다. List를 사용하여 초기화 할 수 없습니다.

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

이것들은 List 요소가없는 클래스 중 일부입니다.

ArrayList, LinkedList, Vector

요구 사항에 따라이 중 하나를 사용할 수 있습니다. 이러한 각 클래스에는 고유 한 기능이 있습니다.


이것here 과 같은 Vector의 일부 불일치 사용 . 때문에 문제 스레딩의
누누 라파엘 Figueiredo의를

3

만일을 대비하여 여전히이 질문 주위에 남아있는 사람이 있습니다. , 내가 하나 또는 두 개의 새로운 사용자가 다시 같은 질문을 모든 사람들이 다음 이야기를 볼 수 있기 때문에, 아니 당신은 할 수 없어, 친애하는 신중함이 예를 실제로 할 수 - 외에도 여기에 주어진 모든 대답에서, 나는 추가 정보를 제공하고 싶습니다 do, list list = new List (); 그러나 인터페이스의 모든 메소드의 구현을 작성하는 비용이 듭니다. 이 개념은 단순히 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;
        }

..... 등 (모든 방법을 쓸 수 있습니다.)

이것은 익명 클래스 의 예입니다 . 누군가 가`` 아니요, 인터페이스를 인스턴스화 할 수 없습니다 ''라고 말하면 정확합니다. 그러나 당신은 결코 말할 수 없습니다. 당신은 CANT write List list = new List (); 하지만, 분명 당신은 그렇게 할 수 그것은 만들 수있는 하드 문입니다 당신은 할 수 없어 .


분명히하기 위해 실제 유형이 인 객체는 생성하지 않습니다 List. 오히려 이름이없고 구현하는 새 클래스를 선언하고 List런타임에 새로 선언 된 클래스의 새 객체를 만듭니다.
Radiodef

0

우리가 만든 소유즈-에 1 문제를 단순화하기 위해 : 변환하는 방법 XY(예 StringInteger). 그것을 구성하는 간단한 기능을 갖도록 종류의 변환과 같은 물체의 구축되고 Map, List, Set:

import io.thedocs.soyuz.to;

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

확인하십시오-다른 유용한 기능이 많이 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.