Java--equals和 == 的比较和equals()、HashCode()的重写
一、 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()的重写的更多相关文章
- JAVA中的各种 哈希码(HashCode) 与 equals方法在HIBERNATE的实际应用[转载]
1.什么是哈希码(HashCode) 在Java中,哈希码代表对象的特征.例如对象 Java代码 String str1 = “aa”, str1.hashCode= 3104 String str2 ...
- Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系
在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...
- 【Java实战】源码解析为什么覆盖equals方法时总要覆盖hashCode方法
1.背景知识 本文代码基于jdk1.8分析,<Java编程思想>中有如下描述: 另外再看下Object.java对hashCode()方法的说明: /** * Returns a hash ...
- java中equals与hashCode的重写问题
这几天有一个朋友问我在重写equals和hashCode上出现了问题,最后我帮她解决了问题,同时也整理出来分享给大家 现上Object的equals与HashCode的代码 public boolea ...
- 覆盖equals的时候总要覆盖hashCode
import java.util.HashMap; public class Student { private String name ; private String id; public Stu ...
- 第九条:覆盖equals方法时总要覆盖hashCode方法
Object类的hashCode方法: public native int hashCode(); 是一个本地方法. 其中这个方法的主要注释如下: Whenever it is invoked o ...
- 关于HashSet的equals和hashcode的重写
关于HashSet的equals和hashcode的重写:package Test; import java.util.HashSet; import java.util.Set; public cl ...
- 关于equals与hashcode的重写
我想写的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法 2.在什么情况下需要重写hashCode()方法和equals()方法 3.如何重写这两个方法 **** ...
- Java,哈希码以及equals和==的区别
从开始学习Java,哈希码以及equals和==的区别就一直困扰着我. 要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方法还是S ...
随机推荐
- BestCoder Round #81 (div.2) 1003 String
题目地址:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=691&pid=1003题意:找出一个字符串满足至少 ...
- Web自动化测试—PO设计模式(一)
前言 很多的测试同学懂得使用selenium进行Web自动化测试, 但是不知道如何去写一个测试框架,或者说是一个容易维护的web自动化项目. 自己写一个最基本的web自动化测试框架需要会什么? 1. ...
- Java中
- tomcat7 fail to start inside Ubuntu Docker container
The tomcat startup script needs some special privileges. Concrete it needs to check all running proc ...
- github新手指南
- 移动端之js控制rem,适配字体
方法一:设置fontsize 按照iphone 5的适配 1em=10px 适配320 // “()()”表示自执行函数 (function (doc, win) { var docEl = ...
- NodeJS学习视频
腾讯课堂初级课程 https://ke.qq.com/webcourse/index.html#course_id=196698&term_id=100233129&taid=1064 ...
- Tomcat一
Tomcat是如何处理http请求的 Tomcat有什么用? Tomcat是一个应用服务器,也是一个Servlet容器,用来接收前端传过来的请求,并将请求传给Servlet,并将Servlet的响应返 ...
- rest_framework组件之认证,权限,访问频率
共用的models from django.db import models # Create your models here. class User(models.Model): username ...
- PHP 获取JSON json_decode返回NULL解决办法
在用json_decode对JSON格式的字符串进行解码时竟然为空,页面空白啊,整半天检查这里检查那里,问同事都没用. 今天必应搜索了下,问题解决了,原来是有BOM头输出,大虾的解决办法如下: 1). ...