1. 개요

Java를 사용하면 고정된 크기의 배열을 만들거나 컬렉션 클래스를 사용하여 유사한 작업을 수행할 수 있습니다.

이 예제에서는 ArrayList 의 용량 과 Array의 크기의 차이를 살펴보겠습니다 .

또한 ArrayList 를 용량으로 초기화해야 하는 경우와 메모리 사용 측면에서 장단점을 살펴보겠습니다 .

2. 예

차이점을 이해하기 위해 먼저 두 옵션을 모두 시도해 보겠습니다.

2.1. 배열의 크기

자바에서는 배열의 새 인스턴스를 생성하는 동안 배열의 크기를 지정하는 것이 필수입니다.

Integer[] array = new Integer[100]; 
System.out.println("Size of an array:" + array.length);

여기서, 우리는 생성 된 I nteger의 아래의 산출 결과의 크기 (100)의 배열을,

배열 크기:100

2.2. ArrayList의 용량

이제 초기 용량이 100인 ArrayList 생성해 보겠습니다 .

List<Integer> list = new ArrayList<>(100);
System.out.println("Size of the list is :" + list.size());
List의 크기는 0입니다.

아직 추가된 요소가 없으므로 크기는 0입니다.

이제 List에 요소를 추가하고 크기를 확인하겠습니다.

list.add(10);
System.out.println("Size of the list is :" + list.size());
List의 크기는 1입니다.

3. 배열의 크기와 ArrayList의 비교

다음은 배열의 크기와 ArrayList 의 용량 간의 몇 가지 주요 차이점 입니다.

3.1. 사이즈 수정

배열은 고정 크기입니다. 크기로 일부 int 값을 사용하여 배열을 초기화하면 변경할 수 없습니다. 크기와 용량도 동일합니다.

ArrayList 의 크기와 용량은 고정되어 있지 않습니다. List의 논리적 크기는 List에 있는 요소의 삽입 및 제거에 따라 변경됩니다. 이는 물리적 스토리지 크기와 별도로 관리됩니다. 또한 ArrayList 용량의 임계값에도달하면 더 많은 요소를 위한 공간을 만들기 위해 용량이 증가합니다.

3.2. 메모리 할당

어레이 메모리는 생성 시 할당됩니다. 배열을 초기화할 때 배열의 크기와 유형에 따라 메모리를 할당합니다. 참조 유형의 경우 null 값과 기본 유형의 경우 기본값으로 모든 요소를 ​​초기화합니다 .

ArrayList 는 성장함에 따라 메모리 할당을 변경합니다. ArrayList 를 초기화하는 동안 용량을 지정하면 해당 용량까지 객체를 저장할 수 있는 충분한 메모리가 할당됩니다. 논리적 크기는 0으로 유지됩니다. 용량을 확장할 때가 되면 더 큰 새 어레이가 생성되고 값이 여기에 복사됩니다.

우리는 빈 ArrayList 객체를 위한 특별한 싱글톤 0 크기 배열이 있다는 점에 주목해야 합니다 . 따라서 생성 비용이 매우 저렴합니다. ArrayList가 내부적으로 Object 참조 배열을 사용 한다는 점도 주목할 가치가 있습니다.

4. 용량으로 ArrayList 를 초기화할 때

ArrayList 를 생성하기 전에 필요한 크기를 알면 ArrayList 의 용량을 초기화할 것으로 예상할 수 있지만 일반적으로 필요한 것은 아닙니다. 그러나 이것이 최선의 선택이 될 수 있는 몇 가지 이유가 있습니다.

4.1. ArrayList 만들기

List이 커질 것이라는 것을 알면 초기 용량으로 List을 초기화하는 것이 좋습니다. 이것은 요소를 추가할 때 비용이 많이 드는 일부 성장 작업을 방지합니다.

마찬가지로 List이 매우 큰 경우 자동 확장 작업은 정확한 최대 크기에 필요한 것보다 더 많은 메모리를 할당할 수 있습니다. 지금까지의 크기에 대한 비율로 매번 증가하는 양이 계산되기 때문입니다. 따라서 List이 크면 메모리 낭비가 발생할 수 있습니다.

4.2. 건물 작은 복수 의 ArrayList

작은 컬렉션이 많은 경우 ArrayList 의 자동 용량 은 낭비되는 메모리의 상당 부분을 제공할 수 있습니다. ArrayList 가 더 적은 수의 요소가 있는 10 크기를 선호하지만 2 또는 3만 저장 한다고 가정해 보겠습니다. 이는 70%의 메모리 낭비를 의미하며, 이는 이러한 List이 많은 경우 중요할 수 있습니다.

용량을 미리 설정하면 이러한 상황을 피할 수 있습니다.

5. 낭비 방지

우리는주의해야한다  ArrayList를이 랜덤 액세스를 지원하는 오브젝트의 유연한 크기의 용기에 대한 좋은 솔루션입니다. 배열보다 약간 더 많은 메모리를 소비하지만 더 풍부한 작업 집합을 제공합니다.

일부 사용 사례, 특히 원시 값의 대규모 컬렉션 주변에서는 표준 배열이 더 빠르고 메모리를 덜 사용할 수 있습니다.

마찬가지로 인덱스로 액세스할 필요가 없는 가변 수의 요소를 저장하는 경우 LinkedList 가 더 성능이 좋을 수 있습니다. 메모리 관리 오버헤드가 발생하지 않습니다.

6. 요약

이 짧은 기사에서 우리는 ArrayList  의 용량 과 배열의 크기의 차이를 보았습니다 . 또한 ArrayList 를 용량으로 초기화해야 하는 경우 와 메모리 사용량 및 성능과 관련된 이점도 살펴보았습니다 .

항상 그렇듯이 예제 코드는 GitHub 에서 사용할 수 있습니다 .

Junit footer banner