HashSet vs TreeSet vs LinkedHashSet on basis of adding duplicate value

后端 未结 4 871
南旧
南旧 2020-12-23 20:55

I am learning heart of core java i.e. Collections. I would like to know what happens internally when we add duplicate element in HashSet, Tre

4条回答
  •  醉话见心
    2020-12-23 21:28

    I haven't found much hard data on the differences, so I ran a benchmark for the 3 cases.

    It appears that HashSet is about 4 times faster than TreeSet when adding (under certain circumstances, this will probably vary according to the exact characteristics of your data etc.).

    # Run complete. Total time: 00:22:47
    
    Benchmark                                                     Mode  Cnt  Score   Error  Units
    DeduplicationWithSetsBenchmark.deduplicateWithHashSet        thrpt  200  7.734 ▒ 0.133  ops/s
    DeduplicationWithSetsBenchmark.deduplicateWithLinkedHashSet  thrpt  200  7.100 ▒ 0.171  ops/s
    DeduplicationWithSetsBenchmark.deduplicateWithTreeSet        thrpt  200  1.983 ▒ 0.032  ops/s
    

    Here is the benchmark code:

    package my.app;
    
    import org.openjdk.jmh.annotations.Benchmark;
    import org.openjdk.jmh.runner.Runner;
    import org.openjdk.jmh.runner.RunnerException;
    import org.openjdk.jmh.runner.options.Options;
    import org.openjdk.jmh.runner.options.OptionsBuilder;
    
    import java.util.Comparator;
    import java.util.HashSet;
    import java.util.LinkedHashSet;
    import java.util.Random;
    import java.util.Set;
    import java.util.TreeSet;
    
    public class DeduplicationWithSetsBenchmark {
    
        static Item[] inputData = makeInputData();
    
        @Benchmark
        public int deduplicateWithHashSet() {
            return deduplicate(new HashSet<>());
        }
    
        @Benchmark
        public int deduplicateWithLinkedHashSet() {
            return deduplicate(new LinkedHashSet<>());
        }
    
        @Benchmark
        public int deduplicateWithTreeSet() {
            return deduplicate(new TreeSet<>(Item.comparator()));
        }
    
        private int deduplicate(Set set) {
            for (Item i : inputData) {
                set.add(i);
            }
            return set.size();
        }
    
        public static void main(String[] args) throws RunnerException {
    
            // Verify that all 3 methods give the same answers:
            DeduplicationWithSetsBenchmark x = new DeduplicationWithSetsBenchmark();
            int count = x.deduplicateWithHashSet();
            assert(count < inputData.length);
            assert(count == x.deduplicateWithLinkedHashSet());
            assert(count == x.deduplicateWithTreeSet());
    
    
            Options opt = new OptionsBuilder()
                .include(DeduplicationWithSetsBenchmark.class.getSimpleName())
                .forks(1)
                .build();
    
            new Runner(opt).run();
        }
    
        private static Item[] makeInputData() {
            int count = 1000000;
            Item[] acc = new Item[count];
            Random rnd = new Random();
    
            for (int i=0; i comparator() {
                return Comparator.comparing(Item::getName, Comparator.naturalOrder())
                    .thenComparing(Item::getId, Comparator.naturalOrder());
            }
        }
    }
    

提交回复
热议问题