Java 中的 ==, equals 和 hashCode 的区别和联系.doc

Java 中的 ==, equals 和 hashCode 的区别和联系.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java中的==,equals与hashCode的区别与联系 (文章来源:北大青鸟成都锦江) 一、概述 1、概念 == :?该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals :?Object 的?实例方法,比较两个对象的content是否相同 hashCode :?Object 的?native方法?, 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数 二、关系操作符 == 1、操作数的值 基本数据类型变量 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte) 字符型: char(2 byte) 布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值”true”和”false”) 对于这八种基本数据类型的变量,变量直接存储的是“值”。因此,在使用关系操作符 == 来进行比较时,比较的就是“值”本身。要注意的是,浮点型和整型都是有符号类型的(最高位仅用于表示正负,不参与计算【以 byte 为例,其范围为 -2^7 ~ 2^7 - 1,-0即-128】),而char是无符号类型的(所有位均参与计算,所以char类型取值范围为0~2^16-1)。 引用类型变量? 在Java中,引用类型的变量存储的并不是“值”本身,而是与其关联的对象在内存中的地址。比如下面这行代码, String str1; 这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。?   而通过 new 来产生一个对象,并将这个对象和str1进行绑定: str1= new String(hello); 那么 str1 就指向了这个对象,此时引用变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串”hello”。这里面的引用和 C/C++ 中的指针很类似。 2、小结 因此,对于关系操作符 ==: 若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的值是否相等 若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同。也就是说,若此时返回true,则该操作符作用的一定是同一个对象。 三、equals方法 1、来源?   equals方法是基类Object中的实例方法,因此对所有继承于Object的类都会有该方法。?   ?   在 Object 中的声明: public boolean equals(Object obj) {} 2、equals方法的作用?  初衷 :?判断两个对象的?content?是否相同 为了更直观地理解equals方法的作用,我们先看Object类中equals方法的实现。 public boolean equals(Object obj) { return (this == obj); } 很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。 但我们都知道,下面代码输出为 true: public class Main { public static void main(String[] args) { String str1 = new String(hello); String str2 = new String(hello); System.out.println(str1.equals(str2)); } } 原来是 String 类重写了 equals 方法: public boolean equals(Object anObject) { // 方法签名与 Object类 中的一致 if (this == anObject) { // 先判断引用是否相同(是否为同一对象), return true; } if (anObject instanceof String) { // 再判断类型是否一致, // 最后判断内容是否一致. String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; }

文档评论(0)

0520 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档