首页 > 编程语言 >Java中 ==和equals的区别?

Java中 ==和equals的区别?

时间:2024-11-13 19:43:47浏览次数:3  
标签:Java String 区别 对象 equals Person 内存地址 比较

目录

1. == 运算符

用法

对象的比较

基本数据类型的比较

2. equals() 方法

用法

equals() 的重写

3. == 和 equals() 的实际区别

示例:== 和 equals() 的区别

小结:


1. == 运算符

用法
  • == 是 比较运算符,它用于比较两个对象的 引用是否相同,即它们是否指向同一个内存地址。
  • 对于 基本数据类型== 比较的是变量的  是否相等。
对象的比较

对于对象类型(如 StringIntegerList 等),== 比较的是两个对象的内存地址,即它们是否是同一个对象。如果两个对象引用的是同一个内存地址,== 会返回 true;如果它们是不同的对象,== 返回 false

示例:

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

System.out.println(str1 == str2);  // false,虽然它们的内容相同,但是它们是两个不同的对象,内存地址不同

在上面的代码中:

  • str1 和 str2 是两个不同的 String 对象,即使它们的内容(字符串 "hello")完全相同,它们的内存地址不同,因此 == 运算符返回 false
基本数据类型的比较

对于基本数据类型(如 intfloatchar 等),== 比较的是值。

示例:

int a = 10;
int b = 10;
System.out.println(a == b);  // true,因为它们的值相同

这里,ab 的值都为 10,使用 == 比较时会返回 true,因为它们的值相同。

2. equals() 方法

用法

equals()Object 类的方法,用于 比较两个对象的内容是否相同。每个类可以重写(Override)equals() 方法,定义自定义的对象比较逻辑。特别是像 StringIntegerList 等类,都会重写 equals() 方法,以便按内容比较对象。

  • 默认情况下,在 Object 类中,equals() 方法的实现与 == 相同,比较的是对象的内存地址,即引用是否相同。
  • 但是,大多数类(如 String)都会重写 equals() 方法,比较的是对象的 内容 是否相同。

示例:

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

System.out.println(str1.equals(str2));  // true,因为 String 类重写了 equals(),比较的是内容

在这个例子中:

  • str1 和 str2 虽然是两个不同的对象(它们的内存地址不同),但它们的内容相同,所以 equals() 返回 true
equals() 的重写

equals() 方法通常会根据对象的内容来判断两个对象是否相等,通常会检查对象的字段值是否相同。这是很多类(如 StringIntegerDate 等)重写 equals() 方法的原因。

自定义类中的 equals() 重写:

如果你有一个自定义的类(比如 Person 类),你通常会重写 equals() 方法来比较对象的内容。

class Person {
    String name;
    int age;

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

    // 重写 equals 方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;  // 如果是同一个对象,返回 true
        if (obj == null || getClass() != obj.getClass()) return false;  // 检查类型和空值
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);  // 比较内容
    }

    public static void main(String[] args) {
        Person p1 = new Person("Alice", 30);
        Person p2 = new Person("Alice", 30);
        Person p3 = new Person("Bob", 25);

        System.out.println(p1.equals(p2));  // true,内容相同
        System.out.println(p1.equals(p3));  // false,内容不同
    }
}

在这个例子中,equals() 方法被重写用来比较 Person 对象的 nameage 字段。如果这两个字段都相同,equals() 返回 true;否则返回 false

3. == 和 equals() 的实际区别

操作符/方法用途比较内容默认行为重写后的行为
==比较引用是否相同基本数据类型:值;对象:引用(内存地址)比较对象的内存地址默认与 equals() 相同,比较内存地址
equals()比较对象内容是否相同比较对象的内容(通常根据类的字段比较)默认比较内存地址根据类的定义比较对象的实际内容
示例:== 和 equals() 的区别
public class TestComparison {
    public static void main(String[] args) {
        // 创建两个不同的 String 对象
        String str1 = new String("hello");
        String str2 = new String("hello");

        // 使用 == 比较
        System.out.println(str1 == str2);  // false,因为它们是不同的对象,内存地址不同

        // 使用 equals() 比较
        System.out.println(str1.equals(str2));  // true,因为它们的内容相同

        // 使用基本数据类型比较
        int a = 100;
        int b = 100;
        System.out.println(a == b);  // true,因为值相同

        // 使用自定义对象比较
        Person p1 = new Person("Alice", 30);
        Person p2 = new Person("Alice", 30);
        System.out.println(p1 == p2);  // false,因为它们是不同的对象,内存地址不同
        System.out.println(p1.equals(p2));  // true,因为它们的内容相同
    }
}

