public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public static void main(String[] args) {
Student s1 = new Student("zhangsan", 12);
Student s2 = new Student("zhangsan", 12);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
@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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
System.out.println("123".hashCode());
System.out.println("123".hashCode());
注意事项:因为哈希值是采用int类型存储,所以哈希值是有限的数据,所以就有可能存在哈希冲突,如下例:
System.out.println("abc".hashCode());
System.out.println("acD".hashCode());
注意事项:
在HashMap中就是采用的内部定义的Node来存放每一个元素
所以在HashSet中其实主要存的就是HashMap对象,像知道底层的原理,可以看后面的HashMap底层原理介绍。
在调用HashSet的很多方法的时候,其实底层就是去掉了HashMap的方法。
首先获取当前需要添加的元素的Hash值
然后判断当前需要存放的位置是否已经有元素了
要是没有元素,那就直接将当前添加的元素放到这个位置
要是有元素了,那就需要对当前存放的数据进行比较判断
当现在加入的元素在里面的时候,就直接不进行操作,返回false添加失败
当里面没有时
成功将当前数据存储后直接返回true添加元素成功。
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("123");
set.add("456");
set.add("444");
System.out.println(set);
}
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("123");
set.add("456");
set.add("444");
System.out.println(set);
}
public static void main(String[] args) {
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("123");
set.add("456");
set.add("444");
System.out.println(set);
}
评论
登录后才可以进行评论哦!