java中间==、equals和hashCode差额
java于==、equals()、hashCode()和比较两个对象。
关于==
==是easy理解的。java设计java就是要比較两个对象是不是同一个对象。
对于引用变量而言。比較的时候两个引用变量引用的是不是同一个对象。即比較的是两个引用中存储的对象地址是不是一样的。
对于基本数据类型而言,比較的就是两个数据是不是相等,没什么歧义。
因为对于基本数据类型而言。没有方法,所以不存在equal()和hashCode()的问题。以下的讨论都是针对引用类型而言的。
关于equals()
为什么java会设计equals()方法?
==比較的是两个对象是否是同一个对象,这并不能满足非常多需求。
有时候当两个对象不==的时候,我们仍然会觉得两者是“相等”的。比方对于String对象,当两个对象的字符串序列是一直的,我们就觉得他们是“相等”的。
对于这种需求,须要equals()来实现。对于有这种需求的对象的类,重写其equals()方法便可,详细的“相等”逻辑能够依据须要自定义。
须要注意的地方
Object中equals()的默认实现是比較两个对象是不是==,即其和==的效果是同样的。
java提供的某些类已经重写了equals()方法。
自己写的类,假设须要实现自己的“相等”逻辑,须要重写equals()方法。
关于hashCode()
为什么会设计hashCode()方法?
hashCode()方法返回的就是一个数值。我们称之为hashCode吧。
从方法的名称上就能够看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此非常easy判断出,我们须要每一个对象的hash码尽可能不同。这样才干保证散列的存取性能。其实,Object类提供的默认实现确实保证每一个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。
分析到这个地方,看似没什么问题,三者的作用非常清晰,好像他们之间也没什么关系。
在java的规范上。hashCode()方法和equals()方法确实能够没有关系。
可是!!!
!
!!!!有一个问题。
问题例如以下:对于集合类HashSet、HashMap等和hash有关的类(以HashSet为例),是通过hash算法来散列对象的。
对HashSet而言,存入对象的流程为:依据对象的hash码,经过hash算法。找到对象应该存放的位置,假设该位置为空,则将对象存入该位置;假设该位置不为空,则使用equals()比較该位置的对象和将要入的对象,假设两个相等,则不再插入,假设不相等,依据hash冲突解决算法将对象插入其它位置。
而java规定对于HashSet推断是不是反复对象就是通过equals() 方法来完毕,这就须要在两个对象equals()方法相等的时候,hash码一定相等(即hashCode()返回的值相等)。如果两个对象equals()方法相等的时候,hash码不相等,会出现equals()相等的两个对象都插入了HashSet中,这时不同意的。从而我们有了一下的结论:
结论:对于equals()相等的两个对象,其hashCode()返回的值一定相等一下
版权声明:本文博主原创文章,博客,未经同意不得转载。
java中间==、equals和hashCode差额的更多相关文章
- Java:重写equals()和hashCode()
Java:重写equals()和hashCode() 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instan ...
- java中equals和hashCode方法随笔二
前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...
- Java中equals和hashcode的区别?
Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...
- java中equals和hashCode方法的解析
解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...
- Java实战equals()与hashCode()
一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...
- java的equals()与hashCode()以及包装类中的实现
1. hashcode 1.1 hashcode来源 1.2 hashcode的形式 1.3 hashcode目的 1.4 hashcode规则 1.5 hashcode作用体现 1.6 重写hash ...
- java ==、equals、hashcode有什么区别
1.== 用来比较两个对象的存储空间 2.equals是Object类提供的方法之一,每个java类都继承Object类,所以每一个对象都具有equals方法,所以在没有覆盖equals方法的情况下, ...
- java学习-- equals和hashCode的关系
hashcode的目的就是在hashset或者hashmap等中比较两个对象相等时,减少equals的使用次数来提高效率 以下为摘录 java中hashcode和equals的区别和联系 HashSe ...
- Java中equals,hashcode
在Java语言中,Object对象中包含一个equals和hashCode方法,其中hashCode方法是由JVM本地代码(native code)实现的,返回值是一个有符号的32位整数,对 ...
随机推荐
- 祝贺自己itpub和csdn双双荣获专家博客标题
这是业界难以得到认同内的技能,记录下来.油...所有的钱,明天会更好.
- spring中bean的设计模式
默认的是单例的. 如果不想单例需要如下配置: <bean id="user" class="..." singleton="false" ...
- VMwave下Ubuntu扩展磁盘空间
VMwave下Ubuntu扩展磁盘空间 Ubuntu原预装磁盘空间20G,随着系统安装软件越来越多,空间慢慢不够用. 打算安装DB2,许扩展磁盘空间. 环境: No LSB modules are a ...
- Android 实现环形进度按钮circular-progress-button
※效果 ※简单介绍 显示运行进度的button,可用于数据的提交.系统登录等.动画效果非常棒.提高用户体验. ※使用说明 Declare button inside your layout XML f ...
- 从iReport至Jaspersoft Studio
这篇文章同步到http://www.waylau.com/from-ireport-to-jaspersoft-studio/ 从5.5版本号開始,Jaspersoft Studio将代替iRepor ...
- javascript面向对象程序设计
在学习js面向对象编程之前,首先须要知道什么是面向对象.面向对象语言都有类的概念,通过它能够创建具有同样属性和方法的对象.但js并没有类的概念,因此js中的对象和其它语言的对象有所不同. js对象能够 ...
- nginx.conf 文中描述的配置文件
###############################nginx.conf 件里文说明 #user nobody; # user 主模块指令,指令nginx worker 执行用户和用户组(u ...
- Android 调用谷歌语音识别
調用谷歌语音识别其实很简单,直接利用 intent 跳转到手机里面的谷歌搜索 代码也很简单,直接调用方法 startVoiceRecognitionActivity() 如果大家手机里面没有谷歌搜索, ...
- Qrcode生成二维码支持中文,带图片,带文字
1.下载Qrcode库源码, 下载地址:http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library2.打开源码时, 部分类 ...
- redis来共享各个服务器的session,并同时通过redis来缓存一些常用的资源,加快用户获得请求资源的速度(转)
时间过得真快,再次登录博客园来写博,才发现距离上次的写博时间已经过去了一个月了,虽然是因为自己找了实习,但这也说明自己对时间的掌控能力还是没那么的强,哈哈,看来还需不断的努力啊!(这里得特别说明一下本 ...