source

어레이 초기화와 동등한 Array List 초기화

goodcode 2022. 9. 1. 23:13
반응형

어레이 초기화와 동등한 Array List 초기화

인스턴스화 중에 다음과 같이 어레이를 초기화할 수 있습니다.

String[] names = new String[] {"Ryan", "Julie", "Bob"};

Array List array 、 array array array array array array array array array array array array array array array array array array array? 내용을 요?array.add()

Arrays.asList는 다음을 지원합니다.

new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));

네.

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

하고 있는 은 ' 있다'는 '반'은 '반'을 만드는 것입니다.ArrayList<String>(바깥쪽 브레이스)세트는 이렇게 하고 나서 스태틱인테셜라이저(브레이스 안쪽 세트)를 선언합니다.이것은 실제로 포함된 클래스의 내부 클래스입니다. 그래서 암묵적으로this가비지 되는 경우가 않습니다.직렬화하거나 외부 클래스가 가비지 수집될 것으로 예상되지 않는 한 문제가 되지 않습니다.

Java 7은 사용자가 원하는 것을 정확하게 수행하기 위한 추가 언어 구성을 제공할 것으로 알고 있습니다.

편집: 최신 Java 버전은 이러한 컬렉션을 작성하기 위해 보다 유용한 기능을 제공합니다.이러한 버전보다 이전 버전에 대해 검토할 가치가 있습니다.

다음은 가장 가까운 정보입니다.

ArrayList<String> list = new ArrayList(Arrays.asList("Ryan", "Julie", "Bob"));

다음 기능으로 더욱 심플하게 할 수 있습니다.

List<String> list = Arrays.asList("Ryan", "Julie", "Bob")

Arrays.asList의 소스를 보면 ArrayList가 구축되지만 기본적으로는 List로 캐스트됩니다.따라서 다음 작업을 수행할 수 있습니다(단, 새로운 JDK의 경우 신뢰성이 떨어집니다).

ArrayList<String> list = (ArrayList<String>)Arrays.asList("Ryan", "Julie", "Bob")
Arrays.asList("Ryan", "Julie", "Bob");

Java에서는 목록에 대한 리터럴 구문이 없으므로 .add()를 수행해야 합니다.

요소가 많으면 좀 상세하지만 다음 중 하나를 선택할 수 있습니다.

  1. 그루비 같은 것을 사용하다
  2. Arrays.asList(어레이) 사용

2는 다음과 같습니다.

String[] elements = new String[] {"Ryan", "Julie", "Bob"};
List list = new ArrayList(Arrays.asList(elements));

이로 인해 불필요한 오브젝트가 생성됩니다.

은 '그러다'입니다ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));

단, 선택한 답변은 최종 어레이를 작성하기 전에 요소를 내부적으로 여러 번 복사하는 것이 중요합니다.또, 그 용장성의 일부를 삭감할 수 있는 방법이 있습니다.

먼저 무슨 일이 일어나고 있는지 이해하겠습니다.

  1. 이 .Arrays.ArrayList<T> 팩토리에 Arrays.asList(T...).

    은 produce음음음음음음음음음음음 as as as as as as as as as as 와 같은 .java.lang.ArrayList★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★에서는 '하다'와 같은 .remove(int)List 인터페이스가 있어도 상관없습니다.이 메서드를 호출하면, 이 메서드는,UnspportedMethodException다만, 고정 사이즈 리스트가 필요한 경우는, 여기서 정지할 수 있습니다.

  2. 그 다음에Arrays.ArrayList<T>#1에서 생성된 것이 생성자에게 전달됩니다.ArrayList<>(Collection<T>)어디서collection.toArray()method를 호출하여 복제합니다.

    public ArrayList(Collection<? extends E> collection) {
    ......
    Object[] a = collection.toArray();
    }
    
  3. 다음으로 컨스트럭터는 클론된 어레이를 채택할지 또는 서브클래스 타입을 삭제하기 위해 다시 복사할지를 결정합니다.부터Arrays.asList(T...)에서는 내부적으로 타입 T의 배열을 사용합니다.이는 파라미터와 동일하게 T가 순수 오브젝트가 아닌 한 컨스트럭터는 항상 클론 사용을 거부합니다.(예를 들어 문자열, 정수 등은 오브젝트를 확장하기 때문에 모두 다시 복사됩니다).

    if (a.getClass() != Object[].class) {      
        //Arrays.asList(T...) is always true here 
        //when T subclasses object
        Object[] newArray = new Object[a.length];
        System.arraycopy(a, 0, newArray, 0, a.length);
        a = newArray;
    }
    array = a;
    size = a.length;
    

따라서 데이터는 ArrayList를 명시적으로 초기화하기 위해 3x로 복사되었습니다.2배까지 줄일 수 있어요Arrays.AsList(T...)오브젝트 []어레이를 구축하여 ArrayList가 나중에 채택할 수 있도록 합니다.이 작업은 다음과 같습니다.

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

또는 생성 후 요소를 추가하는 것이 여전히 가장 효율적일 수 있습니다.

이건 어때?

ArrayList<String> names = new ArrayList<String>();
Collections.addAll(names, "Ryan", "Julie", "Bob");

op4j Java 라이브러리의 fluent 인터페이스를 사용하는 방법은 다음과 같습니다. (1.1은 2010년 12월에 출시되었습니다.) :-

List<String> names = Op.onListFor("Ryan", "Julie", "Bob").get();

아주 멋진 도서관으로 많은 시간을 절약할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2760995/arraylist-initialization-equivalent-to-array-initialization

반응형