- 浏览: 66998 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
x334085347:
顶一a 下
二进制、八进制、十进制、十六进制之间转换 -
zhsh666:
As a rule of thumb, any time yo ...
java equals == hashcode -
zhsh666:
关于java的hashCode方法 ( ...
java equals == hashcode -
dyf4256dyf:
...
Java构造函数
1.首先看看Object 中 equals()方法的实现
public boolean equals(Object obj) {
return (this == obj);//比较两个对象是否指向同一个地址(引用),其作用同==
}
再来看看JDK中的说明:
The equals
method implements an equivalence relation on non-null
object references:(对象的引用)
-
It is reflexive
: for any non-null reference value
x
,x.equals(x)
should returntrue
.(自反性,自已和自己比) -
It is symmetric
: for any non-null reference values
x
andy
,x.equals(y)
should returntrue
if and only ify.equals(x)
returnstrue
.(对称性,一看就明白,不用多说) -
It is transitive
: for any non-null reference values
x
,y
, andz
, ifx.equals(y)
returnstrue
andy.equals(z)
returnstrue
, thenx.equals(z)
should returntrue
.(传递性,也不用多说了,呵呵) -
It is consistent
: for any non-null reference values
x
andy
, multiple invocations of x.equals(y) consistently returntrue
or consistently returnfalse
, provided no information used inequals
comparisons on the objects is modified.(一致性,参比的对象没有改变,比较的结果也不会变化) -
For any non-null reference value
x
,x.equals(null)
should returnfalse
.
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
相等的对象其hashcode值也相等。所以啊,重写了equals方法,则也得将hashcode()方法重写下。
JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)
String、Integer、Boolean、Double等这些类都重写了equals和hashCode方法,这两个方法是根据对象的内容来比较和计算hashCode的。所以只要对象的基本类型值相同,那么hashcode就一定相同。
2.再来看看 ==到底是什么
==是指引用是否相同
3.hashcode方法
Object类中的hashCode是返回对象在内存中地址转换成的一个int值(可以就当做地址看)。所以如果没有重写hashCode方法,任何对象的hashCode都是不相等的。通常在集合类的时候需要重写hashCode方法和equals方法, 因为如果需要给集合类(比如:HashSet)添加对象,那么在添加之前需要查看给集合里是否已经有了该对象,比较好的方式就是用hashCode。如果hashcode相同,对象就放不到集合类中了(hashset,hashmap,hashtable),通过哈希储存结构
equals()相等的两个对象,hashcode()一般是相等的,最好在重写equals()方法时,重写hashcode()方法; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对 象,hashcode()有可能相等。 反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在 object类中,hashcode()方法是本地方法,返回的是对象的引用(地址值),而object类中的equals()方法比较的也是两个对象的 引用(地址值),如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了。
评论
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。
首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是 Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
上面说的对象相同指的是用eqauls方法比较。
你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。
发表评论
-
Java构造函数
2010-08-19 23:07 1519Java构造函数 -
(转)java并发编程学习一线程同步
2010-08-14 15:14 943线程同步 原文出处:htt ... -
全面理解Java中的String数据类型(转)
2010-08-11 22:43 7541. 首先String不属于8种基本数据类型,String是一 ... -
Java-String类型的参数传递问题(转)
2010-08-11 22:17 829原文出处http://freej.blog.51cto.com ... -
java final关键字的使用(转)
2010-06-20 12:07 765final变量定义: 变量一经 ... -
常用java类
2010-01-21 21:56 7071.java.lang.reflect Class A ... -
测试程序执行时间的方法
2010-01-18 16:46 9671.System.currentTimeMillis() 程 ... -
比较有用的log4j.properties
2009-11-24 16:51 735log4j.rootLogger=DEBUG,CONSOLE, ... -
总结Java标准类库中类型相互转化的方法
2009-11-24 16:37 841原文出处:http://hxraid.iteye.com/bl ... -
关于文件路径方面的小麻烦
2009-11-24 16:25 788原文出处:http://hxraid.iteye.com/bl ... -
一种java 克隆实现(二进制)
2009-11-24 10:58 995package com.ben.clone; impor ... -
java语言基础学习-----接口与对象克隆
2009-11-23 23:50 819一、接口 1.在java语言中,接口是一组对类的需求描述(规 ... -
java语言基础易错点
2009-11-23 17:21 01.实现一个接口,必须实现所有的方法;相比,继承一个抽象类,不 ... -
java 中的Logging
2009-11-12 22:04 859java.util.logging 1.Logging ... -
Java 异常处理机制
2009-11-12 17:15 7821.异常的分类 The Error ... -
log4j比较全面的配置文件
2009-10-23 14:58 788标准级别:DEBUG<INFO<WARN<E ... -
写程序的经验处理
2009-10-19 09:15 689在编写程序时,经常会有一些经验写法,这种写法的目的就是在考虑代 ... -
Does Java need Checked Exceptions?
2009-09-25 09:36 707Although C++ introduced the exc ...
相关推荐
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
hashcode、equals、==总结1简单总结.txt,他们之间的区别
同时,需要注意的是,如果自定义了类并且想要比较对象内容,记得要同时重写`equals()`和`hashCode()`方法,以保持两者的一致性,这在使用HashMap、HashSet等容器时尤为重要。 此外,当我们涉及到数组或者集合时,`...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
在Java编程语言中,`equals()`方法和`==`运算符是两个经常被...为了确保一致性,Java编程实践中通常建议在自定义类中重写`equals()`方法,并与`hashCode()`方法一起使用,以满足`equals()`和`hashCode()`的合同约定。
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用以及equals()和==的区别,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。总的来说,Java中的集合(Collection)有两类,...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
同时,别忘了在重写`equals()`时,也要重写`hashCode()`方法,以保持两者的一致性,这对于集合类(如HashSet、HashMap)的正常工作至关重要。 总的来说,`equals()`和`==`在Java中扮演着不同的角色。`==`关注对象的...
在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...
Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些...
Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...
在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...
### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...
- 在编写自定义类时,根据需要重写 `equals()` 方法以实现期望的比较逻辑,并确保与 `hashCode()` 方法一起使用以保持一致性。 总之,理解 `equals()` 和 `==` 的差异是Java编程中的重要概念,这有助于避免逻辑错误...
在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...