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的内存分配方式的更多相关文章

  1. 两个对象的 hashCode()或equals相同,equals或hashCode不一定相同--《案例演示》

    两个对象的 hashCode()或equals相同,equals或hashCode不一定相同 1.两个对象的equals相同,hashCode不一定相同 在重写equals方法,未重写hashCode ...

  2. 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重

    Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...

  3. GlusterFS源代码解析 —— GlusterFS 内存分配方式

    原文地址:http://blog.csdn.net/wangyuling1234567890/article/details/24564891 GlusterFS 的内存分配主要有两种方式,一种是内存 ...

  4. 集合框架比较两个对象是否相同(equals和hashCode方法)

    package com.dcz.hashset; import java.util.HashSet; import java.util.Set; /** * HashSet是接口最常用的实现类,顾名思 ...

  5. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  6. hashcode和equals方法的区别和联系

    说到 hashcode就要和Java中的集合,HashSet,HashMap 关系最为密切. 首先附录两张Java的集合结构图: 图二:(上图的简化版) 从Set集合的特点说起 & Set是如 ...

  7. Java中Set的contains()方法——hashCode与equals方法的约定及重写原则

    转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...

  8. 8.JVM内存分配机制超详细解析

    一.对象的加载过程 之前研究过类的加载过程.具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html 那么,当一个对象被new的时候,是如何加 ...

  9. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

随机推荐

  1. 一招教你写博客,Typora+PicGo+阿里云oss,最好用的Markdown+最好用的图床工具!

    博客 写博客的好处 1.使自己变得更善于观察.一旦你养成了记博客的习惯,与此同时你也赋予了一个更好的机会给自己,让自己去更细致地观察生活.一个人的生活经历本就是价值连城的,从中学习到的知识,教训更是异 ...

  2. 策略枚举:消除在项目里大批量使用if-else的正确姿势

    文/朱季谦 想起刚开始接触JAVA编程的时候,若遇到大量流程判断语句,几乎满屏都是if-else语句,多得让自己都忘了哪里是头,哪里是尾,但是,纵然满屏是if-else,但彼时也没有觉得多别扭.等到编 ...

  3. 如何开发一个APP——转自知乎

    作者:简单点链接:https://www.zhihu.com/question/22999185/answer/155469014来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. Kafka 常见问题汇总

    Kafka 常见问题汇总 1. Kafka 如何做到高吞吐.低延迟的呢? 这里提下 Kafka 写数据的大致方式:先写操作系统的页缓存(Page Cache),然后由操作系统自行决定何时刷到磁盘. 因 ...

  5. MySQL常见的七种锁详细介绍()

    原地址: https://blog.csdn.net/Saintyyu/article/details/91269087

  6. oo第四单元作业总结暨课程总结

    oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

  8. 翻译:《实用的Python编程》09_01_Packages

    目录| 上一节 (8.3 调试) | 下一节 (9.2 第三方包) 9.1 包 如果编写一个较大的程序,我们并不真的想在顶层将其组织为一个个独立文件的大型集合.本节对包(package)进行介绍. 模 ...

  9. Java后端进阶-网络编程(Netty责任链Pipeline)

    设计模式-责任链模式 一个责任链模拟demo package com.study.hc.net.netty.demo; // -----链表形式调用------netty就是类似的这种形式 publi ...

  10. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...