【Java基础】字符串

本文探讨了Java中字符串比较的细节,包括使用+拼接,final修饰符的影响,new操作符创建的对象以及intern()方法的作用。通过不同场景的示例,展示了字符串在内存中的存储位置如何影响比较结果,强调了字符串常量池的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、字符串之间的比较

(1)"+"的比较
        String str1 = "1";
        String str2 = "2";
        String str3 = "12";
        String str4 = str1 + str2;
        System.out.println(str3 == str4);
    // 返回false,原因:“+”本质上是构建StringBuilder并调用append(),返回new String(value, 0, count),所以“+”拼接后的字符串不会存到常量池。

(2)final和"+"
        final String str1 = "1";
        final String str2 = "2";
        String str3 = "12";
        String str4 = str1 + str2;
        System.out.println(str3 == str4);
    // 返回true,原因:final修饰时会在编译期直接赋值为拼接后的形式(str4 = str1 + str2;相当于str4 = "12";)。

(3)final和new
        final String str1 = new String("1");
        final String str2 = new String("2");
        String str3 = "12";
        String str4 = str1 + str2;
        System.out.println(str3 == str4);
    // 返回false,原因:new是一个对象,即使有final修饰也不能转化成字面常量,new拼接会产生新地址。

(4)intern()
        String str1 = "1";
        String str2 = "2";
        String str3 = "12";
        String str4 = (str1 + str2).intern();
        System.out.println(str3 == str4);
    // 返回true,原因:intern()会强制将拼接的字符串写入常量池并返回字符串在常量池中的地址。
        String str1 = "1";
        String str2 = "2";
        String str3 = "12";
        String str4 = str1 + str2;
        str4.intern();
        System.out.println(str3 == str4);
    // 返回false,原因:虽然写入了常量池但并未将常量池中的字符串地址赋值给str4,str4指向的依旧是堆中的对象的地址。

二、字符串比较的本质

(一)一个双引号

(二)两个双引号

(三)一个new

(四)两个new

 String(char value[], int offset, int count)构造方法不会在常量池中创建。即通过此构造方法创建的String对象只有一个。比如:String str = new String(new char[]{'1'}, 0, 1)。

字符串创建步骤(以String s1 = new String("11");为例)

(1)在字符串常量池中查找是否有此字符串(“11”),如果有则返回对应的String对象地址;如果没有则在字符串常量池中创建String的OopDesc对象和char数组的TypeArrayOopDesc对象;

(2)将这个String对象对应的InstanceOopDesc封装成HashtableEntry对象,HashtableEntry对象作为StringTable的value进行存储;

(3)new关键字使的String的OopDesc在堆中再次创建一份。所以new String("11")会创建出来两个String的OopDesc对象和一个char数组的typeArrayOopDesc对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值