==、equals()、hashcode()的关系和区别
==、equals()、hashcode()概念
==:它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不试同一个对象。
equals():它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1,类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况2,类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
hashcode():获取哈希码,也称为散列码.是一个本地native方法,返回的是对象引用中存储的对象的内存地址
equals()、hashcode()关系
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性。
重写equals()方法就必须重写hashCode()方法的原因
重写equals()方法就必须重写hashCode()方法主要是针对HashSet和Map集合类型。集合框架只能存入对象(对象的引用(基本类型数据:自动装箱))。
在向HashSet集合中存入一个元素时,HashSet会调用该对象(存入对象)的hashCode()方法来得到该对象的hashCode()值,然后根据该hashCode值决定该对象在HashSet中存储的位置。简单的说:HashSet集合判断两个元素相等的标准是:两个对象通过equals()方法比较相等,并且两个对象的HashCode()方法返回值也相等。如果两个元素通过equals()方法比较返回true,但是它们的hashCode()方法返回值不同,HashSet会把它们存储在不同的位置,依然可以添加成功。同样:在Map集合中,例如其子类Hashtable,HashMap,存储的数据是<key,value>对,key,value都是对象,被封装在Map.Entry,即:每个集合元素都是Map.Entry对象。在Map集合中,判断key相等标准也是:两个key通过equals()方法比较返回true,两个key的hashCode的值也必须相等。判断valude是否相等equal()相等即可。
最新文章
- ORACLE等待事件: log file parallel write
- VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT连接方式)
- javascript里面this机制的几个例子
- codeforces589J 简单dfs,队列
- IOS开发中NSRunloop跟NSTimer的问题
- WP8.1 Study3:WP8.1中Animation应用
- 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)
- LeetCode_Binary Tree Inorder Traversal
- 学习PHP一个月的感受
- 【转】嵌入式C语言调试开关
- 利用window.performance.timing进行性能分析
- JavaSSM框架整合
- ubuntu 14.04 安装python包psycopg2
- js中Math之random,round,ceil,floor的用法总结
- 修改tomcat启动窗口的名称
- 自然语言处理nlp工具
- <;基础>; PHP 进阶之 类(Class)
- PHP + Ajax处理大数据查询并导出Excel
- BZOJ 4520: [Cqoi2016]K远点对
- 2015InfoQ软件大会技术记录