java的==运算符和equals操作详解

 更新时间:2024年08月21日 11:01:12   作者:m87里的光  
在Java中,==和equals都是用于比较两个对象的操作符,但它们的行为和用途有所不同,这篇文章主要介绍了java的==运算符和equals的相关知识,需要的朋友可以参考下

①chatgpt的解释

在Java中,==和equals都是用于比较两个对象的操作符,但它们的行为和用途有所不同。

==操作符:

对于基本数据类型,比较的是它们的值是否相等。例如,int a = 5; int b = 5; System.out.println(a == b); // 输出true

对于引用类型,比较的是它们的引用是否相等,即是否指向同一个对象。例如,String str1 = "hello"; String str2 = "hello"; System.out.println(str1 == str2); // 输出true

对于对象的比较,如果没有重写equals方法,默认使用的也是==操作符进行比较。

equals方法:

equals方法是Object类中定义的方法,用于比较两个对象是否相等。默认情况下,equals方法和==操作符的行为相同,即比较的是两个对象的引用是否相等。

但是,equals方法可以被子类重写,以实现自定义的相等比较逻辑。通常情况下,我们需要重写equals方法来比较对象的内容是否相等,而不仅仅是比较引用是否相等。

重写equals方法时,通常还需要重写hashCode方法,以保证对象在放入哈希表等数据结构时的正确性。

需要注意的是,对于基本数据类型,使用==操作符进行比较是安全的。但对于引用类型,特别是自定义的类,通常需要使用equals方法来比较对象的内容是否相等。在使用equals方法时,需要注意遵循以下几个原则:

  • 自反性:x.equals(x)应该返回true。
  • 对称性:如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
  • 传递性:如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
  • 一致性:多次调用x.equals(y)应该返回相同的结果,前提是对象没有被修改。
  • 非空性:x.equals(null)应该返回false。

②Object常用类

1.equals(Object obj)方法:

用于比较两个对象是否相等。

默认情况下,使用的是==操作符进行比较,即比较两个对象的引用是否相等。

通常需要在自定义的类中重写equals方法,以实现自定义的相等比较逻辑。

重写equals方法时,通常还需要重写hashCode方法,以保证对象在放入哈希表等数据结构时的正确性。

2.hashCode()方法:

返回对象的哈希码值。

哈希码值用于在哈希表等数据结构中快速定位对象。

默认情况下,hashCode方法返回的是对象的内存地址的整数表示。

重写equals方法时,通常也需要重写hashCode方法,以保证相等的对象具有相同的哈希码值。

3.toString()方法:

返回对象的字符串表示。

默认情况下,返回的是对象的类名和哈希码值的组合,例如"ClassName@hashCode"。

通常需要在自定义的类中重写toString方法,以返回自定义的字符串表示。

4.getClass()方法:

返回对象的运行时类。

可以用于获取对象所属的类的信息,例如类名、包名等。

5.clone()方法:

创建并返回对象的一个副本。

需要注意的是,该方法是浅拷贝,即只复制对象的引用,而不复制对象的内容。

如果需要实现深拷贝,需要在自定义的类中重写clone方法,并在其中进行逐个成员变量的复制。

6.finalize()方法:

在对象被垃圾回收器回收之前调用。

可以在子类中重写该方法以执行对象的清理操作,例如释放资源等。

7.notify()和notifyAll()方法:

用于在多线程环境下进行线程间的通信。

notify()方法唤醒在该对象上等待的一个线程,notifyAll()方法唤醒所有在该对象上等待的线程。

这些方法必须在同步代码块或同步方法中调用,并且只能由持有该对象的锁的线程来调用。

8.wait()方法:

使当前线程进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法唤醒它。

这个方法必须在同步代码块或同步方法中调用,并且只能由持有该对象的锁的线程来调用。

需要注意的是,Object类中的这些方法都是被protected修饰的,因此只能在子类中访问和使用。在实际开发中,我们通常会在自定义的类中重写equals、hashCode和toString方法,以满足具体的需求。

③==

==是一个比较运算符;

(1)如果判断基本类型,判断的是值是否相等;

(2)如果判断引用类型,判断的是地址是否相等,即判断是不是同一个对象;

④equals方法

(1)是一个方法,只能判断引用类型

(2)Object类的equals方法默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等;

⑤如何查看jdk源码:

在查看某个方法源码时,将光标放在该方法处,输入ctrl+b即可;或者是ctrl+左键    。    

⑥lang包

java.lang包是Java语言的核心包之一,它包含了Java语言的基本类和接口。这个包中的类和接口是Java程序开发中最常用的,因此它们不需要显式地导入就可以直接使用。

