String常见面试题

首先我们需要了解一下==和equals的区别

1. == :既可以比较基本数据类型,也可以比较引用数据类型。比较基本数据类型时比较的是值,引用数据类型比较的是地址。

2. equals:只能比较引用数据类型。如果该引用数据类型没有重写Object类中的方法,equals比较的是地址,重写后的比较的是值。

具体可以参考:双等号==和equals的区别_IT盛夏的果实的博客-CSDN博客_双等号和equals的区别

判断string类型的s1和s2是否相等

1)

        String str1 = "ab";
        String str2 = "ab";
        System.out.print(str2 == str1); //true  
        System.out.println(str1.equals(str2)); //true

str2 == str1:比较地址值,都在常量值中,相等。

str1.equals(str2):string重写equals方法,比较的是数值,相等

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        } else {
            if (anObject instanceof String) {
                String aString = (String)anObject;
                if (this.coder() == aString.coder()) {
                    return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value);
                }
            }

            return false;
        }
    }

2)

        String str1 = "a"+"b";
        String str2 = "ab";
        System.out.print(str2 == str1); //true
        System.out.println(str1.equals(str2)); //true

str2 == str1:比较地址值,都在常量值中,相等。

str1.equals(str2):string重写equals方法,比较的是数值,相等

3)

        String str1 = "a";
        String str2 = "ab";
        String str3 = str1+"b";
        System.out.println(str2 == str3); //false
        System.out.println(str2.equals(str3)); //true

str2 == str1 : 双等引用数据类型比较地址值。对于字符串引用的 + 号连接问题,由于字符串引用在编译期是无法确定下来的,在程序的运行期动态分配并创建新的地址存储对象。str3在堆内存中,str2在常量池。所以地址值是不同的

str2.equals(str3):string重写equals方法,比较的是数值,相等

4)

       final String str1 = "a";
        String str2 = "ab";
        String str3 = str1+"b";
        System.out.println(str2 == str3); //true
        System.out.println(str2.equals(str3)); //true

str2 == str1 : 双等引用数据类型比较地址值。final 修饰的变量是一个常量,编译期就能确定其值。所以 str1 + "b"就等同于 "a" + "b",两者地址值都在常量池中,所以结果是 true。

str2.equals(str3):string重写equals方法,比较的是数值,相等。

String s1 = new String("abc")创建了几个对象?

答案:两个,一个常量池中的对象,一个new String()对象

我们可以查看它的字节码验证下:

以下代码执行过程中创建了几个对象? 

String str1 = "a";
String str2 = "b";
String str3 = str1 + str2;

分析其字节码以上代码等价于 

String string = new StringBuilder().append(str1).append(str2).toString();

答案:4个一个常量池中的对象a,一个常量池中的对象b,还有一个拼接的StringBuilder对象以及toString()中的一个new String()对象

参考博客:java String类常见面试题_chaobin6的博客-CSDN博客_java string面试题

想要了解更多编程小知识,快来关注公众号:爪哇开发吧!每周会不定时的进行更新。

posted @ 2022-03-09 22:20  小猪不会叫  阅读(50)  评论(0)    收藏  举报  来源