TreeSet如何检查重复项

Ank*_*kur 4 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;
}

}
Run Code Online (Sandbox Code Playgroud)

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

[song1, song2, song3]
Run Code Online (Sandbox Code Playgroud)

我的问题是: -

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

谢谢.

tru*_*ity 6

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

[song1, song2, song3, song3]
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,稍后我意识到TreeSet只使用compareTo(实现Comparable)或比较(实现Comparator)进行排序和重复检查.它是使用equals和hashCode的Hashset. (3认同)