以下是java.lang包中一些常用的类和接口:

  • Object类:Object类是所有类的根类,它定义了一些通用的方法,如equals()、hashCode()、toString()等。
  • Class类:Class类表示Java中的类和接口,它提供了一些方法来获取类的信息,如getName()、getSuperclass()、getInterfaces()等。
  • String类:String类用于表示字符串,它提供了许多字符串操作的方法,如length()、charAt()、substring()等。
  • StringBuilder和StringBuffer类:StringBuilder和StringBuffer类用于可变的字符串操作,它们提供了一系列方法来修改和操作字符串。
  • Math类:Math类提供了一些数学运算的方法,如abs()、sqrt()、sin()等。
  • System类:System类提供了与系统相关的一些方法,如获取当前时间、获取系统属性、标准输入输出等。

Throwable类和Exception类:Throwable类是所有错误和异常的基类,Exception类是所有可检查异常的基类,它们提供了一些方法来处理错误和异常。

Thread类和Runnable接口:Thread类和Runnable接口用于多线程编程,它们提供了创建和管理线程的方法。

除了上述提到的类和接口,java.lang包还包含了一些其他的类和接口,如ClassLoader类、Enum类、Iterable接口等。这些类和接口提供了Java语言的基本功能和特性,是Java程序开发中不可或缺的一部分。由于java.lang包中的类和接口在Java程序中经常被使用,所以它们不需要显式地导入就可以直接使用。

是的,String类是Object类的子类。在Java中,所有的类都直接或间接地继承自Object类。因此,String类继承了Object类的所有方法,如equals()、hashCode()、toString()等。同时,String类还提供了一些自己特有的方法,用于字符串的操作和处理。由于String类是Object类的子类,所以可以将String对象赋值给Object类型的变量,也可以将String对象作为参数传递给接受Object类型参数的方法。但需要注意的是,虽然String类继承了Object类的方法,但它对其中的一些方法进行了重写,以实现字符串的特定功能。

到此这篇关于java的==运算符和equals详解的文章就介绍到这了,更多相关java ==运算符和equals内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot项目配置logback-spring.xml实现按日期归档日志的方法

    springboot项目配置logback-spring.xml实现按日期归档日志的方法

    本文主要介绍了springboot项目配置logback-spring.xml实现按日期归档日志的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • SpringBoot整合Elasticsearch实现索引和文档的操作方法

    SpringBoot整合Elasticsearch实现索引和文档的操作方法

    Elasticsearch 基于 Apache Lucene 构建,采用 Java 编写,并使用 Lucene 构建索引、提供搜索功能,本文分步骤通过综合案例给大家分享SpringBoot整合Elasticsearch的相关知识,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 注解@CrossOrigin解决跨域的问题

    注解@CrossOrigin解决跨域的问题

    这篇文章主要介绍了注解@CrossOrigin解决跨域的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot Entity中枚举类型详细使用介绍

    SpringBoot Entity中枚举类型详细使用介绍

    本文介绍SpringBoot如何在Entity(DAO)中使用枚举类型。(本文使用MyBatis-Plus)。在实际开发中,经常会遇到表示类型或者状态的情况,比如:有三种支付方式:微信、支付宝、银联。本文介绍如何这种场景的方案对比,并用实例来介绍如何用枚举这种最优雅的来表示
    2022-10-10
  • Java stringBuilder的使用方法及实例解析

    Java stringBuilder的使用方法及实例解析

    这篇文章主要介绍了Java stringBuilder的使用方法及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 全面解读Java NIO(看这篇就够了)

    全面解读Java NIO(看这篇就够了)

    Java NIO是Java1.4之后推出来的一套IO接口,NIO提供了一种完全不同的操作方式, NIO支持面向缓冲区的、基于通道的IO操作,这篇文章主要介绍了Java NIO详解(看这篇就够了),需要的朋友可以参考下
    2023-05-05
  • Maven 项目生成jar运行时提示“没有主清单属性”

    Maven 项目生成jar运行时提示“没有主清单属性”

    这篇文章主要介绍了Maven 项目生成jar运行时提示“没有主清单属性”,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • java stream实现分组BigDecimal求和以及自定义分组求和

    java stream实现分组BigDecimal求和以及自定义分组求和

    这篇文章主要给大家介绍了关于java stream实现分组BigDecimal求和以及自定义分组求和的相关资料,Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的聚合操作或者大批量数据操作,需要的朋友可以参考下
    2023-12-12
  • 一文带你搞懂Java定时器Timer的使用

    一文带你搞懂Java定时器Timer的使用

    定时器类似于我们生活中的闹钟,可以设定一个时间来提醒我们。而定时器是指定一个时间去执行一个任务,让程序去代替人工准时操作。本文就来聊聊Java定时器Timer的使用,需要的可以参考一下
    2023-01-01
  • Java8新特性之再见Permgen_动力节点Java学院整理

    Java8新特性之再见Permgen_动力节点Java学院整理

    这篇文章主要介绍了Java8新特性之再见Permgen的相关知识,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-06-06

最新评论