- 浏览: 771978 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 2939任何诡异的现象必然能找到问题原因,程序是不会骗人的 ... -
memcached客户端源码分析
2011-09-08 17:28 19881memcached的java客户端有好 ... -
说说单例模式
2011-05-23 11:12 3285单例模式?多么简单!也许吧,可是要通过简单的现象, ... -
jstack和线程dump分析
2011-05-12 13:48 179963一:jstack jstack命令的语法格式: js ... -
说说new Integer和Integer.valueOf
2010-11-11 15:04 6537看看这两个语句 Integer a=new Integ ... -
线程安全总结(二)
2010-11-11 12:36 5555关于线程安全总结(-)请看 http://www.iteye ... -
java线程安全总结
2010-11-09 20:48 15554最近想将java基 ... -
hadoop架构
2010-09-07 19:41 2633该文章我转自IBM开发者社区 ... -
HashMap深入分析
2010-09-03 19:36 5797java.util.HashMap是很常见的 ... -
CountDownLatch
2010-09-02 20:03 2918java的并发包真 ... -
ThreadPoolExecutor相关类的分析
2010-09-02 19:27 4556一:ThreadPoolExecutor ... -
随便说说
2010-09-01 19:29 2057这两天给系统 ... -
一波三折的rmi调用
2010-08-18 18:02 9810很久以前写了基于rmi的分布式java程序,现 ... -
java内存查看与分析
2010-08-07 17:03 22389业界有很多强 ... -
java动态代理之cglib
2010-06-22 17:27 2751cglib是一个 ... -
java动态代理随笔二
2010-06-22 16:29 1835jdk的动态代 ... -
java动态代理随笔一
2010-06-22 14:49 2036先说一下java class的加载机制和与cla ... -
建设银行对接(五)
2010-02-09 17:34 2491public static void testVerify ... -
建设银行对接(四)
2010-02-09 17:32 3032上接“建设银行对接(三)”,javaeye的文章字数限制也太少 ... -
建设银行对接(三)
2010-02-09 17:24 3404前面两章请见我的博客 对建行返回的数据进行数字签名 ...
相关推荐
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
关于hashCode()和equals()的本质区别和联系.doc
在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 hashCode()和equals()定义在Object类中,这...
本文档详细介绍了set接口为什么会用到hashCode和equals方法以及这两个方法的一些探讨 set不同的实现类用到的这两个方法也不同
java中hashcode和equals的详解.pdf
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
重写equals和hashcode方法,学习和进步
hashcode、equals、==总结1简单总结.txt,他们之间的区别
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
更清楚的了解hashcode()和equals()方法。
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
hashcode()和equals() 博客地址:https://blog.csdn.net/qq_36963950/article/details/107543471
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。下面这篇文章主要给大家介绍了关于java中hashCode、equals的使用方法,需要的朋友可以参考下。
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
主要介绍了详解hashCode()和equals()的本质区别和联系,本文先对两种方法作了介绍,然后对二者联系进行分析,具有一定参考价值,需要的朋友可以了解下。
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用以及equals()和==的区别,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。总的来说,Java中的集合(Collection)有两类,...