HashSet原理:哈希表,底层就是数组+链表的形式存储数据
经过上图原理得知,也就是说只要往HashSet中add数据的时候,就一定要重写底层的两个方法hashCode()和equals()方法,只有重写之后底层才能实现这个集合的本质;实现数组+链表=哈希表的存储。
那么问题来了,前天我们给HashSet中放入了咱们自定义的引用类型,为什么可以存储相同的数据?
- 因为咱们没有重写hashCode()和equals()方法。
package zhai.set;
import java.util.Objects;
public class SetDemo2{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "SetDemo2{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public SetDemo2(int age, String name) {
this.age = age;
this.name = name;
}
// 重写 equals() 方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SetDemo2 setDemo2 = (SetDemo2) o;
return age == setDemo2.age && name.equals(setDemo2.name);
}
// 重写 hashCode() 方法
@Override
public int hashCode() {
return Objects.hash(age, name);
}
}
测试
package zhai.set;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) {
HashSet<SetDemo2> setDemo2s = new HashSet<>();
setDemo2s.add(new SetDemo2(12,"zhangsan"));
setDemo2s.add(new SetDemo2(25,"wangwu"));
setDemo2s.add(new SetDemo2<