동일한 기능을 코딩하는 다양한 방법을 비교하기 위해 새 스레드를 시작합니다. 이 게시물에서는 요소가 하나만 있는 간단한 목록을 만드는 두 가지 일반적인 방법을 비교해 보겠습니다. 특히 가장 일반적으로 사용되는 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); }
단계별 진행 상황은 다음과 같습니다.
항상 단일 요소를 포함하는 간단한 목록만 필요한 경우 이 크기 조정 프로세스는 매우 복잡합니다.
그러면 우리의 대안에 대해 이야기해 볼까요!
공개 정적 이 메소드는 지정된 객체만 포함하는 변경 불가능한 목록을 반환합니다. Java 1.3에 도입된 SingletonList에는 다음과 같은 몇 가지 장점이 있습니다. 불변성: 구현을 살펴보겠습니다. SingletonList가 상속하는 AbstractList는 다음과 같이 변경 가능한 모든 메서드를 정의합니다. 이렇게 하면 목록의 크기나 단일 요소의 내용을 변경하는 것이 불가능해집니다. 불변성은 매우 유리한 기능입니다. 여기서 자세히 다루지는 않겠지만 관심 있는 개발자는 이 기사에서 자세한 내용을 알아볼 수 있습니다. 메모리 할당: SingletonList 클래스에는 단일 요소를 수용하기 위한 하나의 단순 필드만 포함되어 있습니다. ArrayList는 간단한 ArrayList 단순 생성자를 사용하여 배열을 남기는 배열을 사용합니다. 요소 추가 후 크기가 10입니다. CPU 사용량: SingletonList 생성자는 단일 요소를 매개변수로 허용하므로 크기 조정, 배열 복사 또는 조작이 필요하지 않습니다. 이는 ArrayList 추가 방법에 비해 훨씬 더 효율적입니다. 이 게시물에서는 ArrayListconstructor와 Collection.singletonList 메서드를 사용하여 단일 요소로 간단한 목록을 만드는 두 가지 방법을 비교했습니다. ArrayList는 유연하고 일반적으로 사용되는 데이터 구조이지만, 특히 요소를 추가할 때 메모리 할당 및 CPU 사용량 측면에서 불필요한 오버헤드가 발생합니다. 이 오버헤드에는 배열 크기 조정 및 복사가 포함되며, 이는 하나의 요소만 보유하는 목록에 대해 중복될 수 있습니다. 하지만 이 요소를 변경해야 한다면 ArrayList가 적합한 솔루션입니다. 반면 Collection.singletonList는 단일 요소 목록을 생성하는 데 더 효율적인 대안을 제공합니다. 이 방법은 더 간결하고 사용하기 쉬울 뿐만 아니라 불변성을 보장하므로 많은 시나리오에서 중요한 이점이 될 수 있습니다. ArrayList에 비해 메모리 공간이 최소화되고 CPU 리소스가 거의 필요하지 않습니다. 요약하자면, 하나의 요소만 포함하는 간단하고 변경 불가능한 목록의 경우 효율성, 단순성 및 불변성으로 인해 Collection.singletonList가 탁월한 선택입니다. 그러나 목록의 요소를 수정해야 하는 경우 ArrayList를 선택하는 것이 더 적절할 수 있습니다. 다음 게시물에서는 단일 요소 목록에 대한 또 다른 대안인 List.of 팩토리 메소드를 비교해 보겠습니다. 나중에 봐요! 위 내용은 [코드 비교] ArrayList와 Collections.singletonList 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
설명
private static class SingletonList<E> extends AbstractList<E>
implements RandomAccess, Serializable {
private final E element;
SingletonList(E obj) {
element = obj;
}
...
}
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();
}
결론