* 아래 링크를 참고하여 번역 및 추가 정리 하였습니다.
https://www.geeksforgeeks.org/collections-in-java-2/
https://www.geeksforgeeks.org/java-util-vector-class-java/
1. ArrayList
ArrayList는 Java의 Collection 프레임워크 중 하나로, java.util
패키지에 존재한다. 동적인 배열을 지원하며 표준 배열보다 느리지만 array의 원소 추가/삭제 등 조작이 많이 필요하는 경우 유용하게 사용된다.
1) 특징
- ArrayList는
AbstractList
클래스를 상속받고List
인터페이스를 구현한다. - ArrayList는 처음에 크기가 지정되어 있지만 collection에서 객체를 추가/삭제 함에 따라 크기가 자동으로 증가/감소한다.
- 리스트의 원소에 랜덤하게 접근할 수 있다.
- ArrayList는 int, char과 같은 primitive type을 사용할 수 없으며 Integer, Character과 같은 wrapper class를 사용해야 한다.
- C++에서의 Vector와 비슷하다.
- ArrayList는 동기화되어 있지 않다. Java에서 동기화된 collection은
Vector
이다.
// ArrayList
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
}
2) 생성자(Constructors)
1. ArrayList()
기본 생성자는 비어있는 ArrayList를 생성한다.
ArrayList arr = new ArrayList();
// 예시
ArrayList<Integer> arr = new ArrayList<Integer>();
2. ArrayList(Collection c)
ArrayList를 Collection c의 원소들로 초기화한다. 이미 존재하는 Collection c의 원소들을 포함시키고 싶을 경우 사용할 수 있다.
ArrayList arr = new ArrayList(c);
// 예시
Set<Integer> set = new HashSet<>();
set.add(10);
set.add(29);
List<Integer> list1 = new ArrayList<>(set); // 초기화
set.add(17);
List<Integer> list2 = new ArrayList<>(set); // 초기화
System.out.println(set.toString()); // 17, 10, 29
System.out.println(list1.toString()); // 10, 29
System.out.println(list2.toString()); // 17, 10, 29
2. ArrayList(int capacity)
초기 사이즈가 지정된 ArrayList를 생성하기 위해 사용된다.
ArrayList arr = new ArrayList(N);
3. Vector
Vector 클래스는 java.util
패키지에 속해있고, List 인터페이스를 구현했기 때문에 List 인터페이스에 있는 모든 메소드들을 사용가능하다. 원래는 레거시 클래스였지만 현재는 자바의 collection과 모두 호환가능하다.
1) 특징
- ArrayList와 매우 흡사하지만 Vector는 collection에 속하지 않는 몇몇 레거시 메서드들의 경우 동기화되어 있다.
- 동기화 되어있기 때문에 non-thread 환경에서는 잘 사용되지 않으며 추가,검색,삭제,수정 등의 이벤트 속도가 느리다.
- 동시에 수정될 경우 ConcurrentModificationException이 발생한다.
- 벡터 용량 증가
- increment가 정해지지 않을 경우, vector는 각 할당 주기에서 두 배씩 증가한다.
2) 생성자
2-1) new Vector()
자바에서 설정된 기본 세팅으로 벡터가 생성된다. initialCapacity는 10으로 설정되고, capacityIncrement는 0으로 설정된다.
- initialCapacity
- 벡터의 초기 용량(default : 10)
- 0보다 작게 설정될 경우 IllegalArgumentException이 발생된다.
- capacityIncrement
- element가 추가되어 벡터의 capacity를 채웠을 때 늘어나게되는 크기(default : 0)
- capacityIncrement가 0 이하일 경우 현재 capacity의 두 배로 증가된다.
2-2) new Vector(Collection c)
ArrayList와 마찬가지로 기존에 있는 Collection의 원소들을 포함시키고 싶을 때 사용할 수 있는 방법이다.
List<String> list = new ArrayList<String>();
list.add("Apeach");
list.add("Ryan");
list.add("Muzi");
System.out.println(list.toString());
Vector<String> vector = new Vector<String>(list);
vector.add("Frodo");
System.out.println(vector.toString());
실제로 내부구현은 아래와 같이 되어있으며 Arrays.copyOf 메서드를 이용하여 입력받은 collection 파라미터를 복사한다. collection이 null일 경우 NullPointerException이 발생한다.
2-3) new Vector(int initialCapacity)
Vector의 초기 용량(initialCapacity)을 설정한다.
initialCapacity가 0보다 작게 설정될 경우 IllegalArgumentException이 발생된다.
Vector<Integer> vector = new Vector<>(7);
System.out.println(vector.size()); // 0 -> element 개수
System.out.println(vector.capacity()); // 7 -> 실제 할당된 용량
2-4) new Vector(int initialCapacity, int capacityIncrement)
초기 용량(initialCapacity)와 증가용량(capacityIncrement)를 설정한다. capacityIncrement를 따로 지정해주지 않은 생성자(1, 2, 3)에서는 기본값이 0으로 설정되며, capacityIncrement가 0 이하로 설정될 경우 vector의 element가 수용가능한 capacity만큼 차게되면 현재 용량의 두 배로 증가된다.
'백엔드' 카테고리의 다른 글
[Java] 왜 배열은 Covariant(공변)이고 제네릭은 Invariant(불공변)일까? (0) | 2022.07.22 |
---|---|
[Java] Covariant Return Type이란? (0) | 2022.07.15 |
[Java] Collection - 1. Collection Framework (0) | 2022.07.05 |
[Java] Collection.stream().forEach() 와 Collection.forEach() 의 차이 (0) | 2022.06.27 |
[Java] 2. Garbage Collection - GC의 과정 및 종류 (0) | 2022.06.24 |
댓글