码迷,mamicode.com
首页 > 其他好文 > 详细

深度解析对象的hashcode和equals的差异,以及String的内存分配方式

时间:2021-05-24 04:29:52      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:效率   类型   ==   equal   ring   相同   比较   散列   要求   

Q:Java对象的hashcode是怎么得到的

A:Java对象的hashcode是native方法,不是通过Java实现的。hashcode的值是根据对象的内存地址得到的一串数字。

Q:如果两个对象的hashcode相等,那么两个对象的==是否也想等?

A:不一定,这个说法顺序弄反了。应该改为:如果两个对象的==想等,那么两个对象的hashcode也相等。(hashcode是根据对象的内存地址算出来的)

Q:如果两个对象的equals相等,那么两个对象的hashcode是否相等?

A:不一定,如果这个对象是Object类或者没有重写过equals方法,那么这个说法就是正确的。Object的equals方法比对的是==。如果手动重写过equals方法,hashcode的值就不一定是相等的了。

Q:为什么要求重写equals的时候,也要求重写hashcode?

A:hashcode有一个规则(当两个对象相等的时候,两个对象的hashcode也要相等)。1、为了提升对象的比对效率:equals比对往往是比较复杂的,hashcode的比较效率更高;2、为了适配散列集合的使用:hash值的计算使用了hashcode,如果两个对象相等,但是hashcode不同就会存入重复的数据。这样的结构有hashmap、hashset、hashtable等。
PS(参与equals计算的字段,必须也要参与hashcode计算)

Q:String的hashcode相等吗?

A:String是使用效率非常高的一个类型,为了提升字符串的利用效率会重复使用相同的字符串。1、String s1 = "hello"; String s2 = "hello"; s1和s2指向的内存地址相同,共同指向方法区的"hello",所以它们的内存地址相同,hashcode也相同。即true = (s1 == s2);true = (s1.hashCode() == s2.hashCode())。 2、String s1 = "hello"; String s3 = new String("hello");s1指向方法区的"hello",s3指向堆内存对象;所以s1和s3的内存地址不同,但是s1和s3的值相同,String重写的hashcode方法是根据String值计算出来的,所以s1和s3的hashcoe相同,即:true != (s1 == s3),true =(s1.hashCode == s3.hashCode())。

PS:new String("hello")的内存分配经历了什么?

Answer:首先JVM会去方法区查看是否存在"hello",如果不存在则会在方法区中创建一个"hello",然后在堆内存中分配一个空间创建String对象,并将方法区的"hello"拷贝一份到堆内存

深度解析对象的hashcode和equals的差异,以及String的内存分配方式

标签:效率   类型   ==   equal   ring   相同   比较   散列   要求   

原文地址:https://www.cnblogs.com/deer-hang/p/14751429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!