한 줄로 ArrayList 초기화

java collections arraylist initialization


테스트 목적으로 옵션 목록을 만들고 싶었습니다. 처음에 나는 이것을했다 :

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

그런 다음 코드를 다음과 같이 리팩터링했습니다.

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

더 좋은 방법이 있습니까?




Answer 1 coobird


실제로 ArrayList 를 초기화하는 "가장 좋은"방법 은 어떤 방식 으로든 새 List 를 만들 필요가 없기 때문에 작성한 방법입니다.

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

list 인스턴스 를 참조하려면 약간의 타이핑이 필요하다는 것 입니다.

인스턴스 이니셜 라이저 ( "중괄호 초기화"라고도 함)를 사용하여 익명의 내부 클래스를 만드는 것과 같은 대안이 있습니다.

ArrayList<String> list = new ArrayList<String>() {{
    add("A");
    add("B");
    add("C");
}};

그러나, 당신이 끝내는 것은 인스턴스 이니셜 라이저가있는 ArrayList 의 서브 클래스이며 , 그 클래스는 하나의 객체를 만들기 위해 만들어 지기 때문에 너무 좋아하지 않습니다 . .

좋은 점은 Project Coin 에 대한 Collection Literals 제안 이 수락 된 경우였습니다 (Java 7에서 도입 될 예정이지만 Java 8에도 포함될 가능성은 없습니다).

List<String> list = ["A", "B", "C"];

불행히도 ArrayList 가 아닌 불변의 List 를 초기화 할 것이므로 여기에서는 도움이되지 않으며 , 더 이상 사용할 수 없다면 아직 사용할 수 없습니다.




Answer 2 Tom


List 로 선언하면 더 간단 합니다. ArrayList 여야합니까?

List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");

또는 하나의 요소 만있는 경우 :

List<String> places = Collections.singletonList("Buenos Aires");

즉, places변경할 수 없습니다 (변경하려고하면 UnsupportedOperationException 예외가 발생 함).

구체적인 ArrayList 인 가변 목록을 만들려면 불변 목록에서 ArrayList 를 만들 수 있습니다 .

ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));



Answer 3 Christoffer Hammarström


간단한 대답

에서 자바 9 이상, 이후 List.of() 추가되었습니다

List<String> strings = List.of("foo", "bar", "baz");

함께 자바 10 이상 또는,이은으로 단축 할 수 var 에 키워드.

var strings = List.of("foo", "bar", "baz");

이것은 당신에게 불변 인 List 을 줄 것이므로 변경할 수 없습니다.
당신이 그것을 미리 채우는 대부분의 경우에 당신이 원하는 것입니다.


Java 8 이하 :

List<String> strings = Arrays.asList("foo", "bar", "baz");

이것은 배열에 의해 지원되는 List 를 제공 하므로 길이를 변경할 수 없습니다.
그러나 List.set 을 호출 할 수 있으므로 여전히 변경 가능 합니다.


정적 가져 오기로 Arrays.asList 를 더 짧게 만들 수 있습니다 .

List<String> strings = asList("foo", "bar", "baz");

정적 가져 오기 :

import static java.util.Arrays.asList;  

최신 IDE가 자동으로 제안하고 자동으로 수행합니다.
예를 들어 IntelliJ IDEA에서 Alt+Enter 를 누르고 Static import method... 선택하십시오 .


그러나 List.of 메서드를 of 로 줄이는 것은 혼동되기 때문에 권장하지 않습니다 .
List.of 는 이미 충분히 짧고 잘 읽 힙니다.


사용하여 Stream

List 여야 합니까?
Java 8 이상 에서는보다 유연한 Stream 을 사용할 수 있습니다 .

Stream<String> strings = Stream.of("foo", "bar", "baz");

Stream 을 연결할 수 있습니다 .

Stream<String> strings = Stream.concat(Stream.of("foo", "bar"),
                                       Stream.of("baz", "qux"));

또는 Stream 에서 List 이동할 수 있습니다 .

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

List<String> strings = Stream.of("foo", "bar", "baz").collect(toList());

그러나 바람직하게는 StreamList 로 수집하지 않고 사용하십시오 .


당신이 경우 정말 특별히 필요 java.util.ArrayList

(아마도 아닐 것입니다.)
JEP 269 (강조 광산) 를 인용하려면 :

작은 설정 값을 미리 정의 된 집합으로 변경 가능한 콜렉션 인스턴스를 초기화 사용 사례는. 일반적으로 사전 정의 된 값을 변경할 수없는 콜렉션에두고 복사 생성자를 통해 변경 가능한 콜렉션을 초기화하는 것이 좋습니다.


당신이 원하는 경우 모두 미리 채울 ArrayList하고 나중에 그것을 추가 (왜?), 사용

ArrayList<String> strings = new ArrayList<>(List.of("foo", "bar"));
strings.add("baz");

또는 Java 8 이하에서 :

ArrayList<String> strings = new ArrayList<>(asList("foo", "bar"));
strings.add("baz");

또는 Stream 사용 :

import static java.util.stream.Collectors.toCollection;

ArrayList<String> strings = Stream.of("foo", "bar")
                             .collect(toCollection(ArrayList::new));
strings.add("baz");

그러나 다시 StreamList 로 수집하는 대신 직접 사용하는 것이 좋습니다 .


구현이 아닌 인터페이스에 대한 프로그램

당신은 당신이 같은 목록 선언했습니다 말했다 ArrayList 의 코드에서,하지만 당신은 어떤 멤버 사용하는 경우에만 그렇게해야 ArrayList 의 에없는 List .

당신이하지 않을 가능성이 가장 높습니다.

일반적으로 사용할 가장 일반적인 인터페이스 (예 : Iterable , Collection 또는 List )로 변수를 선언 하고 특정 구현 (예 : ArrayList , LinkedList 또는 Arrays.asList() ) 으로 변수를 초기화해야합니다 .

그렇지 않으면 코드를 특정 유형으로 제한하므로 원하는 때 변경하기가 더 어려워집니다.

예를 들어, ArrayListvoid method(...) 전달하는 경우 :

// Iterable if you just need iteration, for (String s : strings):
void method(Iterable<String> strings) { 
    for (String s : strings) { ... } 
}

// Collection if you also need .size(), .isEmpty(), or .stream():
void method(Collection<String> strings) {
    if (!strings.isEmpty()) { strings.stream()... }
}

// List if you also need .get(index):
void method(List<String> strings) {
    strings.get(...)
}

// Don't declare a specific list implementation
// unless you're sure you need it:
void method(ArrayList<String> strings) {
    ??? // You don't want to limit yourself to just ArrayList
}

또 다른 예 는 보통 FileInputStream 또는 BufferedInputStream 이더라도 항상 InputStream 변수를 선언하는 것입니다. 언젠가 당신이나 다른 누군가가 다른 종류의 InputStream 을 사용하기를 원하기 때문 입니다.




Answer 4 Randyaa


간단한 크기 목록 1이 필요한 경우 :

List<String> strings = new ArrayList<String>(Collections.singletonList("A"));

여러 객체의 목록이 필요한 경우 :

List<String> strings = new ArrayList<String>();
Collections.addAll(strings,"A","B","C","D");



Answer 5 Paweł Adamski


구아바 를 사용하면 다음과 같이 작성할 수 있습니다.

ArrayList<String> places = Lists.newArrayList("Buenos Aires", "Córdoba", "La Plata");

구아바에는 다른 유용한 정적 생성자도 있습니다. 당신은 여기 에 대해 읽을 수 있습니다 .