HashSet集合

HashSet特点

1.无序,不允许重复(无序指元素顺序与添加顺序不一致,每次遍历出来的位置不是恒久不变的)
2.HashSet通过调用hashCode()和equals方法来剔除重复
3.HashSet底层使用的数据结构是哈希表
4.HashSet有初始容量16,加载因子0.75.这两个参数都可以设置

剔除重复原理

  • 当向集合中添加数据时,自动帮助调用hascode方法 获取hashcode,结果不相同 则认为是不同对象 添加到集合中 * 如果hashcode中相同 ,再去调用equals方法,再比较一下 来确保一定是同一个对象, 如果内容也相等(即Equals返回true) * 则认为两个对象完全相同,不添加到集合

剔除规则:

1.未重写时,HashSet默认是根据内存地址来去除重复的
2.重写后,根据重写【hashCode()】和【equals()】方法来剔除重复

练习:
HashSet集合中放多个人类对象 Person 姓名 年龄 性别 ,要求 姓名和年龄相同 则是同一个对象,不允许放进集合

person类

package HashSet;
//HashSet集合中放多个人类对象  Person 姓名  年龄 性别 ,要求 姓名和年龄相同 则是同一个对象,不允许放进集合
public class Person {
    private String name;
    private int age;
    private String sex;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }
    public Person(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public Person() {
        super();
    }


    //要求 姓名和年龄相同 则是同一个对象,不允许放进集合
    @Override
    public int hashCode() {
        return this.name.hashCode()+this.age*31;
    }
    @Override
    public boolean equals(Object obj) {
        if(obj==null){
            return false;
        }
        if(obj==this){
            return true;
        }
        if(obj instanceof Person){
            Person person=(Person)obj;
            if(person.name.equals(person.name)&&this.age==person.age){
                return true;
            }
        }
        return false;
    }
}

测试类

package HashSet;

import java.util.HashSet;

public class Test {
    public static void main(String[] args) {
        HashSet set=new HashSet<>();
        set.add(new Person("李白",30,"male"));
        set.add(new Person("李白",30,"female"));
        set.add(new Person("王勃",30,"male"));
        System.out.println(set);
        //遍历输出
        for (Object object : set) {
            System.out.println(object);
        }
    }
}

输出结果
这里写图片描述

原文地址:https://www.cnblogs.com/TCB-Java/p/6770136.html