Java全面细致讲解==和equals的使用

作者:小老师ir 时间:2021-08-20 05:28:43 

上篇博文:Java-多线程的使用

equals与==

1. ==的使用

1.1 概述

⭕ 用于基本类型比较值时:只要两个变量的值相等,即为true。

⭕ 用于引用类型比较引用(是否指向同一个对象)时,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体,只有指向同一个对象时,==才返回true。

⭕ 用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错。

1.2 代码演示

演示一:

//基本数据类型
int i = 10;
int j = 10;
double d = 10.0;
System.out.println(i == j);//true
System.out.println(i == d);//true
char c = 10;
System.out.println(i == c);//true
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//true

演示二:

String str1 = new String("嘻嘻");
  String str2 = new String("嘻嘻");
  System.out.println(str1 == str2);//false

演示三:

int i = 10;
boolean b = true;
//System.out.println(i == b);
// 报错: Operator '==' cannot be applied to 'int', 'boolean'

2. equals的使用

2.1 概述

⭕ 是一个方法,而非运算符。

⭕ 只能适用于引用数据类型。

⭕ Object类中equals()的定义:

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

说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体。

⭕ 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。

⭕ 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写,重写的原则:比较两个对象的实体内容是否相同。

2.2 代码演示

演示一:

Person p1=new Person();
   Person p2=new Person();
   System.out.println(p1.equals(p2));//false
   //Person为自定义的类,没有对equals()进行重写
   String str1 = new String("小老师ir");
String str2 = new String("小老师ir");
   System.out.println(str1.equals(str2));//true
   Date date1 = new Date(32432525324L);
Date date2 = new Date(32432525324L);
System.out.println(date1.equals(date2));//true

演示二:

public class Customer {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Customer other = (Customer) 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;
}
}

3. ==和equals的区别

3.1 概述

⭕ == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址。

⭕ equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals()方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。

⭕ 具体要看自定义类里有没有重写Object的equals()方法来判断。

⭕ 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。

3.2 代码演示

int it = 65;
  float fl = 65.0f;
  System.out.println(“65和65.0f是否相等?” + (it == fl)); //true
  char ch1 = 'A';
  char ch2 = 12;
  System.out.println("65和'A'是否相等?" + (it == ch1));//true
  System.out.println(“12和ch2是否相等?" + (12 == ch2));//true
  String str1 = new String("hello");
  String str2 = new String("hello");
  System.out.println("str1和str2是否相等?"+ (str1 == str2));//false
  System.out.println("str1是否equals str2?"+(str1.equals(str2)));//true
  System.out.println(“hello” == new java.util.Date()); //编译不通过

来源:https://blog.csdn.net/weixin_52533007/article/details/124995068

标签:Java,==,equals,关键字
0
投稿

猜你喜欢

  • java快速生成数据库文档详情

    2023-11-10 05:25:20
  • Lombok为啥这么牛逼?SpringBoot和IDEA官方都要支持它

    2021-10-18 23:04:50
  • Spring使用三级缓存解决循环依赖的问题

    2023-03-14 09:06:15
  • 使用AOP拦截Controller获取@PathVariable注解传入的参数

    2023-04-30 21:42:09
  • Springcloud微服务架构基础知识解析

    2023-01-26 14:37:10
  • Java 信号量Semaphore的实现

    2023-06-19 11:00:34
  • Java使用BigDecimal进行运算封装的实际案例

    2023-06-20 02:22:26
  • 使用Java桥接模式打破继承束缚优雅实现多维度变化

    2023-08-23 09:00:34
  • 用Java连接sqlserver数据库时候几个jar包的区别分析

    2021-11-07 02:18:01
  • 关于Java8 parallelStream并发安全的深入讲解

    2023-11-15 06:37:35
  • java.math.BigDecimal的用法及加减乘除计算

    2022-01-15 15:55:20
  • rocketmq如何修改存储路径

    2022-08-20 08:00:57
  • java并发编程包JUC线程同步CyclicBarrier语法示例

    2023-01-18 07:44:58
  • Springboot轻量级的监控组件SpringbootAdmin

    2023-08-25 10:08:31
  • Java String 字符串常量池解析

    2023-01-08 19:44:05
  • java实现波雷费密码算法示例代码

    2022-09-14 23:30:28
  • java 并发线程个数的如何确定

    2022-01-01 21:52:13
  • Redis 订阅发布_Jedis实现方法

    2023-11-10 03:38:41
  • java自带的MessageDigest实现文本的md5加密算法

    2023-10-08 03:35:29
  • SpringCloud可视化链路追踪系统Zipkin部署过程

    2023-11-27 04:34:06
  • asp之家 软件编程 m.aspxhome.com