Java19-hashSet

HashSet的特点:

  • 它是无序的,即添加的顺序和遍历出来的顺序是不同的
  • 它里面不允许有重复元素,是因为它是基于HashMap实现的
  • 实现了Set接口,由哈希表(实际上是一个HashMap实例)支持
  • 底层数据结构是哈希表

如何将自定义类对象存入HashSet进行去重呢?

  • 类中必须重写hashCode()方法和equals()方法

  • equals()方法中比较所有属性

  • hashCode()方法要保证属性相同的对象返回值相同, 属性不同的对象尽量不同,对象的成员变量值相同即为同一个元素

 以上来源:https://blog.csdn.net/colinchen1996/article/details/77887539

---------------------------------------实践---------------------------------------------

Person类

package testHashSet;

public class Person {
    public String name;
    public int age;
    public Person(String name, int age) {
        this.name=name;
        this.age=age;
    }
    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;
    }
    @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;
        Person other = (Person) 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;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

测试代码:

package testHashSet;

import java.util.HashSet;

public class testHashSet {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add(new Person("王一",1));
        hashSet.add(new Person("王一",1));
        hashSet.add(new Person("张三",11));
        hashSet.add(new Person("张三",1));
        hashSet.add(new Person("李二",2));
        hashSet.add(new Person("李二",2));
        System.out.println(hashSet);
        
        
    }

}

输出结果:

[Person [name=李二, age=2], Person [name=张三, age=1], Person [name=张三, age=11], Person [name=王一, age=1]]
  • 它是无序的,即添加的顺序和遍历出来的顺序是不同的
  • 重写了hashCode()方法和equals()方法,不允许出现重复元素
原文地址:https://www.cnblogs.com/eosclover/p/13605918.html