覆盖的 compareTo() 方法的功能

Functionality of overridden compareTo() method

public class Drink implements Comparable {
    public String name;

    @Override
    public int compareTo(Object o) {
        return 0;
    }

    @Override
    public String toString() {
        return name; 
    }

    public static void main(String[] args) {
        Drink one = new Drink();
        Drink two = new Drink();
        one.name = "Coffee";
        two.name = "Tea";
        TreeSet set = new TreeSet();    
        set.add(one);
        set.add(two);

        Iterator itr = set.iterator();
        while(itr.hasNext()) {
            System.out.println(itr.next()); //prints Tea
        }
    }
}

通常,compareTo() 方法按字典顺序打印,但是当 compareTo() 方法如上面的代码那样被覆盖时,它是如何比较两个字符串的?

根据您的 compareTo 方法,所有对象彼此相等,因为您总是 return 0,所以当您尝试将两个 Drink 对象添加到您的 TreeSet 时,只会添加第一个,因为 Set 不允许重复。

如果有这样一个实际比较名称的实现会更有意义:

public class Drink implements Comparable<Drink> {

    public String name;
    @Override
    public int compareTo(Drink o) {
        return name.compareTo(o.name);
    }
    ...
}

覆盖的 compareTo 方法用于自定义比较。在这个函数中,你根据你的业务逻辑比较两个对象,根据你的逻辑,你 return -1,0 或 1,其中 -1 表示调用对象小于被调用对象,而 _1 表示另一种方式。 0表示两个对象相等

在您的代码中,现在没有放置任何逻辑。它只是 returning 原型值。你可以在你的代码中加入类似的东西

return name.compareTo((String)o);

如果您不放置自定义覆盖方法,这将是默认功能。

不比较字符串,因为comapareTo()方法返回0(意思是对象相等)所以set.add(two)会被认为是重复的,只有添加的第一个值会被打印.

尝试颠倒向集合添加值的顺序,您将得到答案