首页 > 其他分享 >String类的equals()的作用和源代码解读

String类的equals()的作用和源代码解读

时间:2025-01-20 19:29:54浏览次数:3  
标签:String equals value myArray 字符串 源代码 public

1.  了解equals()方法

equals方法是用于比较两个对象是否相等的方法,定义在Object类中。其默认实现仅比较对象的引用地址,但可以通过重写方法实现对对象内容的比较。只有引用数据类型才可以使用equals方法,我们点进equals方法的源码:

我们看代码前几行,观察到当传入进来的参数之间互相比较时,是在使用“ == ”来比较两者间引用地址的相等关系。这里回顾一下 == equals 的区别

2.   == 运算符

在基本数据类型中, == 用于比较两者之间的值

在引用数据类型中, == 用于比较两者的内存地址

3.  equals() 方法

只有引用数据类型才可以使用equals()方法,如果没有重写equals()方法,会默认调用Object类中的equals()方法。其仍然使用 == 来进行内存地址的比较。不过在String类中已经重写了equals方法,所以我们可以直接使用equals方法来比较字符串内容。

3.1  String类重写的equals方法解读:

public boolean equals(Object anObject) {
        // 先比较两者内存地址,如果相同直接返回true
        if (this == anObject) {
            return true;
        }
        //检查传入参数的类型
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;        //将当前字符串长度赋给n
            //检查当前字符串的长度
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                //将两个字符串进行逐字符比较
                while (n-- != 0) {
                    if (v1[i] != v2[i])   //有一个字符不匹配则返回false
                        return false;
                    i++;
                }
                return true;              //每个字符都匹配,返回true
            }
        }
        //传入参数类型错误,返回false
        return false;
    }

4.  举例验证:

4.1  在String类中分别使用 == 和equals方法进行字符串比较:

public class Demo1 {
    public static void main(String[] args) {
        String str1 = new String("2022");
        String str2 = new String("2022");

        System.out.println(str1 == str2);
        System.out.println(str1.equals(str2));
    }
}

我们创建两个String类对象,分别使用==equals来比较两个相同内容的字符串,观察输出结果:

结果分析:

==运算符的比较输出结果为false,在前文中说过其比较的是内存地址,又因为我们创建了两个String类的对象,自然其内存地址也是不同的。所以输出为false

equals方法输出结果为true,这是因为String类中重写了equals方法,对两个字符串进行逐字符比较,字符内容相同,所以返回true

上述equals方法能比较字符串内容的前提是使用String类中的equals方法,如果在自定义类中,则需要手动重写equals方法,否则仍然是进行 == 运算比较内存地址。

4.2  在自定义类中分别使用 == 和equals方法进行字符串比较:

public class Demo1 {
    public static void main(String[] args) {
        myArray arr1 = new myArray("2022");
        myArray arr2 = new myArray("2022");
        System.out.println(arr1.equals(arr2));
    }
}

class myArray {
    private String value;

    public myArray(String value) {
        this.value = value;
    }
}

自定义myArray类,在主函数中创建myArray对象,仍然使用equals方法进行比较,观察运行结果

可以看到结果为false,这是因为自定义类中没有事先重写好的equals方法, 所以其本质上是使用 == 在进行对象间的内存地址比较。

自定义类中重写equals方法:

class myArray {
    private String value;

    public myArray(String value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj){
        //如果obj和当前字符串地址一样,返回true
        if (this == obj){
            return true;
        }
        //判断传入参数是否为空或类型是否不同
        if (obj == null || getClass() != obj.getClass()){
            return false;
        }
        //强制类型转换后比较value的值
        myArray array = (myArray) obj;
        return value == array.value;
    }
}

重写equals方法,逐个比较value的属性值,达到比较字符串之间内容的目的,这样在使用自定义类myArray时使用equals方法时,则会执行在类中被重写过的方法。

验证: 

package Demo3;

public class Demo1 {
    public static void main(String[] args) {
        myArray arr1 = new myArray("2022");
        myArray arr2 = new myArray("2022");
        myArray arr3 = new myArray("8888");
        System.out.println(arr1.equals(arr2));
        System.out.println(arr1.equals(arr3));
    }
}

class myArray {
    private String value;

    public myArray(String value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj){
        if (this == obj){
            return true;
        }
        if (obj == null || getClass() != obj.getClass()){
            return false;
        }
        myArray array = (myArray) obj;
        return value == array.value;
    }
}

