为什么Collection <string> s = new TreeSet <>(),TreeSet <string> s = new TreeSet <>()和Set <string> s = new TreeSet <>()会产生相同的结果?

时间:2019-04-04 04:41:09

标签: java collections

我不明白为什么三个都一样。集合是一个接口,树集和集合是类。

 public static void main(String[] args) {

        String[] text = {"i", "came", "i", "saw", "i", "left"};

        Set<String> s = new TreeSet<>();    // output = 4 distinct words: [came, i, left, saw]
        // Collection<String>s = new TreeSet<>(); // output = 4 distinct words: [came, i, left, saw]
        // TreeSet<String>s = new TreeSet<>(); // output = 4 distinct words: [came, i, left, saw]
        for(String a: text)
            s.add(a);

            System.out.println(s.size()+" distinct words: "+s);

    }

2 个答案:

答案 0 :(得分:1)

结果是相同的,因为所有三个都使用相同的实现类TreeSet。由于SetCollectionTreeSet类的父接口,因此您可以使用它们的引用指向TreeSet实现。这就是多态性在OOP中的工作方式。

但是,尽管引用是SetCollection的实现,但实现是类TreeSet的实例,该类不允许重复,并根据元素对{{ 1}}界面(自然排序)。因此,在这三者中,您都发现重复项被消除了。

答案 1 :(得分:0)

这是因为在所有三种情况下,您都使用相同的实现并将其分配给其超类型。请查看polymorphism