- 浏览: 776055 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Fanatic357:
同问,请问这个 曲线 是用什么工具 监测得到的?
RocketMQ性能压测分析 -
sunshine_love:
8核 16G, 单master TPS 4w+,2m-2s- ...
RocketMQ性能压测分析 -
assertmyself:
很好,,获益良多!
jstack和线程dump分析 -
zhaoxiaoxiao:
非常赞,帮助理解了问题。今天也是遇到了这样的问题
hessian序列化bug -
wjg_java:
打不开 宕机了
博客停止更新
前几天有个同事问我,String a="123",String b=new String("123");它们的hashcode相等吗?我当时愣了一下,首先它们的equals肯定是true的,“==”是false的,但是还真没注意到两个的hashcode是否相等。
后来我查了一下jdk文档,发现对String的hashcode是这样描述的:
hashCode
public int hashCode()
String
对象的哈希码按下列公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int
算法,这里 s[i]
是字符串的第 i 个字符,n
是字符串的长度,^
表示求幂。(空字符串的哈希码为 0。)
Object
中的 hashCode
Object.equals(java.lang.Object)
, Hashtable
这说明,String的hashcode其实是对它的字符串的一系列运算,所以只要两个String对象的字符串值是相等的,那么他们的hashcode也是一定相等的。String类被定义为final类型,final类使不能被继承的,因为它的方法不可能被重写。
按找文档描述,String的hashcode方法重写了Object的hashcode方法,那么我们再来看看Object的hashcode方法是什么样的:
hashCode
public int hashCode()
java.util.Hashtable
提供的哈希表。
hashCode
的常规协定是:
- 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
- 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用
hashCode
方法都必须生成相同的整数结果。 -
以下情况不 是必需的:如果根据
equals(java.lang.Object)
方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
equals(java.lang.Object)
, Hashtable
Object定义的hashcode方法就是把对象内存地址转换为一个数值,这意味着两个Object必须完全相等(=而不是equals),hashcode才是相等。但是我们再看下,是不是两个对象的hashcode相同,那么他们的equals比较就是true呢?是不是他们的完全比较“=”就是true呢?答案是不一定。这要看这两个对象有没有重写Object的hashCode方法和equals方法。如果没有重写,是按Object默认的方式去处理,Object的equals方法定义如下:
equals
public boolean equals(Object obj)
equals
方法在非空对象引用上实现相等关系:
- 自反性:对于任何非空引用值
x
,x.equals(x)
都应返回true
。 - 对称性:对于任何非空引用值
x
和y
,当且仅当y.equals(x)
返回true
时,x.equals(y)
才应返回true
。 - 传递性:对于任何非空引用值
x
、y
和z
,如果x.equals(y)
返回true
,并且y.equals(z)
返回true
,那么x.equals(z)
应返回true
。 - 一致性:对于任何非空引用值
x
和y
,多次调用 x.equals(y) 始终返回true
或始终返回false
,前提是对象上equals
比较中所用的信息没有被修改。 - 对于任何非空引用值
x
,x.equals(null)
都应返回false
。
Object
类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x
和 y
,当且仅当 x
和 y
引用同一个对象时,此方法才返回 true
(x == y
具有值 true
)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
obj
- 要与之比较的引用对象。 true
;否则返回 false
。 hashCode()
, Hashtable
注意这句话“Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x
和 y
,当且仅当 x
和 y
引用同一个对象时,此方法才返回 true
(x == y
具有值 true
) ”。这说明了Obejct定义的equals其实和“==”没什么两样。所以如果对象没有重写Object的hashCode方法和equals方法,那么可以肯定的说,如果两个对象的hashcode相等,那么equals比较必然是true,“==”比较也必然是true。但是如果对象重写了hashCode方法和equals方法,那么情况就不一样了,只能说有可能,但是不能肯定。比如String重写了Object的hashcode和equals,但是两个String如果hashcode相等,那么equals比较肯定是相等的,但是“==”比较却不一定相等。如果自定义的对象重写了hashCode方法,有可能hashcode相等,equals却不一定相等,“==”比较也不一定相等。
评论
这个说反了。
你试试就知道了
这两个对象的Type如果一样的话,是对的,hashcode相等,肯定也equals。
但是如果是不同的Type的话,hashcode相等了也未必equals。
说错了一句话 呵呵。
但是如果是不同的Type的话,hashcode也可以相等。
嘿嘿,你看清楚咯,前面还有一句话,“如果对象没有重写Object的hashCode方法和equals方法”。如果没有重写,equls用的就是Object的,Obejct的equals比较的是hashcode。你搞的代码跑下就知道了。
明白你的意思,至少是不是应该说一句在同一种Type下。嘿嘿。
这个说反了。
你试试就知道了
这两个对象的Type如果一样的话,是对的,hashcode相等,肯定也equals。
但是如果是不同的Type的话,hashcode相等了也未必equals。
说错了一句话 呵呵。
但是如果是不同的Type的话,hashcode也可以相等。
嘿嘿,你看清楚咯,前面还有一句话,“如果对象没有重写Object的hashCode方法和equals方法”。如果没有重写,equls用的就是Object的,Obejct的equals比较的是hashcode。你搞的代码跑下就知道了。
这个说反了。
你试试就知道了
这两个对象的Type如果一样的话,是对的,hashcode相等,肯定也equals。
但是如果是不同的Type的话,hashcode相等了也未必equals。
说错了一句话 呵呵。
但是如果是不同的Type的话,hashcode也可以相等。
这个说反了。
你试试就知道了
这两个对象的Type如果一样的话,是对的,hashcode相等,肯定也equals。
但是如果是不同的Type的话,hashcode相等了也未必equals。
这个说反了。
你试试就知道了
这个说反了。
发表评论
-
dubbo问题总结
2012-03-14 10:00 2980任何诡异的现象必然能找到问题原因,程序是不会骗人的 ... -
memcached客户端源码分析
2011-09-08 17:28 19949memcached的java客户端有好 ... -
说说单例模式
2011-05-23 11:12 3334单例模式?多么简单!也许吧,可是要通过简单的现象, ... -
jstack和线程dump分析
2011-05-12 13:48 180134一:jstack jstack命令的语法格式: js ... -
说说new Integer和Integer.valueOf
2010-11-11 15:04 6591看看这两个语句 Integer a=new Integ ... -
线程安全总结(二)
2010-11-11 12:36 5607关于线程安全总结(-)请看 http://www.iteye ... -
java线程安全总结
2010-11-09 20:48 15637最近想将java基 ... -
hadoop架构
2010-09-07 19:41 2681该文章我转自IBM开发者社区 ... -
HashMap深入分析
2010-09-03 19:36 5826java.util.HashMap是很常见的 ... -
CountDownLatch
2010-09-02 20:03 2959java的并发包真 ... -
ThreadPoolExecutor相关类的分析
2010-09-02 19:27 4596一:ThreadPoolExecutor ... -
随便说说
2010-09-01 19:29 2095这两天给系统 ... -
一波三折的rmi调用
2010-08-18 18:02 9850很久以前写了基于rmi的分布式java程序,现 ... -
java内存查看与分析
2010-08-07 17:03 22474业界有很多强 ... -
java动态代理之cglib
2010-06-22 17:27 2791cglib是一个 ... -
java动态代理随笔二
2010-06-22 16:29 1876jdk的动态代 ... -
java动态代理随笔一
2010-06-22 14:49 2075先说一下java class的加载机制和与cla ... -
建设银行对接(五)
2010-02-09 17:34 2557public static void testVerify ... -
建设银行对接(四)
2010-02-09 17:32 3085上接“建设银行对接(三)”,javaeye的文章字数限制也太少 ... -
建设银行对接(三)
2010-02-09 17:24 3463前面两章请见我的博客 对建行返回的数据进行数字签名 ...
相关推荐
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
Java 中的 hashCode 和 equals 方法详解 本文详细介绍了 Java 中的 hashCode 和 equals 方法,探讨了这两个方法的作用、实现机制和使用场景。通过对 hashCode 和 equals 方法的深入分析,我们可以更好地理解 Java ...
在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...
hashCode() 和 equals() 的本质区别和联系 Java 中的每个对象都有 hashCode() 和 equals() 方法,这两个方法的正确实现对于 Java 开发人员来说是非常重要的。本文将详细介绍 hashCode() 和 equals() 的本质区别和...
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 hashCode()和equals()定义在Object类中,这...
### hashCode和equals方法详解 #### 一、hashCode方法解析 在深入探讨`hashCode`方法之前,我们需要了解Java集合框架的基本概念。Java集合框架主要包括两大类集合:`List`和`Set`。 - **List**:这是一个有序集合...
### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...
在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 或 `HashSet`)时。这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类...
在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...
hashcode、equals、==总结1简单总结.txt,他们之间的区别
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
在Java编程语言中,`hashCode()` 和 `equals()` 方法对于对象的比较和处理至关重要,尤其在集合类(如Set和Map)中。这两个方法都源自`java.lang.Object`类,因此所有的Java类都默认继承了它们。理解并正确地重写这...
详解hashCode()和equals()的本质区别和联系 在 Java 中,hashCode() 和 equals() 是两个非常重要的方法,它们都是从 Object 类继承来的。了解这两个方法的本质区别和联系对于 Java 开发者来说至关重要。 equals() ...
在Java编程语言中,`hashCode()`...以上就是关于Java中`hashCode()`和`equals()`的详解。这两个方法在Java编程中起着至关重要的作用,尤其是在处理集合类和数据结构时。了解并正确使用它们能够确保程序的正确性和效率。
"Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...
"关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...