一、 equals和 == 的比较
1、== 运算符
① == 如果比较的是基本数据类型,则比较的是值。
② == 如果比较的是引用数据类型,则比较的是地址值。
2、equals
①它属于java.lang.Object类里面的方法,如果该方法没有被重写则等同于==。
②public boolean equals(Object obj),用于比较两个对象[即引用数据类型]是否相等。
注意:在使用中String的equals方法看似比较的值,其实是String重写了equals方法。
3.基本数据类型的包装类型的equals和==的使用
①基本数据类型和包装类型进行==比较时候,基本数据类型的包装类型会自动拆箱成基本数据类型,在进行数值比较,包装类型如:Integer a = 300;Integer aa = new Integer(300); int a0 = 300 a0和a、aa比较都是true。
②两个包装类型进行比较,如果期中一个封装类型是new出来的,二者进行比较返回false;如果过两个都是new出来的,则返回false,比较的是二者的地址。
③integer类型在-128----127非new 的值,从常量池中取,超出范围的用new获取。Integer a = 127,Integer aa = 127,a和aa进行==比较,得到true,Integer b = 128, Integer bb = 128, b和bb进行==比较,返回false。


④基本数据类型的封装类型调用equals(c)方法时,如果c是基本数据类型,c自动装箱,然后进行比较,如果类型一致比较值相等返回true,如果类型不一致返回false。Integer类重写了equals方法,比较类型和值。其他基本类型也一样!


二、 ==、equals、HashSet的使用
案例:

1、==比较的是new出来的对象,因此比较的是地址值,所以比较结果是false
2、a.equals(a2)调用的是String的equals()方法,由于String重写了equals的方法,所以这里比较的是值。

3、HashSet其实就是HashMap,HashMap其实就是比较的key的hashcode值,存入的values是常量值。
String重写了equals因此有相同的hashcode码,所以对hashSet就是一个值。会覆盖存储!



4、对于Person类没有重写equals()方法则,继承了Object的equals方法,比较的是地址值,所以new出来的是两个不同的对象,具有不同的hashcode码,HashSet的size值为2。16进制地址值不同。

三、 重写equals()方法时要重写HashCode()方法,31的含义?
1.在重写equals方法的类中,必须重写hashCode方法,如果不重写的话就会违反Object和hashCode的通用约定,导致无法结合所有基于散列码的集合一起正常运作,例如:HashMap、HashSet、HashTable。当一个类有自己特有的逻辑相等的概念,一个类的equals放发改写后,两个截然不同的实例,可能在逻辑上是相等的,根据Object.hashCode()方法,它们仅仅是两个对象。
违反了:相等的对象必须具有相等散列码。
因此:重写equals()时需要同时重写hashCode()方法。
2.hashCode中31的选取理由
①减少hash冲突,31是一个奇素数
②任何数a*31就可以被JVM优化为(a<<5)-a,移位和减法的效率要比乘法操作效率高的多,对于左移虚拟机中有相关优化。并且31只占用5bits。

四、 equals()和hashCode()重写
1.equals的重写步骤
①地址值相等,是同一个对象,是其本身
②判断是不是【所用对象】类型的对象
③比较需要比较的字段,string类型用equals,基本数据类型用==即可,如果是多个值进行比较,则用&&符号连接

2.hashCode的重写


重写之后的结果:

注意:如果不重写hashcode()会有地址值一致,hashcode的值不一致的情况,就是逻辑相等的情况,其实hashCode码不一样。

Java--equals和 == 的比较和equals()、HashCode()的重写的更多相关文章

  1. JAVA中的各种 哈希码(HashCode) 与 equals方法在HIBERNATE的实际应用[转载]

    1.什么是哈希码(HashCode) 在Java中,哈希码代表对象的特征.例如对象 Java代码 String str1 = “aa”, str1.hashCode= 3104 String str2 ...

  2. Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

    在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...

  3. 【Java实战】源码解析为什么覆盖equals方法时总要覆盖hashCode方法

    1.背景知识 本文代码基于jdk1.8分析,<Java编程思想>中有如下描述: 另外再看下Object.java对hashCode()方法的说明: /** * Returns a hash ...

  4. java中equals与hashCode的重写问题

    这几天有一个朋友问我在重写equals和hashCode上出现了问题,最后我帮她解决了问题,同时也整理出来分享给大家 现上Object的equals与HashCode的代码 public boolea ...

  5. 覆盖equals的时候总要覆盖hashCode

    import java.util.HashMap; public class Student { private String name ; private String id; public Stu ...

  6. 第九条:覆盖equals方法时总要覆盖hashCode方法

    Object类的hashCode方法: public native int hashCode();   是一个本地方法. 其中这个方法的主要注释如下: Whenever it is invoked o ...

  7. 关于HashSet的equals和hashcode的重写

    关于HashSet的equals和hashcode的重写:package Test; import java.util.HashSet; import java.util.Set; public cl ...

  8. 关于equals与hashcode的重写

    我想写的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法 2.在什么情况下需要重写hashCode()方法和equals()方法 3.如何重写这两个方法 **** ...

  9. Java,哈希码以及equals和==的区别

    从开始学习Java,哈希码以及equals和==的区别就一直困扰着我. 要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方法还是S ...

随机推荐

  1. 微信小程序实战

    为了积攒粉丝,公司决定做一个一分钱姓名测算的小程序引导大家关注公众号. 实现的需求就是  1 首页 用户编辑姓名和性别进行提交 2 测算结果页 实现分享和支付功能 3 测算历史页面 看到用户曾经测算记 ...

  2. easyui---accordion(手风琴)

    首先配置好easyui环境 1.ACCORDION(手风琴) class:class=easyui-accordion, 事件: 查找: function selectPanel(){ //会弹出输入 ...

  3. Codeforces 140E(排列组合、dp)

    要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ...

  4. 047 Permutations II 有重复数字的全排列

    给定一个可能包含重复数字的集合,返回所有可能的不同全排列.例如,[1,1,2] 有以下不同全排列:[  [1,1,2],  [1,2,1],  [2,1,1]] 详见:https://leetcode ...

  5. Linux下无法挂载U盘

    大概的错误信息是这样的: Error mounting /dev/sdb4 at /media/xxx/xx: Command-line`mount -t "ntfs" -o&qu ...

  6. Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集

    http://codeforces.com/contest/723/problem/D 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...

  7. VS2013使用EF6通过ADO.NET 连接mySql成功步骤

    VS2013使用EF6通过ADO.NET 连接mySql成功步骤 1.安装mysql-for-visualstudio-1.2.6(我用的目前最新版,这个一般安装VS2013就已经有了,没有的话下载一 ...

  8. IDEA对比文件

    和另一个文件对比:右击文件,选择另一个文件 和剪切板的内容对比:右击代码区域

  9. SharePoint Online和SharePoint 2016 导出到Excel 表错误

    导出到Excel是一个有用的SharePoint功能.偶尔您可能会遇到该功能无法正常工作的情况.有几个原因可能导致此功能无法正常工作. Problem #1 使用非32位Internet Explor ...

  10. LINQ 组合查询 和分页查询的使用

    前端代码 <%@ Page Language="C#" AutoEventWireup="true" Debug="true" Cod ...