HashSet과 ArrayList는 Java Collection 프레임워크에서 가장 널리 사용되는 핵심 클래스입니다. 두 컬렉션은 데이터를 저장하고 관리한다는 공통점이 있지만, 내부 동작 방식과 사용 목적이 크게 다릅니다.
아래 표는 ArrayList와 HashSet의 주요 차이점을 정리한 것입니다.
ArrayList와 HashSet의 주요 차이점
| 번호 | 구분 | ArrayList | HashSet |
|---|---|---|---|
| 1 | 구현 방식 | List 인터페이스를 구현한 클래스입니다. | Set 인터페이스를 구현한 클래스입니다. |
| 2 | 내부 구조 | 내부적으로 배열(Array)을 기반으로 동작합니다. | 내부적으로 HashMap을 이용해 구현되어 있습니다. |
| 3 | 요소 순서 | 삽입 순서(insertion order)를 그대로 유지합니다. | 순서를 보장하지 않는 무순서(unordered) 컬렉션입니다. |
| 4 | 중복 허용 | 컬렉션 내에 중복된 값을 저장할 수 있습니다. | 중복 요소를 허용하지 않으며, 동일한 값은 한 번만 저장됩니다. |
| 5 | 인덱스 접근 | 인덱스 기반으로 동작하며, get(index)으로 요소를 조회하거나 remove(index)로 삭제할 수 있습니다. | 객체 자체를 기반으로 동작하며 get() 메서드를 제공하지 않습니다. |
| 6 | null 허용 | 제한 없이 여러 개의 null 값을 저장할 수 있습니다. | null 값은 최대 하나만 허용되며, 이후에는 추가할 수 없습니다. |
ArrayList 사용 예제
JavaTester.java
import java.io.*;
import java.util.*;
public class JavaTester {
public static void main(String[] args) throws IOException{
int n = 5;
List<Integer> al = new ArrayList<>(n);
for (int i = 1; i <= n; i++) {
al.add(i);
}
System.out.println(al);
al.remove(3);
System.out.println(al);
for (int i = 0; i < al.size(); i++) {
System.out.print(al.get(i) + " ");
}
}
}
실행 결과
[1, 2, 3, 4, 5] [1, 2, 3, 5] 1 2 3 5
위 예제에서 볼 수 있듯이 ArrayList는 요소가 삽입된 순서를 그대로 유지하며, 인덱스를 통해 특정 위치의 요소에 바로 접근할 수 있습니다.
HashSet 사용 예제
JavaTester.java
import java.util.HashSet;
import java.util.Set;
public class JavaTester {
public static void main(String[] args){
Set<Integer> hs = new HashSet<>();
hs.add(1);
hs.add(2);
hs.add(3);
hs.add(4);
hs.add(4);
for (Integer temp : hs) {
System.out.print(temp + " ");
}
}
}
실행 결과
1 2 3 4
위 예제에서 값 4를 두 번 추가했지만 출력 결과에는 한 번만 나타납니다. 이는 HashSet이 중복을 허용하지 않기 때문입니다.
어떤 상황에서 무엇을 사용해야 할까?
ArrayList는 요소의 순서가 중요하거나, 인덱스를 통한 빠른 조회가 필요하고, 중복 데이터를 허용해야 하는 경우에 적합합니다. 반면 HashSet은 중복 없이 고유한 값만 관리해야 하거나, 순서보다 빠른 검색 성능(평균 O(1))이 중요한 경우에 더 적합합니다.