HashSet集合数据的结构、HashSet存储自定义元素
HashSet集合数据的结构
我们来画一张图来解释:
Set集合存储元素不重复的原理
public class HashSet2 {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
// 存储2相同的遍历输出一下
set.add(1);
set.add(1);
set.add(2);
set.add(3);
for (Integer integer : set) {
System.out.println(integer);
}
}
}
看一下结果:
画个图来看一下他的存储结构
)
这就是存储的原理
HashSet存储自定义元素
set集合报错元素唯一:
存储 的元素(String Student .....)
要求:
同名同年龄的人,视为同一个人,只能存储一次,必须重写HashCode方法和equals方法
案例:
public static void main(String[] args) {
/*
* set集合报错元素唯一:
存储 的元素(String Student .....)
要求:
同名同年龄的人,视为同一个人,只能存储一次,必须重写HashCode方法和equals方法*/
HashSet<Student> set = new HashSet<>();
Student student = new Student("王老虎", 37);
Student student1 = new Student("王老虎", 37);
Student student2 = new Student("王老汉", 88);
set.add(student);
set.add(student1);
set.add(student2);
for (Student student3 : set) {
System.out.println(student3);
}
}
}
我们来先一个问题
这个两个元素重复了为啥还打印输出了呢??
打印地址值看一下:
System.out.println(student.hashCode());
System.out.println(student1.hashCode());
地址不同
那么如果我们要i想不出先重复元素
就需要在实体类 重写HashCode方法和equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
然后我们在测试看一下:
可以看出没有重复元素了 地址值也变成相同的了