본문 바로가기

개발/JAVA

[Java] 리스트 비교 성능 최적화

반응형

리스트의 원소 비교는 자주 사용되는 작업 중 하나입니다. 이 글에서는 `validates`와 `values` 리스트의 비교 방법을 소개하고, 각각의 성능 차이를 분석합니다.

리스트 비교 방법 3가지

다음은 `values` 리스트의 모든 값이 `validates` 리스트에 포함되는지 확인하는 3가지 방법입니다. 각 방법은 동일한 결과를 반환하지만 성능에서 차이가 있습니다.

1. `values.stream().allMatch(validates::contains)`

첫 번째 방법은 `stream()`을 사용하여 `values`의 각 항목에 대해 `validates.contains()`를 호출하는 방식입니다. 이 방식은 리스트의 크기가 커질수록 성능이 떨어질 수 있습니다.

String validateValue = "apple;banana;cherry"; // validates 리스트에 들어갈 값
String value = "apple;banana"; // values 리스트에 들어갈 값
List validates = Arrays.asList(validateValue.split(";"));
List values = value.contains(";") ? Arrays.asList(value.split(";")) : null;
if (values != null && values.stream().allMatch(validates::contains)) {
return true; // values의 모든 원소가 validates에 포함되면 true
} else {
return false;
}

2. `validates.containsAll(values)`

두 번째 방법은 `containsAll()` 메소드를 사용하는 방법입니다. 이 방법도 내부적으로 `validates.contains()`를 반복 호출하므로 성능은 첫 번째 방법과 유사합니다.

String validateValue = "apple;banana;cherry"; // validates 리스트에 들어갈 값
String value = "apple;banana"; // values 리스트에 들어갈 값
List validates = Arrays.asList(validateValue.split(";"));
List values = value.contains(";") ? Arrays.asList(value.split(";")) : null;
if (values != null && validates.containsAll(values)) {
return true; // values의 모든 원소가 validates에 포함되면 true
} else {
return false;
}

3. `new HashSet<>(validates).containsAll(values)`

세 번째 방법은 `validates`를 `HashSet`으로 변환한 후, `containsAll()`을 사용하는 방법입니다. `HashSet`은 원소를 빠르게 찾을 수 있기 때문에 이 방법이 가장 효율적입니다.

String validateValue = "apple;banana;cherry"; // validates 리스트에 들어갈 값
String value = "apple;banana"; // values 리스트에 들어갈 값
List validates = Arrays.asList(validateValue.split(";"));
List values = value.contains(";") ? Arrays.asList(value.split(";")) : null;
if (values != null && new HashSet<>(validates).containsAll(values)) {
return true; // values의 모든 원소가 validates에 포함되면 true
} else {
return false;
}

성능 분석

각 방법의 성능 차이는 리스트의 크기가 커질수록 더 두드러집니다.

  • `values.stream().allMatch(validates::contains)`: 시간 복잡도는 `O(m * n)`입니다. `values`의 각 항목에 대해 `validates.contains()`를 호출하므로 성능이 떨어질 수 있습니다.
  • `validates.containsAll(values)`: 시간 복잡도는 `O(m * n)`입니다. 이 방법도 내부적으로 `contains`를 호출하므로 성능이 유사합니다.
  • `new HashSet<>(validates).containsAll(values)`: 시간 복잡도는 `O(m + n)`입니다. `HashSet`을 사용하여 원소를 빠르게 찾을 수 있어 가장 효율적입니다.

이 글에서는 리스트 비교의 성능 차이를 살펴보았습니다. 성능이 중요한 경우 `HashSet`을 사용하는 방법을 권장합니다.

반응형