深度解析对象的hashcode和equals的差异,以及String的内存分配方式
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的内存分配方式的更多相关文章
- 两个对象的 hashCode()或equals相同,equals或hashCode不一定相同--《案例演示》
两个对象的 hashCode()或equals相同,equals或hashCode不一定相同 1.两个对象的equals相同,hashCode不一定相同 在重写equals方法,未重写hashCode ...
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...
- GlusterFS源代码解析 —— GlusterFS 内存分配方式
原文地址:http://blog.csdn.net/wangyuling1234567890/article/details/24564891 GlusterFS 的内存分配主要有两种方式,一种是内存 ...
- 集合框架比较两个对象是否相同(equals和hashCode方法)
package com.dcz.hashset; import java.util.HashSet; import java.util.Set; /** * HashSet是接口最常用的实现类,顾名思 ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- hashcode和equals方法的区别和联系
说到 hashcode就要和Java中的集合,HashSet,HashMap 关系最为密切. 首先附录两张Java的集合结构图: 图二:(上图的简化版) 从Set集合的特点说起 & Set是如 ...
- Java中Set的contains()方法——hashCode与equals方法的约定及重写原则
转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...
- 8.JVM内存分配机制超详细解析
一.对象的加载过程 之前研究过类的加载过程.具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html 那么,当一个对象被new的时候,是如何加 ...
- 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
随机推荐
- python tempfile 创建临时目录
一.tempfile介绍 该模块创建临时文件和目录.它适用于所有支持的平台.TemporaryFile,NamedTemporaryFile,TemporaryDirectory,和SpooledTe ...
- Spring Boot 自动装配原理
Spring Boot 自动装配原理 Spring Boot 在启动之前还有一系列的准备工作,比如:推断 web 应用类型,设置初始化器,设置监听器,启动各种监听器,准备环境,创建 applicati ...
- 我的开源GIS解决方案之路
好久没更新了,因为我在--憋--大--招--,对,就是今天这篇. 今天跟大家分享一下我的开源GIS解决方案经历. --额-- 考虑到单聊技术解决方案你可能会很快睡着,所以我今天会把重点放在我封装地图A ...
- java例题_50 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。
1 /*50 [程序 50 文件 IO] 2 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 3 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放 ...
- Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step
翻译自 Mohamad Lawand 2021年1月22日的文章 <Asp Net Core 5 Rest API Authentication with JWT Step by Step> ...
- Class类文件结构--访问标志
访问标志的位置:在常量池结束之后的两个字节(16位)表示访问标志access_flags. 访问标志的作用:用于标识类或者接口层次的访问信息:比如该Class是类还是接口,是否为public类型.是否 ...
- OOJML系列总结
目录 0x0 JML理论相关 0.0 概念及作用 0.1 JML语法学习 0x1 使用openJml以及JMLUnitNG 1.0 使用openjml 1.1使用JMLUnitNG 0x2 作业架构设 ...
- Netcore webapi action swagger response返回参数使用匿名类型
问题:action中返回匿名对象时,swagger只能按强类型生成返回值描述 解决办法:使用roslyn在内存中动态执行代码,使用json.net反序列化匿名对象,向swagger返回动态匿名对象 效 ...
- 期末考试复习c#时总结的抽象类与接口的一些区别
抽象类: (1)抽象类中可以定义抽象方法,属性,变量 (2)抽象类的派生类必须实现所有的抽象方法.要求所有的派生非抽象类都要用override重写实现抽象方法. (3)抽象类可以存放抽象方法,属性,也 ...
- Spring Boot demo系列(四):Spring Web+Validation
2021.2.24 更新 1 概述 本文主要讲述了如何使用Hibernate Validator以及@Valid/@Validate注解. 2 校验 对于一个普通的Spring Boot应用,经常可以 ...