欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

初识String类中的toString()和equals()

程序员文章站 2022-04-15 23:20:27
一、String类中的equals()方法①String类重写equals()的源代码长什么样?public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject;...

String类是被final修饰的,是不可被继承的。

String类底层是基于char数组的。

一、String类中的equals()方法

①String类重写equals()的源代码长什么样?

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

②比较字符串相等,equals(),不能用"==",String不是基本数据类型,是引用数据类型

1."=="比较引用数据类型,比较的是地址是否相等

2.=="比较基本数据类型,比较的是是否相等

3.equals()比较引用数据类型,默认的也是比较地址是否相等

4.【注意】String类重写了equals方法,比较的是内容是否相同。

  //String是一个引用数据类型
        //创建字符串对象
        String s1 = "yourenA";
        String s3 = new String("yourenA");   

        System.out.println(s1==s3);//false
        System.out.println(s1.equals(s3));//true

③ String s1 = "hhh";和String s1 = new String("hhh");在内存中的区别

一、String s1 = "hhh";

1.在编译期,JVM会去常量池查找是否存在"hhh"

2.如果不存在,就在常量池开辟一个空间来存储"hhh",把地址赋给栈指针

3.如果存在,就不用开辟新的空间,直接把地址赋给栈指针

4.然后在栈内存中开辟一个名为s1的空间,来存储"hhh"在常量池中的地址

总结:因此无论是"=="还是equals()判断都相等,==:因为在常量池中只有一份内存空间,地址全部相同。

//以下方法创建字符串对象,可能创建了一个对象,也可能一个对象也没有创建
String s1 = "hhh";
String s2 = "hhh";
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true

二、String s1 = new String("hhh");

1.在编译期,JVM会去常量池查找是否存在"hhh"

2.如果不存在,就在常量池开辟一个空间来存储"hhh"

3.如果存在,就不用开辟新的空间

4.在运行期,通过String的构造器在堆内存中new了一个新的空间(new Sring("hhh"))

5.然后将常量池中的"hhh"复制一份到该堆内存的空间中

6.在栈内存中开辟一个名为s1的空间,存放堆内存中新空间的地址

总结:只要是new String(),则,栈中的地址都是指向最新new出来的堆中的地址,"=="判断的是地址,当然不等的。

至于equals,String类重写了equals,判断内容是否相同,明显相同,因此equals是相等的。

//以下方法创建字符串对象,至少创建了一个对象,也可能创建两个对象
String s3 = new String("yyy");
String s4 = new String("yyy");
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true

二、String类中的toString()方法

①String类重写toString()的源代码长什么样?

    public String toString() {
        return this;
    }

②代码 

String s1 = "yourenA";

//String类已经重写了toString方法
System.out.println(s1.toString());//yourenA
//打印是自动调用对象的toString()方法
System.out.println(s1);//yourenA

 

本文地址:https://blog.csdn.net/weixin_43486332/article/details/107354534

相关标签: JAVA 字符串