HashSet如何实现去重?

1 篇文章 0 订阅

public class Demo7 {
/*
* Set:无序的,不可重复的
* HashSet:底层是哈希表,线程不安全的
* TreeSet:底层是二叉树,线程不安全的
*
*
* HashSet如何实现去重:
* 是通过调用元素内部的hashCode和equals方法实现去重,首先调用hashCode方法,比较两个元素的哈希值,如果哈希值不同,直接
* 认为是两个对象,停止比较。如果哈希值相同,再去调用equals方法,返回true,认为是一个对象。返回false,认为是两个对象
*
* 实例:使用HashSet实现对person1类对象的去重
* 分析:要去重写Person1的hashCode和equals方法
* 自己制定比较规则:按照姓名和年龄比较
*
* 注意:1.HashSet本身不能排序
* 2.对于自定义的类,要想按照自己制定的比较规则进行去重,必须重写hashCode和equals方法
*/

public static void main(String[] args) {
    HashSet set=new HashSet<>();
    //在String类中重写了hashCode和equals方法
    //在add内部实现的去重的功能,默认调用的是字符串的hashCode和equals方法,实现去重
    set.add("java1");
    set.add("java2");
    set.add("java4");
    set.add("java3");
    set.add("java3");

    System.out.println(set);

    //实例:
    HashSet set1=new HashSet<>();
    set1.add(new Person1("bingbing", 20));
    set1.add(new Person1("bingbing1", 19));
    set1.add(new Person1("bingbing2", 24));
    set1.add(new Person1("bingbing", 20));

    System.out.println(set1);
}

}

class Person1 {
String name;
int age;

public Person1(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}

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

//重写hashCode方法
@Override
public int hashCode() {

    return age*1000+name.hashCode();
}


//重写equals方法---按照自己的规则进行比较
//按照姓名和年龄比较,只要姓名和年龄相同就认为是一个人
@Override
public boolean equals(Object obj) {
    if(!(obj instanceof Person1)){
        throw new ClassCastException();
    }

    //向下转型
    Person1 person=(Person1)obj;
    return age==person.age&&name.equals(person.name);
}

}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值