以前知道只是知道结果,没有去探究原因,只是知道两个对象比较时,如果两个对象equal()比较时返回TRUE的话,则两个对象的hashcode()一定相等,反之则不一定!这是为什呢,并且Java中建议重写equals()方法时最好(有时是一定)要重写hashcode()方法!
在Java比较两个对象是否相等时有如下规则:
首先判断两个对象的 hashCode 是否相等,如果不相等,认为两个对象也不相等,反之如果相等,则用equals()比较。
用equals()比较时,如果不相等,认为两个对象也不相等 ,如果相等,认为两个对象等!
所以在比较对象是否相等时有个顺序,先比较的是对象的hashcode()在用equals()比较。
例如在map中,我们知道map存放键值时是不容许键重复的,但是要以对象作为键存入map中时,怎样才能判断存入的对象是否相等呢,下面是hashmap类中put()和get()方法的源码!
一看便知:
put:
/**
我们把对象放到map中去时,要和map中以前的键进行比较
*/
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
//我们看到先是比较hashcode(),再是equals();所以如果此时只重写了equals()方而
//没有重写hashcode(),那么在对象比较hashcode()不相等时就返回了false,后 面 的//equals()也就根本不调用了,没有用。
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
/////////////////////////////////////////////////////////////////
get:
/**
get()方法,取得时候也是同样的道理,要将传入的键和map中的键比较,找的相等的
取map中对应的键值。
*/
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
//我们看到先是比较hashcode(),再是equals()
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
分享到:
相关推荐
在Java中,equals和hashCode方法是Object中提供的两个方法,这两个方法对以后的学习有很大的帮助,本文就深度来去讲解这两个方法。下面小编带大家来一起学习吧
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 hashCode()和equals()定义在Object类中,这...
主要介绍了深入理解Java中HashCode方法,具有一定借鉴价值,需要的朋友可以参考下
通过该案例代码,你可以学习如何在自己的类中正确重写equals()、hashCode()、toString()等方法,提高代码质量和可读性。 经验丰富的Java开发者:即使你已经有一定的Java开发经验,仍然值得深入了解Object类的使用。...
1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、...
Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色,本文对hashCode()方法深入理解,希望能帮助大家
在面试中,Java实例是考察面试者对面向对象编程和Java语言特性的理解能力的重要方面。通过这些高难度问题,您将全面掌握实例的创建、访问、拷贝、生命周期管理以及相关设计模式和技巧。 每个问题都包含了精确而深入...
第3章 面向过程(数组和方法) 4课时 理解如何声明数组、构造数组、初始化数组以及使用数组中的各个元素。 清楚数组作为对象处理,创建数组对象时指定数组大小。 能够声明和操作多维数组...
同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行前输出”hello world” java程序的初始化顺序 请说出作用域public,private,...
equals和hashcode方法 143 泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
java中==和equals和hashCode的区别 == 在用关系操作符 == 比较的是值本身;equals 比较两个对象的引用是否相等,即 是否指向同一个对象;hashCode 用来鉴定两个对象是否相等,Object类中的hashCode方法返回对象在内存...
说下你对抽象类和接口的理解,以及两者的相同点和不同点 父类的静态方法能否被子类重写 描述下类的加载机制 说说你对 Java 反射的理解 什么是动态代理 在 Java 中 wait、yield 和 seelp 方法的不同 描述下 Java 中的...
学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度...
11.1.4 调用脚本的函数和方法 11.1.5 编译脚本 11.1.6 一个示例:用脚本处理GUI事件 11.2 编译器API 11.2.1 编译便捷之法 11.2.2 使用编译工具 11.2.3 一个示例:动态Java代码生成 11.3 使用注解 11.3.1 一个示例:...
2、equals()方法、hashCode()方法的区别 HashCode被设计用来提高性能。equals()方法与hashCode()方法的区别在于: 如果两个对象相等(equal),那么他们一定有相同的哈希值。 如果两个对象的哈希值相同,...
提供了20道高难度的Java Object类面试题及详细答案解析,涵盖了equals()、hashCode()、toString()、clone()、finalize()等方法的重写和应用,以及对象的比较、克隆、标识哈希码等概念。适合准备Java面试的开发者深入...
hashCode() 和 equals() 之间的契约 Java是按引用还是按值传递对象? 迭代与递归 ##3。 类和接口 什么是实例初始化器? 字段不能被覆盖? 继承与组合 如何使用 Java 枚举? 有多少种内部类? 什么是内部接口? 子类...
大华股份java笔试题 第一章 内容介绍 第二章 JavaSE 基础 一、 Java 面向对象 面向对象都有哪些特性以及你对这些特性的理解 访问权限修饰符 public、private、protected, 以及不写(默认)时的区别(2017-11-12) 如何...