首页 > 编程语言 >[JAVA]‘==‘和‘equals()‘的区别------详细解读版本

[JAVA]‘==‘和‘equals()‘的区别------详细解读版本

时间:2024-11-05 11:46:29浏览次数:4  
标签:JAVA name age equals Person ------ new String

1.'=='操作符

什么是'=='?

== 是 Java 中的比较操作符,用于比较两个变量或对象的内存地址数值

  • 基本数据类型== 用于比较变量的数值是否相等。
  • 引用数据类型== 用于比较两个对象的引用地址是否相同,判断它们是否指向同一个对象。

示例 1:== 比较基本数据类型

int a = 5;
int b = 5;
System.out.println(a == b);  // 输出:true,因为 a 和 b 的值都是 5

示例 2:== 比较引用类型

String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1 == str2);  // 输出:false,因为 str1 和 str2 是不同的对象,内存地址不同

尽管 str1 和 str2 内容相同,但 == 比较的是它们在内存中的地址,因此结果为 false

2. equals() 方法

什么是 equals()

equals() 是 Object 类中的方法,默认情况下也用于比较两个对象的引用地址,即判断两个对象是否为同一个对象。然而,许多类(如 StringInteger)都会重写 equals() 方法,使其能够比较对象的内容

示例 1:equals() 比较字符串内容

String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1.equals(str2));  // 输出:true,因为 `String` 类重写了 `equals()`,比较的是字符串内容

 在 String 类中,equals() 方法被重写为比较字符串的内容,因此尽管 str1 和 str2 是不同的对象,但它们的内容相同,equals() 返回 true

示例 2:equals() 的默认行为

如果自定义的类没有重写 equals() 方法,则会继承 Object 类的默认实现,比较的是引用地址。

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

Person p1 = new Person("Alice");
Person p2 = new Person("Alice");

System.out.println(p1.equals(p2));  // 输出:false,因为 `Person` 没有重写 `equals()`,默认比较引用地址

尽管 p1 和 p2 的 name 属性相同,但它们是不同的对象,因此 equals() 默认返回 false

3. == 和 equals() 的区别总结

 4. == 和 equals() 在字符串中的区别

String 是 Java 中最常见的引用类型之一。由于 String 类重写了 equals(),使得两个字符串对象的比较基于它们的内容,而不仅仅是内存地址。

示例:字符串池和 ==

Java 中有一个字符串池机制,字面量字符串会存储在池中。如果两个字面量字符串相同,它们会共享同一块内存,因此使用 == 比较时结果为 true

String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);        // 输出:true,因为 s1 和 s2 指向相同的字符串池中的地址
System.out.println(s1.equals(s2));   // 输出:true,因为内容相同

然而,用 new 关键字创建的字符串每次都会创建新的对象,即使内容相同,== 也会返回 false,因为它们是不同的对象。

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);        // 输出:false,因为它们是不同的对象
System.out.println(s1.equals(s2));   // 输出:true,因为内容相同

5. 如何重写 equals() 方法

在自定义类中,如果希望根据对象的内容而不是内存地址来判断两个对象是否相等,通常需要重写 equals() 方法。

示例:重写 equals()

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }
}

Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);

System.out.println(p1.equals(p2));  // 输出:true,因为内容相同

在这个例子中,Person 类重写了 equals() 方法,以根据 name 和 age 判断对象是否相等。

6. hashCode() 和 equals() 的关系

在 Java 中,hashCode() 和 equals() 之间有一个重要的约定:如果两个对象根据 equals() 是相等的,那么它们的 hashCode() 值也必须相等。否则,在使用哈希表(如 HashMap、HashSet)时会出现问题。

示例:重写 equals() 和 hashCode()

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

总结

  • ==:用于比较基本数据类型的值或引用类型的内存地址。
  • equals():用于比较引用类型的内容(需重写)。

 

标签:JAVA,name,age,equals,Person,------,new,String
From: https://blog.csdn.net/weixin_66834439/article/details/143477265

