前言:
以前总是迷惑为什么要同时重写这两个方法,想在终于明白了些,在这里总结下由来。
package day12.hash;
import java.util.Objects;
/**
* Create by SunnyDay on 2018/11/16
*/
public class Student {
int age;
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 "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@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(age, name);
}
}
package day12.hash;
import java.util.HashSet;
import java.util.Set;
/**
* Create by SunnyDay on 2018/11/16
* 哈希简介 以HashSet为栗子
*/
public class HashDemo {
public static void main(String[] args) {
// 首先举个简单的栗子
Set<String> set1 = new HashSet<>();
set1.add("熊大");
set1.add("熊二");
set1.add("光头强");
set1.add("熊大");
System.out.println(set1);
/*
打印:
[熊大, 光头强, 熊二]
Process finished with exit code 0
* 可以看出 hashset 具有无序性 而且当出现相同的元素时(如上的熊大),只会存取一个
* */
// 栗子延伸
Set<Student> set = new HashSet<>();
Student stu1 = new Student();
Student stu2 = new Student();
Student stu3 = new Student();
Student stu4 = new Student();
stu1.setAge(20);
stu1.setName("熊大");
stu2.setAge(21);
stu2.setName("熊二");
stu3.setAge(22);
stu3.setName("光头强");
stu4.setAge(21);
stu4.setName("熊二");
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
System.out.println(set);
/*
* 打印:
* [Student{age=22, name='光头强'}, Student{age=21, name='熊二'}, Student{age=20, name='熊大'}, Student{age=21, name='熊二'}]
* 可以看到:stu1 的name age 和stu4 的 name age 值是相同的(这时因为你存的为student对象,每个对象是不同的 所以存在了set集合中)
* 通常我们希望对象的 age 和 name都不同(如下)
* */
/* 进入Student类重写equals hashcode方法(先通过编译器自动生成 idea快捷 alt+insert)
打印:
[熊大, 光头强, 熊二]
[Student{age=21, name='熊二'}, Student{age=20, name='熊大'}, Student{age=22, name='光头强'}]
发现重写后没有重复的了
*/
// 哈希的分析:动态数组+哈希算法
// 参考图解
}
}
image.png
小结
这里只是记录下由来,以及简单的画图模型阐述下,详细的哈希算法我也不了解,这里只是自己的笔记记录下啊哈哈!!!
网友评论