TreeSet如何检查重复项

时间:2012-04-11 03:54:55

标签: java generics

我正在检查TreeSet如何检查重复元素并具有以下代码

  import java.util.*;

  public class TreeDemo{

    public static void main(String[] args)
        {
            new TreeDemo().go();
        }

    public void go()
    {
        Song s1 = new Song("song1","artist1");
        Song s2 = new Song("song2","artist2");
        Song s3 = new Song("song3","artist3");
        Song s4 = new Song("song3","artist3");

        Set<Song> tree = new TreeSet<Song>();

        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);

        System.out.println(tree);

    }
}

class Song implements Comparable<Song>{
    private String title;
    private String artist;

    public Song(String t, String a)
    {
        title=t;
        artist=a;
    }

    public String getTitle(){
        return title; 
    }

    public int compareTo(Song s){
        //Song s = (Song)o;
        return title.compareTo(s.getTitle());
    }

public String toString(){
    return title;
}

}

当我执行此代码时,我得到以下输出

[song1, song2, song3]

我的问题是: -

  • 即使我没有实现hashCode和equals方法(我确实实现了Comparable接口,因为它是强制性的并且需要保持Set的排序),TreeSet如何确定重复项?
  • 它是否使用Object类默认实现?看起来它使用“title”字段进行此检查,因为当我添加时将其视为重复,但是当我添加它时不会将其视为重复。

感谢。

3 个答案:

答案 0 :(得分:6)

TreeSet(或技术上支持它的TreeMap)仅使用compareTo()函数来比较元素。 它不使用Object的{​​{1}}或.equals()。而且,如果它使用了它们中的任何一个,那么你的输出就是

.hashCode()

因为[song1, song2, song3, song3] 的默认实现使用内存地址来测试对象的相等性,而不是它们的成员。

答案 1 :(得分:1)

比较器返回&lt; 0,0或&gt; 0 ...所以equals是通过compareTo返回0实现的。因此

if (node1.compareTo(node2) == 0) 

然后节点已经在集合

答案 2 :(得分:1)

TreeSet基于其成员的排序(通过Comparable或Comparator接口)实现平衡的二叉搜索树,而不是散列。

http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree