Java中的TreeSet - 澄清?

时间:2014-09-01 12:28:47

标签: java

我很困惑(Java新手)

read

  

TreeSet实际上并没有使用equals()。它使用compareTo()   相反 - 如果compareTo()返回零,则表示两个对象是   "等于"就TreeSet而言。

大。

所以我有:

public class User implements Comparable<User>
{
    String Username;
    String Password;


    @Override
    public int compareTo(User o)
    {
        return o.Username.compareTo(this.Username );
    }
}

我也有:

public static void main(String[] args)
    {
        TreeSet<User> ts = new TreeSet<User>();
        User u = new User();
        u.Username="u";
        ts.add(u);

        User u1 = new User();
        u1.Username="u";
        ts.add(u1);  //<---------------
        System.out.print(u1.compareTo(u)); //0


    }

查看debug:compareTo - 返回&#34; 0&#34;。 (他们有相同的顺序)

如果是这样的话:

问题

为什么当我插入2&#34;同样有序&#34;时,我不会得到例外。元素?

2 个答案:

答案 0 :(得分:4)

只需在TreeSet中查看add()方法的文档。

  

如果此set已包含该元素,则调用将保持set不变并返回false。

你的第二个元素( u1 )没有实际添加到TreeSet

答案 1 :(得分:1)

向任何Set添加两个相同的元素时没有例外。第一次添加将返回true

boolean addU = ts.add(u); // returns true

而第二个会返回false

boolean addU1 = ts.add(u1);  // returns false

请注意,您的测试很难看到compareToequals不一致时会发生什么,因为您依赖于compareTo java.lang.String方法,这与equals