你是谁啊?你是不是我??(⊙_⊙)?

我们知道比较对象相等可以使用equal方法(来自Object对象的方法)

但是你打开Object的equal方法你会发现:

public boolean equals(Object obj) {
return (this == obj);
}

现在我们有一个Student类

public class Student  {
private String name ;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}

如果我们使用默认的equals方法判断stu1和stu2两个对象,得到的结果是false。因为默认的equals方法是判断两个对象的内存地址,在没有重写equals方法时调用的就是对象的==,即内存地址。

public class Hello {
public static void main(String[] args) {
Student stu1 = new Student("小明",18);
Student stu2 = new Student("小明",18); System.out.println(stu1.equals(stu2));//false
System.out.println(stu1==stu2);//false
}
}

我怎么让你知道我就是你?

如果要让equals比较的不是内存地址而是两个对象的内容就要对equals方法进行重写(这里使用Eclipse自动的生成方法)

public class Student  {
private String name ;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} }

这里重写了equals方法和hashCode方法,为啥子还要重写equals方法,这个...这个o_o ...后面再说。

我们看到重写的equals方法比较了两个对象的属性是否相等,属性都相等就认为是同一个对象了。让我们再次测试刚才的相等判断。

public class Hello {
public static void main(String[] args) {
Student stu1 = new Student("小明",18);
Student stu2 = new Student("小明",18); System.out.println(stu1.equals(stu2));//ture
System.out.println(stu1==stu2);//false
System.out.println(stu1.hashCode());
System.out.println(stu2.hashCode());
}
}

结果:

true
false
758222
758222

可以看到两个对象进行equals判断结果已经为true了。同时两个对象也拥有相同的hashCode值,但是为啥要重写hashCode方法,这个hashCode值有啥用呢?

Object中的equals方法解释

其他解释参考:

浅谈Object的hashCode方法的作用

为什么HashCode对于对象如此的重要

总结 :

== 基本类型来说是值比较,引用类型来说是比较的是引用;

equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

Java对象相等判断的更多相关文章

  1. 判断Java对象存活的算法、垃圾回收算法

    判断Java对象存活的算法 一.引用计数算法 给对象添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减1,任何时刻计数器为0的对象都不可再被使用.这种算法虽然简单 ...

  2. Java对象的存活判断

    Java对象的回收是有依据的,普通的方式是计算法,比如被引用,对象计数器➕1,不被引用,➖1,回收的时候,发现是0则清除,但是不能解决两个对象互相被引用的情况,Java采用可达性分析,通过某个对象作为 ...

  3. Java:对象的强、软、弱、虚引用

    转自: http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...

  4. Java对象表示方式1:序列化、反序列化和transient关键字的作用

    平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...

  5. JSON字符串和java对象的互转【json-lib】

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  6. Java:对象的强、软、弱和虚引用

    1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...

  7. JavaScript进阶内容1:各种对象类型判断

    该文章主要用来介绍JavaScript中常用的一些对象检测判断方法,整理资源来自书本和网络,如有错误或说明不详之处,望评论提出,本菜定提名感谢……(本文章知识比较基础,大牛请提些意见再绕道,三克油^_ ...

  8. Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征

    以下情况java对象进入持久化状态: session.save()方法把临时对象转变为持久化对象. session.load()和session.get()方法得到的对象总是处于持久化状态. sess ...

  9. OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

    主键生成策略 sequence 数据库端 native 数据库端 uuid  程序端 自动赋值 生成的是一个32位的16进制数  实体类需把ID改成String 类型 assigned  程序端 需手 ...

  10. 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用

    转自:http://kakajw.iteye.com/blog/935226 一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是 ...

随机推荐

  1. SYSTEM表空间使用率高

    数据库监控告警,SYSTEM表空间使用率很高.检查发现LOB字段使用了很大的空间,定位到LOB字段属于SYS_EXPORT_FULL_%表,参考(Doc ID 1626201.1)步骤处理后,表空间使 ...

  2. 计算机基础知识问答:C/C++篇

    讲解一下C语言内存空间的模型: 代码区:它是用来存放程序执行代码的一块内存区域.通常,这部分区域是只读的,防止程序意外地修改了它的指令. 常量区:数据段包含了程序中已初始化的全局变量和静态变量.而BS ...

  3. HTML骨架简述

    <!DOCTYPE html><!-- <!声明 DOC docment文件/文档 TYPE 类别/类型 告知浏览器当前文档为html> --><html&g ...

  4. autMan奥特曼机器人对接新千寻Pro微信框架详细教程

    文件下载 1.安装指定版本微信 https://www.123865.com/s/3Wd9-q13jH 2.最新千寻pro下载 [点此网盘下载] 框架教程 1.安装上面的指定微信版本,跟最新的千寻框架 ...

  5. win11 - 设置FTP服务详细教程

    题记部分 一.开启FTP服务 https://blog.csdn.net/qq_42142258/article/details/131725760 二.配置FTP服务 https://blog.cs ...

  6. Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效

    Jsmoke by Yn8rt ​ 该插件由 Yn8rt师傅 开发,插件可以理解为主动版的hae和apifinder,因为其中的大多数规则我都引用了,当你认为当前页面,以及其调用的js文件存在敏感信息 ...

  7. python文件不显示cmd黑窗口,打包py,pyw文件为exe文件

    问题描述:编写的python文件为定时任务,需要长时间运行,但是打开的cmd黑色窗口看起来很不舒服,于是打包为exe文件,隐藏cmd黑色窗口 步骤:1.使用pip install pyinstalle ...

  8. PPT_标题

    一 调节字体大小 1.字体-字魂71号-御守锦书 2.更改字体大小(138.96.80.80.96.138) 3.字体背景 复制背景图片->选择ppt文字->设置图片格式->选择来自 ...

  9. canvas 获取图片中某个坐标的颜色

    同步发布:https://blog.jijian.link/2020-04-05/canvas-get-color/ 由于功能受限,此处不能放 iframe 嵌入链接,如需看到实时效果,请移步 htt ...

  10. tsconfig.json 报错问题解决

    tsconfig.json 报错问题解决 报错如图所示: 创建tsconfig.json配置文件时,VSCode会自动检测当前项目当中是否有ts文件,若没有则报错,提示用户需要创建一个ts文件后,再去 ...