网站首页 > java教程 正文
公众号 《java编程手记》记录JAVA学习日常,分享学习路上点点滴滴,从入门到放弃,欢迎关注
前言
直接进入正题,hashCode方法和equals方法
hashCode
public native int hashCode();
hashCode方法用来获取当前对象的哈希码,也称为散列码,本质上是一个int类型的整数。哈希码的作用是确定该对象在我们常见的Java集合中如HashMap,Hashtable,HashSet中的位置,每个对象对应的hashCode不一样,避免在集合类中进行存放时出现hash碰撞
equals
public boolean equals(Object obj) {
return (this == obj);
}
默认equals方法的实现为直接对象两个对象的是否在内存中为同一个对象,在我们日常开发中,使用equals方法更多的是判断两个对象是否相等,而非是同一个对象,所以会重写equals方法,如Integer中,equals方法对比的是对应包装的基本类型int的值,同样Integer中也重写了hashCode方法,保证相同对象返回的hashCode也保持一致
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
@Override
public int hashCode() {
return Integer.hashCode(value);
}
public static int hashCode(int value) {
return value;
}
那为什么要在重写equals的同时,重写hashCode方法呢,或者更加准确地说,为什么在重写equals方法的同时,重写hashCode方法来保证equals方法结果为true时,hashCode也相等呢
本质上,当两个对象相等时,在散列表中的位置应当是一致的,而在散列表中,计算对象存放位置的方式就是通过hash算法计算对象的hashCode得到hash值,如HashMap中,设置kv时,需要先计算hash值来确认槽位,hash值则通过hashCode运算得到
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
同样在获取对应值时,则先通过hash值进行槽定位获取,当计算的hash值不相同时,就可能出现put进去数据但获取不到的尴尬结果
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
同时,计算hashCode要避免变量性强的字段,当hashCode的计算涉及到某些变量时,改变变量的值后,可能就取不出来了
@Data
public class Data implements Serializable {
private Integer id;
public boolean equals(Object obj) {
if(obj instanceof Data){
Data obj1 = (Data) obj;
return obj1.id == this.id;
}
return false;
}
@Override
public int hashCode() {
return id+1;
}
}
public static void main(String[] args) {
Data data = new Data();
data.setId(1);
Map<Data, Integer> map = new HashMap<>();
map.put(data,1);
System.out.println(map.get(data));
data.setId(2);
System.out.println(map.get(data));
}
输出结果为
1
null
猜你喜欢
- 2025-01-02 Netty 断开重连
- 2025-01-02 “算法考核没过,老板找我聊了3个小时”:离职程序员重刷数学题
- 2025-01-02 List 去除重复数据的五种方式,舒服
- 2025-01-02 你真的会用MySQL去重吗?看看DISTINCT和GROUP BY的奥秘
- 2025-01-02 Java8两个List集合取交集、并集、差集、去重并集
- 2025-01-02 干货实战~Java如何防止接口重复提交
- 2025-01-02 面试突击63:MySQL 中如何去重?
- 2025-01-02 Java中List集合对象去重及按属性去重的8种方法
- 2025-01-02 Java实现10万+并发去重,持续优化
- 2025-01-02 java接口防重提交如何处理
你 发表评论:
欢迎- 04-24Java Collections 工具类集合框架中常用算法解析
- 04-24桶排序的简单理解
- 04-24Java集合框架底层实现原理大揭秘
- 04-24Java 集合框架全面解析:选对数据结构,提升开发效率
- 04-24c#集合排序
- 04-24Java面试中常被问到的集合类深度解读
- 04-24VBA技术资料MF278:对集合进行排序
- 04-24Spring 最常用的 7 大类注解,史上最强整理
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)