java - TreeSet 如何检查重复项

标签 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 接口(interface),因为它是强制性的并且需要保持 Set 排序),TreeSet 如何确定重复项?
  • 是否使用了 Object 类默认实现?看起来它使用“标题”字段进行此检查,因为当我添加时将其视为重复但当我添加时它不会将其视为重复。

谢谢。

最佳答案

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

[song1, song2, song3, song3]

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

关于java - TreeSet 如何检查重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10099573/

相关文章:

java - 如何在 Rhino JS 中实现通用接口(interface)?

java - 读取大型 XLS 和 XLSX Excel 格式

java - 无论如何,使用 rs.next() 加载 java 数组都会引发空指针错误。用控制台检查

java 。使用枚举中的泛型获取特定类型

java - 具有通配符类型的生产者方法

scala - 通用数字除法

java - Struts 2 session 超时

java - 如何使用 Gson 反序列化 ConcurrentMap

java - 来自 java 应用程序的 HTTP POST

Swift:将不受约束的泛型类型转换为确认可解码的泛型类型