HashSet集合

时间:2023-03-09 01:59:28
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);
}
}
}

输出结果

HashSet集合