这里分别讲==和equals()的关系,以及equals()和hashcode()的关系

讲解之前,需要先明白对象的内容、对象的引用,基本类型,引用类型这几个概念,此处不做解释

一、==和equals()

两者都是比较"是否相同"这个概念。不同在于

1、基本类型比较是否相同用 == 和 !=

2、对象使用==时比较的是对象的引用,默认的Object.equals()比较对象引用地址,如果想比较对象的内容

那么需要覆盖equals()方法,大多数Java类库特别是"表示值得类",都实现了自己的equals()方法,比如最常见的Integer和String

3、Effective Java第8条花了大篇幅讲解覆盖equals需要遵守的通用约定,并给出了证明,这5个约定是:

自反性,对称性,传递性,一致性,以及对任何的非null的x,x.equals(null)必为false

二、equals()和hashcode()

Effective Java给出的另一个告诫(实际上编程思想中也有同样的要求):覆盖equals时总要覆盖hashCode

Object规范的第二条:相等的对象必须具有相等的散列码

很明显:equals为true的两个对象的hashcode()方法必须产生相等的整数结果

但是:equals结果为false的两个对象,不一定要产生不同的hashcode结果,意思就是hashcode可以相等

三、理解hashCode()

编程思想一书在讲解hashcode时这样描述,"使用散列的目的在于,想要使用一个对象来查找另一个对象;散列的价值在于速度",

设想一下执行HashMap的get(Object key)时,键如果没有按照一定的顺序保存,我们的get操作将变得机器缓慢,散列得以保持键

的排序状态,然后使用Collections.binarySearch()进行查询,注意,这里保存的是键的数字(散列码)而非键本身,前面讲过,不

同的键可能会得到相同的散列码,设计好的散列函数能最大限度保证散列码的不同,特殊情况,散列码仍然有相同的,将使用到

链地址法,有兴趣的可以阅读HashMap的实现源码

Java基础拾遗(二) — 关于equals(),hashcode()和 ==的更多相关文章

  1. Java基础拾遗(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358523冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

  2. java基础解析系列(十一)---equals、==和hashcode方法

    java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...

  3. Java基础拾遗(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76358391冷血之心的博客) 马上就要秋招了,新的一轮笔试面试马上 ...

  4. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  5. JAVA基础(二)—— 常用的类与方法

    JAVA基础(二)-- 常用的类与方法 1 Math类 abs ceil floor 绝对值 大于等于该浮点数的最小整数 小于等于该浮点数的最大整数 max min round 两参数中较大的 两参数 ...

  6. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  7. java基础(二章)

    java基础(二章) 一,变量 1.变量是内存中的一个标识符号,用于存储数据 2.变量命名规则 l  必须以字母.下划线 _ .美元符号 $ 开头 l  变量中,可以包括数字 l  变量中,不能出现特 ...

  8. Java基础十二--多态是成员的特点

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...

  9. java基础-多线程二

    java基础-多线程二 继承thread和实现Runnable的多线程每次都需要经历创建和销毁的过程,频繁的创建和销毁大大影响效率,线程池的诞生就可以很好的解决这一个问题,线程池可以充分的利用线程进行 ...

随机推荐

  1. 判断有向无环图(DAG)

    1.拓扑排序 bfs 所有入度为0的先入选. 2.tarjan 1个点1个集合 3.暴力 一个点不能重新到达自己

  2. 使用 async await 封装微信小程序HTTP请求

    1. 编写将普通回调函数形式的方法转换为promise方法的promisic方法 // util.js const promisic = function (func) { return functi ...

  3. mysql服务命令行操作

    启动 net start mysql 关闭 net stop mysql 登陆 mysql -hlocalhost -uusername -ppassword 退出 exit 显示数据库 show d ...

  4. rasa学习(domain.yml、nlu.md、stories.md)(一)

    一. 什么是rasa Rasa是一个用于自动文本和基于语音的对话的开源机器学习框架.了解消息,保持对话以及连接到消息传递通道和API Rasa分为Rasa core和 Rasa nlu两部分: Ras ...

  5. NX二次开发-NXString转换为char*方法

    NX9+VS2012 #include <uf.h> #include <uf_drf.h> #include <NXOpen/Annotations_Note.hxx& ...

  6. error C2443: operand size conflict

    #include <stdio.h> void main() { int a=98; __asm {     mov al,a     and al,11011111B     mov a ...

  7. ionic-CSS:ionic Range

    ylbtech-ionic-CSS:ionic Range 1.返回顶部 1. ionic Range ionic Range 是一个滑块控件,ionic 为 Range 提供了很多种默认的样式.而且 ...

  8. 2D转换中的translate里调用matrix()的用法

    一开始,经常看到大佬们用matrix的方法,当时完全不会,不知道如何写.到后面,发现都是这样用,导致只能去认真看一下这个东西怎么用,要不然完全跟不上的节奏啊.因此建议大家去看下这篇文章,写的挺不错的, ...

  9. scrapy的使用-LinkExtractor

    背景: 在爬取网站信息是需要获取特定标签下的某些内容,就需要获取这些标签下的链接,如果获取每一个,在通过这个获取它下面的信息,这样效率会很低,时间复杂度O(n^2),但如果先获取链接,再获取内容,则时 ...

  10. 【POJ】1797 Heavy Transportation

    题目链接:http://poj.org/problem?id=1797 题意:n个城镇,m条路上能承载的最大重量.现在问你从1到n的最大承重量. 题解:spfa的变体. 假设当前1->当前点的承 ...