- hashCode有什么作用?
提高查询效率
拿HashMap举例,在向HashMap的数组层放置元素时,如果不进行Hash运算,需要将放
置的对象和数组中的每一个对象进行比较,有了HashCode之后,只需要对放置的对象
进行%模运算,如果%模后的结果相等,先判断放置对象的hashcode与是否相等,再使
用equals进行判断对象是否相等,如果equals相等,将新值替换旧值,并将旧值返回;
// 为什么先判断hashCode是否相等再判断equals??
因为
HashCode相等,对象不一定相等;
对象相等,HashCode一定相等;
HashCode不相等,对象则一定不等;
- 为什么重写equals?为什么重写HashCode?
//为什么重写equals???
// https://zhidao.baidu.com/question/326597100.html
在比较两个对象时,equals默认使用的是==来比较内存地址值;而程序中更想得到的
是比较对象的属性值,所以我们需要重写equals方法;
//为什么重写hashCode???
//https://blog.csdn.net/We_chuan/article/details/96426273
根据对象相等,则equals一定相等;得出重写完equals之后一定要重写hashCode;
3.讲了理论来实践一下
package com.example.demo;
public class Student {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重写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 name != null ? name.equals(student.name) : student.name == null;
}
//重写hashCode
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
}
package com.example.demo;
import java.util.HashMap;
public class Demo01 {
public static void main(String[] args) {
Student student = new Student();
Student student1 = new Student();
student.setName("111");
student1.setName("111");
//没有重写equals之前返回false,重写equals返回true
System.out.println("对象"+student.equals(student1));
//重写完hashCode之后对象的hashcode保持一致
System.out.println("student.hashCode==>"+ student.hashCode());
System.out.println("student1.hashCode==>"+ student1.hashCode());
//拿hashMap举例说明
HashMap<Student, String> studentStringHashMap = new HashMap<>();
//两次对象分别put
String put = studentStringHashMap.put(student, "1203");
String put1 = studentStringHashMap.put(student1, "456");
//当hashCode重写和equals重写之后发现student的值为456,说明这两个对象相等
System.out.println(studentStringHashMap.get(student));
}
}
[大写的参考链接][http://blog.sina.com.cn/s/blog_a01ab79d0101bal3.html]
[参考链接01][https://www.cnblogs.com/lijinshan950823/p/9476569.html]
[参考链接02][https://www.cnblogs.com/szlbm/p/5504623.html]