相关文章

  • 实时数仓及olap可视化构建(基于mysql,将maxwell改成seatunnel可以快速达成异构数据源实
    1.OLAP可视化实现(需要提前整合版本)Linux121Linux122Linux123jupyter✔spark✔✔✔python3+SuperSet3.0✔hive✔ClinckHouse✔Kafka✔✔✔Phoenix✔DataX✔maxwell✔Hadoop✔✔✔MySQL✔......
  • 2030年,云计算将会如何改变世界
    随着云计算不断发展,未来五到十年将会是一个关键阶段。我们现在正处于云计算变革的中期,但到2030年,云计算的影响将比我们今天能想象的更加深远。它不仅会改变企业的运营模式,更会彻底重塑整个商业环境。接下来,我会聊一聊未来云计算会如何影响我们所熟悉的商业世界,以及我们应该......
  • 论面向服务架构设计及其应用
    一、引言企业应用集成(EnterpriseApplicationIntegration,EAI)是企业实现信息系统协同工作的关键途径,尤其是在当前多系统、多平台并存的企业环境下,集成需求愈发显著。面向服务架构(Service-OrientedArchitecture,SOA)通过将企业资源和业务功能封装为服务的形式进行集成,实现了......
  • 3 有限体积法:推导方程
    3有限体积法:推导方程基本原理和目标(注意:这一节看不懂没关系,在后面的推导中会慢慢用到)质量、动量和能量的守恒流体的质量守恒动量改变的速度=一个流体粒子上受到的力的总和(牛顿第二定律)能量改变的速度=一个流体粒子吸收的热量,和作用在其上的功的总和(热力学第一定律)......
  • 算法设计2——数组元素循环右移
    问题描述:有一个数组a包含n(n>1)个整数元素,设计一个尽可能高效的算法将数组a中的后面k个元素循环右移(k<=n),其中n是数组长度,0<=k<=n。例如:a=(1,2,3,4,5),k=3,结果:a=(3,4,5,1,2)思路:理解问题:将数组 a中的最后 k个元素移动到数组的前面,同时保持剩余元素的顺序不变。解决问题......
  • Python小游戏19——滑雪小游戏
    运行效果 python代码importpygameimportrandom #初始化Pygamepygame.init() #设置屏幕尺寸screen_width=800screen_height=600screen=pygame.display.set_mode((screen_width,screen_height))pygame.display.set_caption("滑雪小游戏") #定义......
  • 探索水分仪的用途与水分测量方法
    水分仪:精准测量水分的得力工具在众多科学和工业领域中,水分仪是一款不可或缺的设备。它具有广泛的用途,为我们提供了准确、高效的水分测量方法。水分仪常用于农业领域,帮助农民确定土壤中的水分含量,从而合理安排灌溉,保障农作物的生长和产量。在食品加工行业,它能精准检测食品中的......
  • Python小游戏20——超级玛丽
    首先,你需要确保你的Python环境中安装了pygame库。如果还没有安装,可以使用以下命令进行安装:bashpipinstallpygame运行效果展示  代码展示pythonimportpygameimportsys #初始化pygamepygame.init() #设置屏幕尺寸screen_width=800screen_height=......
  • Python小游戏21——拼图小游戏
     使用了Pygame库来创建图形界面。请确保你已经安装了Pygame库(可以使用pipinstallpygame来安装)。运行结果展示 代码展示pythonimportpygameimportsysimportrandom #初始化Pygamepygame.init() #设置屏幕尺寸screen_width,screen_height=600,600......
  • 【Altium】Plane Resonance Analyzer 插件试用
    1、文档目标PlaneResonanceAnalyzer插件已安装,但是无法使用。如何能用起来该功能?图12、问题场景PlaneResonanceAnalyzer插件安装后,提示需要单独授权进行使用。 图23、软硬件环境1)、软件版本:AltiumDesigner22.1.2或更高版本2)、电脑环境:Windows10、Wi......