java于==、equals()、hashCode()和比较两个对象。

  1. 关于==

    ==是easy理解的。java设计java就是要比較两个对象是不是同一个对象。

    对于引用变量而言。比較的时候两个引用变量引用的是不是同一个对象。即比較的是两个引用中存储的对象地址是不是一样的。

    对于基本数据类型而言,比較的就是两个数据是不是相等,没什么歧义。

    因为对于基本数据类型而言。没有方法,所以不存在equal()和hashCode()的问题。以下的讨论都是针对引用类型而言的。

  2. 关于equals()

    为什么java会设计equals()方法?

    ==比較的是两个对象是否是同一个对象,这并不能满足非常多需求。

    有时候当两个对象不==的时候,我们仍然会觉得两者是“相等”的。比方对于String对象,当两个对象的字符串序列是一直的,我们就觉得他们是“相等”的。

    对于这种需求,须要equals()来实现。对于有这种需求的对象的类,重写其equals()方法便可,详细的“相等”逻辑能够依据须要自定义。

    须要注意的地方

    Object中equals()的默认实现是比較两个对象是不是==,即其和==的效果是同样的。

    java提供的某些类已经重写了equals()方法。

    自己写的类,假设须要实现自己的“相等”逻辑,须要重写equals()方法。

  3. 关于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差额的更多相关文章

  1. Java:重写equals()和hashCode()

    Java:重写equals()和hashCode() 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instan ...

  2. java中equals和hashCode方法随笔二

    前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...

  3. Java中equals和hashcode的区别?

    Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...

  4. java中equals和hashCode方法的解析

    解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...

  5. Java实战equals()与hashCode()

    一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...

  6. java的equals()与hashCode()以及包装类中的实现

    1. hashcode 1.1 hashcode来源 1.2 hashcode的形式 1.3 hashcode目的 1.4 hashcode规则 1.5 hashcode作用体现 1.6 重写hash ...

  7. java ==、equals、hashcode有什么区别

    1.== 用来比较两个对象的存储空间 2.equals是Object类提供的方法之一,每个java类都继承Object类,所以每一个对象都具有equals方法,所以在没有覆盖equals方法的情况下, ...

  8. java学习-- equals和hashCode的关系

    hashcode的目的就是在hashset或者hashmap等中比较两个对象相等时,减少equals的使用次数来提高效率 以下为摘录 java中hashcode和equals的区别和联系 HashSe ...

  9. Java中equals,hashcode

         在Java语言中,Object对象中包含一个equals和hashCode方法,其中hashCode方法是由JVM本地代码(native code)实现的,返回值是一个有符号的32位整数,对 ...

随机推荐

  1. VB.NET<机房收费系统个人重构版>你都学会了什么(之五)

    接着上篇我们说的配置文件,今天我们来说一下接口. 1.UML图 2.三层架构 3.Sqlhelper 4.配置文件 5.接口 6.设计模式 什么是接口呢?我们可以将接口理解为用于沟通的中介的抽象化.可 ...

  2. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

  3. sha256

    SHA-512 (这些有时候也被称做 SHA-2). 简介 SHA 家族 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技 ...

  4. Kaggle—Digit Recognizer竞赛

    Digit Recognizer 手写体数字识别  MNIST数据集 本赛 train 42000样例 test 28000样例,原始MNIST是 train 60000 test 10000 我分别 ...

  5. currentstyle和getComputedStyle兼容问题

    currentStyle:获取计算后的样式,也叫当前样式.终于样式. 长处:能够获取元素的终于样式,包含浏览器的默认值,而不像style仅仅能获取行间样式,所以更经常使用到. 注意:不能获取复合样式如 ...

  6. VSTO 学习笔记(十)Office 2010 Ribbon开发

    原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...

  7. Cocos2dx 3.0 过渡篇(二十六)C++11多线程std::thread的简单使用(上)

    昨天练车时有一MM与我交替着练,聊了几句话就多了起来,我对她说:"看到前面那俩教练没?老色鬼两枚!整天调戏女学员."她说:"还好啦,这毕竟是他们的乐趣所在,你不认为教练每 ...

  8. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  9. jQuery中的getJSON()

    json文件是一种轻量级的数据交互格式.一般在jQuery中使用getJSON()方法读取. $.getJSON(url,[data],[callback]) url:json文件地址 data:可选 ...

  10. Redis 安装与简单示例(转)

    本文转载自:http://www.cnblogs.com/kissdodog/p/3570984.html Redis的安装 Redis下载地址如下:https://github.com/dmajki ...