Set, LinkedHashSet vs List.stream().distinct()

오영선·2024년 5월 3일

실습

목록 보기
10/12

오늘은 LinkedHashSet, List.stream().distinct()의 차이점과 성능을 비교해보겠습니다.

먼저 이러한 고민을 하게된 계기는 다음과 같습니다.
이름+날짜(yyyymmddhhss) 로 구성된 List<String> 구조가 있을때,

  1. 이 배열에서 날짜만 파싱하고
  2. 날짜를 중복제거하여 정렬한 다음
  3. policy번째 날짜를 반환하고 싶습니다.

여기서 2번을 해결하기 위해 Java의 Set을 사용하는 방법, Stream의 distinct() + sorted()를 사용하는 방법을 떠올렸고, 이 두 자료구조의 각각의 특성을 고려하여 Set(또는 LinkedHashSet)을 쓰고자 합니다.

환경

리스트의 크기는 최소 1개에서 최대 100개 (평균 10개 미만)이고, 중복이 제거된 날짜는 약 3-4개 라고 가정하면 이 두가지 방법은 큰 차이가 없을 것 같습니다.
그러나 순수하게 본인의 찝찝함 때문에 이 부분을 정확하게 알고 지나가면 좋을 것 같아 작성하게 되었습니다.

LinkedHashSet과 List.stream().distinct()는 중복 요소를 제거하는 데에는 비슷한 결과를 제공하지만, 성능 측면에서는 약간의 차이가 있을 수 있습니다.

Set & LinkedHashSet
LinkedHashSet은 내부적으로 해시 테이블을 사용하여 중복 요소를 효율적으로 제거합니다.

  • 중복을 제거한 후에도 요소의 순서를 유지합니다.
  • 요소의 수가 적을수록 좋은 성능을 보이는 경향이 있습니다.
    LinkedHashSet은 equals() 랑 hashcode()를 사용해 객체의 중복 여부를 판단하니, Set에 담는 객체에 equals를 잘 구현해주는 것이 중요합니다
    참고자료 : https://st-lab.tistory.com/258

List.stream().distinct()
List.stream().distinct()는 스트림을 생성하고 중복을 제거한 다음 새로운 스트림을 반환합니다.
중복을 제거하는 과정에서 내부적으로 중복된 요소를 비교하기 때문에 상대적으로 오버헤드가 크며, 요소 수가 많을수록 성능이 저하될 수 있습니다.
순서가 보장되지 않습니다.

일반적으로 LinkedHashSet이 더 성능이 우수합니다. 특히 중복 제거가 빈번하게 발생하고 요소의 순서가 중요한 경우에는 LinkedHashSet을 사용하는 것이 좋습니다. 하지만 상황에 따라서는 List.stream().distinct()가 코드의 가독성과 일관성 측면에서 더 선호될 수 있습니다.

(종합적으로 어떤 것이 더 성능이 좋을지 결정하기 위해서는 실제 상황에서의 테스트가 필요할 수 있습니다.)

0개의 댓글