重写equals方法后,添加新的myArray对象arr3,字符串内容为“8888”。分别比较arr1arr2arr1arr3

 arr1arr2比较运行结果为true,说明两者字符串内容一致。arr1arr3比较结果为false,说明两者字符串内容不一致。

5.  总结:

        使用String类的equals方法在比较两个字符串时,首先会检查两个对象的引用是否相同,如果相同,接着检查传入的对象是否是String类型,如果符合条件,则继续比较字符串的长度。如果长度不同,直接返回false,如果长度相同,则逐个字符比较两个字符串的内容。如果内容完全相同,返回true,否则返回false。

标签:String,equals,value,myArray,字符串,源代码,public
From: https://blog.csdn.net/zyyyyyhhhhh/article/details/145249418

相关文章

  • 如何在网站中安全有效地修改源代码,确保不影响网站的正常运行?
    修改网站源代码是一项需要谨慎操作的任务,以确保不会影响网站的稳定性和功能。以下是详细的步骤和建议:确定修改需求:明确具体的修改需求,包括功能改进、界面优化等方面的要求。制定详细的修改计划,确保每个改动都有明确的目标。备份现有文件:在进行任何更改之前,请确保对当......
  • [LeetCode] 1370. Increasing Decreasing String 上升下降字符串
    Youaregivenastring s.Reorderthestringusingthefollowingalgorithm:Removethe smallest characterfrom s and append ittotheresult.Removethe smallest characterfrom s thatisgreaterthanthelastappendedcharacter,and append itt......
  • 详解Rust 中 String 和 str 的用途与区别
    文章目录1.基本定义1.1String1.2str2.存储位置与内存模型2.1String2.2str3.用法与区别4.使用场景4.1使用String的场景4.2使用str的场景5.String和str的关系6.代码示例分析6.1从&str创建String6.2从String获取&str6.3拼接字符串6.4静态......
  • String类及其衍生类的简单理解
    String类及其衍生类的简单理解StringString指的是字符串的类,在java中,它是不可以更改的。1.下面简单介绍两种构造方法。publicclasshaohaoxuexi{publicstaticvoidmain(String[]args){Stringa=newString();Stringb="abc";}}这是两......
  • 单片机毕业设计之stm32单片机物联网远程心率血氧MAX30102健康监控系统,老人健康监测+行
    一、设计简介        本项目旨在利用STM32F103C8T6微控制器为核心,构建一个实时人体健康监测系统。该系统集成了多种传感器和模块,能够全面、准确地监测并显示人体的关键健康数据,同时提供异常报警功能,还通过蓝牙通信功能实现了数据的远程传输和记录,方便用户随时了解自己......
  • Java中String类常用的各种方法
    Java中String类常见的方法以下介绍字符串常见的几个方法。介绍String类在Java中,String类是一个代表字符串的类,具有以下特性:不可变性:String对象一旦被创建就是不可变的,即它们的值在创建后不能被更改。任何对String对象的修改操作实际上会创建一个新的String对象。......
  • JSON.stringify有什么局限性和哪些技巧?
    JSON.stringify是JavaScript中用于将对象转换为JSON字符串的方法,但它在某些情况下具有局限性,同时也有一些技巧可以帮助开发者更有效地使用它。以下是关于JSON.stringify的局限性和技巧的详细解答:局限性:循环引用问题:当对象之间存在循环引用时,JSON.stringify会抛出错误。例如,一......
  • 在C++中std::string 和string有啥区别呀?
    在C++中,std::string和string实际上是同一个类型,只是它们的命名空间(namespace)不同。具体来说:(我说为啥在写代码的时候都有个usingnamespacestd;语句我还以为是闹着玩.)std::string明确指定了string类型位于std命名空间中。string是std::string的简写,但要使......
  • 【YashanDB知识库】导入数据时报错:YAS-00008 type convert error:literal does not mat
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7901522.html?templateId=1718516现象将数据通过SQL语气导入崖山时报错:YAS-00008typeconverterror:literaldoesnotmatchformatstring原因插入日期类型的字符串,不是配置参数DATE_FORMAT所指......
  • 宽窄字节4:CString的方便之处及优缺点
    文章目录前言一、CString类的方便之处二、使用方式1.CString类型的一些内置成员函数。2.CString对于TCHAR的封装3.CString类对于宽窄字节的转换4.CString类的优缺点总结前言宽窄字节4:CString的方便之处及优缺点。一、CString类的方便之处CString类归属于ATL,在MF......