一、 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. React中的代码分割

    代码分割想要解决的问题是:经打包工具

  2. CF 700E

    构建后缀自动机,求出后缀树 比较明显的dp 设 \(f[i]\) 表示从上而下到达当前点能够满足条件的最优值 只需要检查父亲节点是否在当前串中出现过两次就行了 这个判断用 \(endpos\) 来判断 ...

  3. 牛客假日团队赛2 H.奶牛排序

    链接: https://ac.nowcoder.com/acm/contest/924/H 题意: 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾 ...

  4. HDU-2119-Matrix(最大匹配)

    链接:https://vjudge.net/problem/HDU-2119#author=Smilencer 题意: 众所周知,tyz是一个写bug小能手,以至于如果没有队友的帮助,就ac不了程序. ...

  5. IO扩展芯片

    PCF8574:一个I2C接口+INT中断引脚口扩展出一个可输出输出的并口P0~P7,INT可以用于中断响应

  6. mysql 5.1 在Windows下重置root 用户密码

    在windows下:打开命令行窗口,停止mysql服务(这里不用进入mysql目录): net stop mysql 进入mysql安装目录的bin文件夹下 执行: mysqld --skip-gra ...

  7. redis启动内存不足

    redis-server.exe redis.windows.conf  --maxheap 2gb

  8. redis和mysql同步 终极解决方案

    使用Canal,类似mysql的主从复制,实时更新 具体使用之后更新

  9. nio aio netty区别

    传统io就是bio     同步阻塞         但可以采用伪同步 nio  jdk1.7以前     同步非阻塞io     1.7以后     同步异步非阻塞                  ...

  10. 机器学习框架ML.NET学习笔记【9】自动学习

    一.概述 本篇我们首先通过回归算法实现一个葡萄酒品质预测的程序,然后通过AutoML的方法再重新实现,通过对比两种实现方式来学习AutoML的应用. 首先数据集来自于竞赛网站kaggle.com的UC ...