> Java > java지도 시간 > [코드 비교] ArrayList와 Collections.singletonList 비교

[코드 비교] ArrayList와 Collections.singletonList 비교

WBOY
풀어 주다: 2024-08-06 13:20:50
원래의
426명이 탐색했습니다.

[Code Compare] ArrayList vs Collections.singletonList

동일한 기능을 코딩하는 다양한 방법을 비교하기 위해 새 스레드를 시작합니다. 이 게시물에서는 요소가 하나만 있는 간단한 목록을 만드는 두 가지 일반적인 방법을 비교해 보겠습니다. 특히 가장 일반적으로 사용되는 List 구현 생성자와 단일 요소를 포함하는 불변 목록을 생성하기 위한 간단한 팩토리 메소드인 Collections.singletonList를 살펴보겠습니다.

배열 목록

초기 용량을 지정하지 않고 ArrayList를 초기화할 때마다 빈 배열로 시작됩니다. 첫 번째 요소를 추가하면 ArrayList는 배열 복사와 관련된 상대적으로 어려운 알고리즘을 사용하여 크기를 조정합니다. ArrayList 구조를 살펴보겠습니다.

  private static final int DEFAULT_CAPACITY = 10;
  private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

  public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  }

  public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
  }

  private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    size = s + 1;
  }

  private Object[] grow() {
      return grow(size + 1);
  }

  private Object[] grow(int minCapacity) {
    return elementData = Arrays.copyOf(elementData,
                                      newCapacity(minCapacity));
  }

  private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity <= 0) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return minCapacity;
    }
    return (newCapacity - MAX_ARRAY_SIZE <= 0)
        ? newCapacity
        : hugeCapacity(minCapacity);
  }
로그인 후 복사

단계별 진행 상황은 다음과 같습니다.

  1. 초기 빈 배열 elementData가 생성됩니다.
  2. 첫 번째 요소를 추가하면 현재 크기(0)가 배열 길이와 비교됩니다.
  3. 크기가 0이라는 것을 알았으므로 새 요소를 수용하기 위해 배열을 늘려야 합니다.
  4. 새 용량을 계산하는 성장 메소드가 호출됩니다.
  5. newCapacity는 처음에 이전 용량의 절반으로 증가하므로 0 + 0/2 = 0이 됩니다.
  6. newCapacity가 요소를 수용하기에 충분하지 않기 때문에 계속됩니다.
  7. elementData가 동일한 초기 빈 배열임을 확인하고 마침내 필요한 크기(1)와 DEFAULT_CAPACTIY(10) 사이의 최대값을 반환하여 크기 10의 배열이 생성됩니다.

항상 단일 요소를 포함하는 간단한 목록만 필요한 경우 이 크기 조정 프로세스는 매우 복잡합니다.

그러면 우리의 대안에 대해 이야기해 볼까요!

컬렉션::singletonList

메소드 서명:

공개 정적 목록 싱글턴리스트(T o)

설명

이 메소드는 지정된 객체만 포함하는 변경 불가능한 목록을 반환합니다. Java 1.3에 도입된 SingletonList에는 다음과 같은 몇 가지 장점이 있습니다.

  1. 인라인 구현: 한 줄에 원하는 요소로 초기화할 수 있습니다.
  2. 불변성: 구현을 살펴보겠습니다.

    private static class SingletonList<E> extends AbstractList<E>
        implements RandomAccess, Serializable {
    
      private final E element;
    
      SingletonList(E obj) {
        element = obj;
      }
      ...
    }
    
    로그인 후 복사

    SingletonList가 상속하는 AbstractList는 다음과 같이 변경 가능한 모든 메서드를 정의합니다.

      public boolean add(E e) {
        add(size(), e);
        return true;
      }
    
      public void add(int index, E element) {
        throw new UnsupportedOperationException();
      }
    
      public E remove(int index) {
        throw new UnsupportedOperationException();
      }
    
      public E set(int index, E element) {
          throw new UnsupportedOperationException();
      }
    
    로그인 후 복사

    이렇게 하면 목록의 크기나 단일 요소의 내용을 변경하는 것이 불가능해집니다.

    불변성은 매우 유리한 기능입니다. 여기서 자세히 다루지는 않겠지만 관심 있는 개발자는 이 기사에서 자세한 내용을 알아볼 수 있습니다.

  3. 메모리 할당: SingletonList 클래스에는 단일 요소를 수용하기 위한 하나의 단순 필드만 포함되어 있습니다. ArrayList는 간단한 ArrayList 단순 생성자를 사용하여 배열을 남기는 배열을 사용합니다. 요소 추가 후 크기가 10입니다.

  4. CPU 사용량: SingletonList 생성자는 단일 요소를 매개변수로 허용하므로 크기 조정, 배열 복사 또는 조작이 필요하지 않습니다. 이는 ArrayList 추가 방법에 비해 훨씬 더 효율적입니다.

결론

이 게시물에서는 ArrayListconstructor와 Collection.singletonList 메서드를 사용하여 단일 요소로 간단한 목록을 만드는 두 가지 방법을 비교했습니다. ArrayList는 유연하고 일반적으로 사용되는 데이터 구조이지만, 특히 요소를 추가할 때 메모리 할당 및 CPU 사용량 측면에서 불필요한 오버헤드가 발생합니다. 이 오버헤드에는 배열 크기 조정 및 복사가 포함되며, 이는 하나의 요소만 보유하는 목록에 대해 중복될 수 있습니다. 하지만 이 요소를 변경해야 한다면 ArrayList가 적합한 솔루션입니다.

반면 Collection.singletonList는 단일 요소 목록을 생성하는 데 더 효율적인 대안을 제공합니다. 이 방법은 더 간결하고 사용하기 쉬울 뿐만 아니라 불변성을 보장하므로 많은 시나리오에서 중요한 이점이 될 수 있습니다. ArrayList에 비해 메모리 공간이 최소화되고 CPU 리소스가 거의 필요하지 않습니다.

요약하자면, 하나의 요소만 포함하는 간단하고 변경 불가능한 목록의 경우 효율성, 단순성 및 불변성으로 인해 Collection.singletonList가 탁월한 선택입니다. 그러나 목록의 요소를 수정해야 하는 경우 ArrayList를 선택하는 것이 더 적절할 수 있습니다.

다음 게시물에서는 단일 요소 목록에 대한 또 다른 대안인 List.of 팩토리 메소드를 비교해 보겠습니다. 나중에 봐요!

위 내용은 [코드 비교] ArrayList와 Collections.singletonList 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