小结:

  • == 比较的是两个引用是否指向同一个对象(即内存地址是否相同)。
  • equals() 比较的是两个对象的 内容 是否相同,通常是通过重写 equals() 方法来根据对象的字段值进行比较。
  • 对于基本数据类型,== 比较的是 ,而不是引用。

标签:Java,String,区别,对象,equals,Person,内存地址,比较
From: https://blog.csdn.net/cmh1008611/article/details/143693971

相关文章

  • nginx中proxy_set_header Host $host的作用及$proxy_host,$host与$http_host的区别
    一、nginx中proxy_set_headerHost$host的作用nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求体中的含义完全相同,除了Host外还有X-Forward-For。Host......
  • Java实现FormData接口调用
    JAVA原生实现packagecom.hisense.demo.utils;importjava.io.*;importjava.net.HttpURLConnection;importjava.net.URL;importjava.util.List;/***@authortianluhua*@version1.0*@since2024/11/1317:49*/publicclassDemo{publicstaticvoid......
  • Java版学生管理系统
    importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;publicclassStudent{//创建JFrame窗口privateJFr......
  • 什么是 Java中的 OOM
    一、什么是Java中的OOM(OutOfMemoryError)在Java中,OutOfMemoryError(OOM)是一个运行时错误,表示JVM(JavaVirtualMachine)在执行程序时,无法为对象分配足够的内存。通常,这意味着JVM堆内存或其他内存区域(如方法区、直接内存等)已用尽。OOM错误通常发生在以下几......
  • javaScript对象函数初相识
    1.1、对象初相识1.1.1、对象的初识1.1.1.1、对象的定义现实生活中,万物皆对象,对象是一个具体的事物,看得见摸得着的实物。例如一本书,一辆汽车,一个人可以是“对象”,一个数据库,一张网页,一个与远程服务器的连接也可以是“对象”。例子:明星、女朋友、班主任、苹果、手机周星驰......
  • javascript如何进行冒泡排序?
    冒泡排序的规律有一个数组[5,4,3,2,1],假如说要重新排序,进行升序排序,冒泡排序步骤如下5和4比较,5大,5和4交换位置[4,5,3,2,1]5和3比较,5大,5和3交换位置[4,3,5,2,1]5和2比较,5大。5和2交换位置[4,3,2,5,1]5和1比较,5大,5和1交换位置[4,3,2,1,5]5排到了最后一位4开始和后面的......
  • CPT111: Java Programming Computing
    ComputingCPT111:JavaProgrammingSemester1,2024-25Coursework3:ProgrammingProject–ASimpleQuizSystemReadcarefully—nodispensationwillbegivenforlackofawarenessoftherulesAssignmenttypeThisisagroupprogrammingassignment.Yo......
  • Java毕业设计----基于Java的情感分析毕业设计
    目录引言设计目标项目结构具体实践总结 Python版本引言情感分析(SentimentAnalysis)是自然语言处理(NLP)中的一个重要应用,它通过对文本内容的情感倾向进行分类,帮助机器理解文本的情感状态。情感分析通常分为两类:情感极性分析(例如,判断文本是正面、负面还是中立)和情感强......
  • 【最新原创毕设】面向课堂教学的智能课堂点名系统+09531(免费领源码)可做计算机毕业设计
    摘要本文旨在设计和实现一个基于智能课堂点名系统的智能助手。随着高校招生规模的不断扩大和信息化技术的发展,为教师提供一款便捷、全面的点名系统具有重要意义。本系统通过整合校园各项服务资源和功能,旨在帮助教师和学生更好地适应智能课堂,提供全方位的指导和支持。本文......
  • (2024最新毕设合集)基于SpringBoot的广州糖水甜品店推荐系统-28495|可做计算机毕业设计J
    摘要随着人们生活水平的提高和饮食习惯的多样化,甜品在日常生活中扮演着越来越重要的角色。特别是在中国南方地区,甜品店和糖水店已经成为人们经常光顾的地方,而广州作为美食之都,拥有众多具有独特风味的糖水甜品店。然而,由于市场竞争激烈,消费者往往面临选择困难,需要花费大量时间......