Java --- 字符串拼接 的 底层原理

str1 + str2 = str3

没错,这就是简单的字符串拼接,也是在日常开发中运用比较广泛的一种写法。

小编我在上篇文章:Java — String 的内存分配 主要从内存角度,聊了聊 String。

今天呢,借着上篇文章的余热,从字节码 角度,分析一下 字符串拼接 的 底层原理


【大家也可以关注微信公众号 “皮皮克克” 进行查阅】

点击跳转至微信公众号,查看更多本文详情



一,字符串拼接实例演示
public class StringNewTest {

    public static void main(String[] args) {
        String s1 = "pipic";
        String s2 = "keke";

        String s3 = "pipickeke";
        String s4 = "pipic" + "keke";
        String s5 = s1 + "keke";
        String s6 = "pipic" + s2;
        String s7 = s1 + s2;

        String s8 = s6.intern();


        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false
        System.out.println(s3 == s6);//false
        System.out.println(s3 == s7);//false

        System.out.println(s5 == s6);//false
        System.out.println(s5 == s7);//false

        System.out.println(s6 == s7);//false

        System.out.println(s3 == s8);//true
    }
}

执行结果:

D:\jdk\jdk1.8.0_171\bin\java.exe
true
false
false
false
false
false
false
true

其实由上面这些执行结果,可以总结字符串拼接:

1,常量与常量的拼接结果在常量池,原理是编译器优化。
2,常量池中不会存在相同内容的常量。
3,只要其中一个是变量,结果就在堆中。变量的拼接原理是StringBuilder。
4,如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象的地址


大家伙可以看看,下面我们来具体分析。



二,字符串拼接底层原理
1,代码:
public class StringNewTest {

    @Test
    public void test1(){
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";

        String s4 = s1 + s2;

        System.out.println(s3 == s4);
    }
}

结果:
D:\jdk\jdk1.8.0_171\bin\java.exe
false


2,查看字节码指令

在这里插入图片描述


我们分析主要的前几行指令:
(1) 从字符串常量池中加载字符串常量,分别是 “a”,“b”,“ab”

在这里插入图片描述


(2) 创建 StringBuilder 对象,并初始化

在这里插入图片描述


(3) 完成拼接,.append(“a”).append(“b”)

在这里插入图片描述


(4) toString(),返回字符串对象地址

在这里插入图片描述

注意: 可以发现,这个过程中, 只是在堆空间中, 通过StringBuilder的append()方法,拼接成字符串 “ab”,最后调用 toString(),创建了新的String对象,即 new String(“ab”)。


所以,代码中 s3 = "ab", s4 = s1 + s2,s3 == s4 为 false。

在这里插入图片描述

懂了?



结束语:

本文已更新至微信公众号 “皮皮克克”,

欢迎各位小伙伴的查看。

点击跳转至微信公众号,查看更多本文详情

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮克克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值