为什么要重写equals和hashcode
时间:2019-11-11
本文章向大家介绍为什么要重写equals和hashcode,主要包括为什么要重写equals和hashcode使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
我在最开始遇到这个问题时是很疑惑地,因为我只重写了equals但是并没有出现什么问题。其实首先要明白一点的是重写equals时重写hashcode
并不是java语法层面的问题。而是一种通用约定。因为java中基于散列的集合实现了这个约定。所以当你的类在集合这样的数据结构中使用,也需要遵守这种约定。
不然就会出错。下面是一个例子。
public class EqualsAndHashcode { /** * 显然 我们的目的是对于name 和 age 相同的对象 都返回的是同一个值 * @param args */ public static void main(String[] args) { Map<Student, String> map = new HashMap<>(); Student one = new Student("tom", 12); map.put(one, "one"); Student two = new Student("tom", 12); System.out.println(map.get(two)); } } class Student { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; }
}
如果没有重写 equals和hashcode显然 输出的是null.
@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof Student) { Student student = (Student) obj; return student.age==this.age&&student.name.equals(this.name); } return false; }
如果只重写equals 输出的依然是null
@Override public int hashCode() { int result = 13; result = result * 37 + age; result = result * 37 + name.hashCode(); return result; }
重写hashcode之后 ,可以输出one.
public class EqualsAndHashcode {
public static void main(String[] args) {
Map<Student, String> map = new HashMap<>();
Student one = new Student("tom", 12);
map.put(one, "one");
Student two = new Student("tom", 12);
System.out.println(map.get(two));
}
}
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
原文地址:https://www.cnblogs.com/shaomys/p/11834266.html
- 【Spring开发】—— Spring Core
- Java魔法堂:找外援的利器——Runtime.exec详解
- win10的80端口被system占用的问题
- 【Spring开发】—— AOP之方法级拦截
- eclipse tomcat下网页修改不生效
- 【插件开发】—— 14 Site is incorrect!编辑器启动报错!
- Java魔法堂:Date与日期时间格式化
- Java魔法堂:打包知识点之META-INF/MAINFEST.MF
- WordPress快速建站
- 大数据时代下的生活
- 【Spring实战】—— 1 入门讲解
- 博客园小技巧
- JS魔法堂:关于元素位置和鼠标位置的属性
- MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [884]Elasticsearch可视化工具
- 如何控制nodejs的线程数
- 算法篇:链表之合并有序链表
- 速读原著-UnixLinux基础(六)
- Python GUI编程:Tkinter
- JVM系列之:通过一个例子分析JIT的汇编代码
- 二叉查找树-增删查和针对重复数据处理的 Java 实现
- 手把手教你实现自定义Spring Boot的 Starter
- JVM详解之:本地变量的生命周期
- VBA解析复合文档01——实现的功能
- VBA解压缩ZIP文件09——解压-静态Huffman
- 第5章 流水线数据脱敏-Jenkins系统凭据管理
- 100% 展示 MySQL 语句执行的神器-Optimizer Trace
- Kafka消费者分区分配策略及自定义分配策略
- Java8新特性之日期、时间操作