java treeset和hashset如何判断元素是否相同

2025-03-22 09:35:24
推荐回答(3个)
回答(1):

我想看下你得record类,问题可能出在你得record类里面,你是不是重写了hashcode方法?


刚才看了一下,问题出在你得record类应该,你没有生成一个hashcode()方法,所以你得hashcode方法继承自object类

object类的hashcode算法hashcode算出来的结果就是该对象在内存中的地址的十进制表示,你每次都是new出来的record,所以他们的内存地址一定是不一样,那么这就说明他们的hashcode不一样,而hashset对于相同对象的比较是使用hashcode的,他们的hashcode不同,那么自然被hashset认为是不一样的对象了,所以有了你的结果,建议record类里面写一个hashcode方法,可以利用Eclipse或MyEclipse的生成的那个hashcode算法


然后说说treeset

boss来了,等下给你补上


好了,boss走了,吓死我了

对于你的treeset,他是用compareTo方法判断是否相同,treeset要求你必须给record类实现comparable接口,你应该写了,但是这个接口有个方法compareTo你实现的时候可能是用了默认的吧,默认的compareTo方法只有一句,就是return 0;所以对于任何两个对象来说他们compareTo都是相同的,那么treeset就会认为这些record都是一样的,没区别,所以就只有一条

,建议可以利用下Eclipse或MyEclipse的equals算法生成,然后在compareTo方法里调用equals方法比较


综上所述

hashset用hashcode方法来实现比较是否相同

而treeset用comparable接口的compareTo方法比较


有问题可以追问,

打了这么多字给分吧~~

希望能帮助你


我人还是太好了,附带着还是把record的代码发给你吧,免得你迷糊


public class record implements Comparable{
    private int age;
    private String name;
    
    public record(int age,String name){
        // TODO Auto-generated constructor stub
        this.age=age;
        this.name=name;
    }

    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        
        if(equals(o)){
            return 0;
        }else {
            return -1;
        }
    }

    @Override
    public String toString() {
        return "record [age=" + age + ", name=" + name + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        record other = (record) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
}

回答(2):

HashSet 底层数据结构是哈希表,判断两个HashSet对象是否相等,先调用hashCode(),如果hashCode()相等,再调用equals(),equals()也相等,两个对象才相等。
TreeSet底层数据结构是二叉树,一个对象想存入TreeSet中有两种方式:
实现Comparable接口:此时判断相等只依据重写的compareTo中 是否return 0 这一条件,return 0相等,否则不相等;
创建一个Comparator比较器:此时判断是否相等,根据重写Comparator接口中的compare()方法是否return 0判断,return 0相等。

回答(3):

  1. 他们分别用的treemap 和 hashmap。都是用compare方法比较对象的

  2. 你的record类有实现comparable接口重写equals方法?如果没有重写的话。就是应该输出3个,因为你是传进去了3个record对象。

  3. 如果有的话,看看你是怎么实现的