오늘은 LinkedHashSet, List.stream().distinct()의 차이점과 성능을 비교해보겠습니다.
먼저 이러한 고민을 하게된 계기는 다음과 같습니다.
이름+날짜(yyyymmddhhss) 로 구성된 List<String> 구조가 있을때,
policy번째 날짜를 반환하고 싶습니다.여기서 2번을 해결하기 위해 Java의 Set을 사용하는 방법, Stream의 distinct() + sorted()를 사용하는 방법을 떠올렸고, 이 두 자료구조의 각각의 특성을 고려하여 Set(또는 LinkedHashSet)을 쓰고자 합니다.
리스트의 크기는 최소 1개에서 최대 100개 (평균 10개 미만)이고, 중복이 제거된 날짜는 약 3-4개 라고 가정하면 이 두가지 방법은 큰 차이가 없을 것 같습니다.
그러나 순수하게 본인의 찝찝함 때문에 이 부분을 정확하게 알고 지나가면 좋을 것 같아 작성하게 되었습니다.
LinkedHashSet과 List.stream().distinct()는 중복 요소를 제거하는 데에는 비슷한 결과를 제공하지만, 성능 측면에서는 약간의 차이가 있을 수 있습니다.
Set & LinkedHashSet
LinkedHashSet은 내부적으로 해시 테이블을 사용하여 중복 요소를 효율적으로 제거합니다.
List.stream().distinct()
List.stream().distinct()는 스트림을 생성하고 중복을 제거한 다음 새로운 스트림을 반환합니다.
중복을 제거하는 과정에서 내부적으로 중복된 요소를 비교하기 때문에 상대적으로 오버헤드가 크며, 요소 수가 많을수록 성능이 저하될 수 있습니다.
순서가 보장되지 않습니다.
일반적으로 LinkedHashSet이 더 성능이 우수합니다. 특히 중복 제거가 빈번하게 발생하고 요소의 순서가 중요한 경우에는 LinkedHashSet을 사용하는 것이 좋습니다. 하지만 상황에 따라서는 List.stream().distinct()가 코드의 가독성과 일관성 측면에서 더 선호될 수 있습니다.
(종합적으로 어떤 것이 더 성능이 좋을지 결정하기 위해서는 실제 상황에서의 테스트가 필요할 수 있습니다.)