Kruger上课讲到==和equals()方法是不同的,经过查询将具体内容整理一下,在查询过程中发现hashCode()方法与equlas()联系紧密,故一起研究。

比较浅显,以后如果理解更多随时更新。

以下一段代码主要解释==与equals的不同

String a = "nihao";

String b = "nihao";

String d = "niha";

String e = new String("nihao");

String f = new String("nihao");

System.out.println(a==b);//true

System.out.println(a==d);//false

System.out.println(a==e);//false

System.out.println(a.equals(e));//true

System.out.println(e==e);//true

System.out.println(e==f);//false

System.out.println(e.equals(f))//true

 

1. ==

== is a reference comparsion. Both objects point to the same memory location.

而且==用于基本类型,比如int,float等,比较的是值。

用于对象类型,==比较的是两个对象在JVM的地址。比如a和b,两者都是字符串“nihao”的引用,指向同一个地址。(与String是不可变类有关,其实a,b是两个相同的instance,见immutable class的解释)。a和d不同字符串的引用,地址不同。

new出来的对象地址存在于堆上,所以e与a地址不同。同理,e==f也是错误的。

2. equals()

equals will only compare what it is writtern to compare. If a class does not override the equals methods, it defaults to the equals(object o) methods(从最近的父类继承而来的)。如果都没有override,那么equals从根类Object中继承而来。默认的此方法也是比较对象地址。

但是有一些子类已经override这个方法,比如String。在这个类中,equals首先比较对象的JVM地址,如果是同一个对象的引用(e==e),那么对象相等,返回true。如果不是一个对象(比如a和e),equals会挨个比较字符串对象内的字符,完全一致返回true。具体可以查询equals方法的源代码。

这就可以解释为什么对于String类型,比较需要用equals。

以此类推Double、Inteter、Math,都是override equals(),比较的都是内容。

需要注意的是,equals是进行的类以及类内数值的比较,请不要用equals直接比较两个数值,比如:

double a =1;

double b = 1;

System.out.prinln(a.equals(b)); 很明显,这个statement就是错的。

Java语言对equals()有如下要求:
a:对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 
b:反射性:x.equals(x)必须返回是“true”。 
c:类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 
d:一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 
e:任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

3. hashCode()

Always remember to override hashCode if you override equals so as not to "break the constract". As per the API, the result returned from the hashCode() mehod for two objects must be the same if their equals methods shows that they ar equivalent. The converse is not necessairly.

hashCode也是根类Object中的方法,默认情况下返回对象的32为jvm内存地址。

下面来解释上面一段英文:

constract:hashCode方法的常规协定,标明相等对象必须具有相等的哈希码。(什么是哈希码?)因为哈希码通过hashCode检索对象。

如果override了equals方法,一定要override hashCode方法,如果不重写,Object对象中的hashcode方法始终返回的是一个对象的hash地址,而这个地址永远不相等,所以即使重写了equals,也不会有特定的效果。因为hashcode不相等的话就不会调用equals方法

Java ==,equals() 和hashCode的更多相关文章

  1. 总结Java equals()和hashCode()的联系

    Java equals()和hashCode()的联系 如果两个对象是相等的,那么它们必须有相同的哈希码. 如果两个对象具有相同的哈希码,他们可能相等,可能不相等. 如果两个对象是不同的类的实例 他们 ...

  2. java :equals()和hashcode()方法的结合使用

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  3. Java == ,equals 和 hashcode 的区别和联系(阿里面试)

    今天阿里的人问我 equals 与hashcode的区别,我答不上来, 仔细查了一下,做了总结: (1) == 这是Java 比较内存地址,就是内存中的对象: java中的==是比较两个对象在JVM中 ...

  4. Java equals 和 hashCode 的这几个问题可以说明白吗?

    前言 上一篇文章 如何妙用 Spring 数据绑定? ,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦 ...

  5. Java equals 和 hashcode 方法

    问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...

  6. Java equals() 和hashCode()方法详解

    Java的Object类中定义了equals方法,Object类中的equals方法源代码如下,从源代码中可以看出Object类中的equals方法是用来返回判断两个对象是否指向同一个对象(引用地址) ...

  7. java equals 与 hashCode

    转:http://m.blog.csdn.net/blog/pengchua/2297547# 如果你为某个类写了equals方法,那么应该同时编写hashCode方法.如果没有提供hashcode方 ...

  8. java equals 和hashcode

    1  如果不知道怎么重载hashcode, eclipse自动代码生成工具会帮助你生成,大概的思路是设定一个int prim,  然后根据各个成员的值或者hashcode值进行某种运算即可,具体什么运 ...

  9. java equals和hashcode方法

    equals()方法比较两个对象的引用是否相同 hashcode()方法比较两个对象的哈希码是否相同

  10. equals()与hashCode()方法协作约定

    翻译人员: 铁锚 翻译时间: 2013年11月15日 原文链接: Java equals() and hashCode() Contract 图1 Java所有对象的超类 java.lang.Obje ...

随机推荐

  1. Aspcms所有标签调用

    错误号3002: 出现此问题一般是有些频道模板不全,或者缺少一部分模板导致,或者没有单独设置html文件夹,并将所有html页面放进去 基本语法 {aspcms:sitepath} 网站终极目录(可放 ...

  2. Com和DCOM

    COM,DCOM原理及应用 1.DCOM COM的进程透明特性表现在组件对象和客户程序即可以拥有各自的进程空间,也可以共享同一个进程空间,COM负责把客户的调用正确传到组件对象中,并保证参数传递的正确 ...

  3. bat中的连接符

    & [...] command1 & command2 用来分隔一个命令行中的多个命令.Cmd.exe 运行第一个命令,然后运行第二个命令. && [...] comm ...

  4. Azure Backup 简介

    ViswanathTata云 +Enterprise 项目经理 AzureBackup是 Azure恢复服务的一部分,在安全高效的环境中对上传到 Azure的数据提供简单可靠的管理和保护.Azur ...

  5. Charles抓Https的包

    1: 手机上打开这个地址, 安装文件. http://www.charlesproxy.com/getssl 2:保证手机与电脑在同一个网段 3:按住alt再点击wifi, 显示出当前电脑的ip地址. ...

  6. android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)

    Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...

  7. [CODEVS1116]四色问题

    题目描述 Description 给定N(小于等于8)个点的地图,以及地图上各点的相邻关系,请输出用4种颜色将地图涂色的所有方案数(要求相邻两点不能涂成相同的颜色) 数据中0代表不相邻,1代表相邻 输 ...

  8. ArrayLLis 线程不安 实验

    这段代码演示了ArrayList的线程不安全,我让3个线程分别对list加入300个字符串,最后的arr的大小为800多,大家可以测试一下,我的一次是898,一次是897,同时还学了join的用法 i ...

  9. Windows Azure 的磁盘管理相关概念

    在 Windows Azure 的虚拟机中,磁盘有多种使用方式.操作系统磁盘是用来为虚拟机提供操作系统的虚拟硬盘.数据磁盘是附加到虚拟机上用来存储应用程序数据的 VHD. 根据应用程序的需要,可从多种 ...

  10. Visual Studio的.NET内存分配分析器解析

    Visual Studio 2012拥有丰富的有价值的功能,以至于我听到开发者反馈的需要的新功能新版本已经有了.另外,我听到开发人员询问具体的功能的某个特性,实际上他真正需要的是另外一个功能点. 上面 ...