4

我正在检查 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 类的默认实现?看起来它使用“标题”字段进行此检查,因为当我添加时将其视为重复但当我添加时不会将其视为重复。

谢谢。

4

3 回答 3

6

TreeSet(或者从技术上讲,TreeMap支持它)仅使用该compareTo()函数来比较元素。它不使用Object's.equals().hashCode(). 此外,如果它使用了其中任何一个,您的输出将是

[song1, song2, song3, song3]

因为Object的默认实现使用内存地址来测试对象是否相等,而不是它们的成员。

于 2012-04-11T04:22:55.580 回答
2

比较器返回 < 0, 0 或 > 0... 所以 equals 是通过 compareTo 返回 0 来实现的。因此

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

那么节点已经在集合中

于 2012-04-11T04:12:29.210 回答
1

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

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

于 2012-04-11T04:15:50.617 回答