Java String相加底层原理

本文探讨了Java中字符串创建的两种方式:字面值和new关键字。通过实例展示了字面值拼接在编译期的优化,以及new创建对象在堆中的存储。同时解释了字符串拼接时StringBuilder的使用,以及如何影响对象的相等性和哈希码。

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

代码

		String a = "a";
        String b = "b";
        String c = "c";
        String s1  = "a"+"b"+"c";
        String s2 = a+b+c;
        System.out.println(s2==s1);
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));

粗略解释

首先了解字符串常量池,创建字符串对象分别有两种,一种是字面值创建,一种是 new 创建,这两者存储的内存地址是不一样的。
如果是字面值创建的方式,如 String a="a",JVM会先去字符串常量池中寻找有没有“a”这个字符串,若有,则将其地址给 a;若没有,则先在常量池里创建“a”,然后再把地址给a;而通过 new a =  new String("a")的方式创建对象,则是在堆中创建“a”对象,a 指向这个对象。
当字符串进行拼接时,如果是字面值进行拼接,在编译阶段会进行优化,直接变成字符串”abc“。
当字符串变量相加时,因被final修饰,字符串不能修改,会 先生成StringBuilder对象,通过append()方法进行字符串拼接,在调用toString()方法形成新的字符串,所以s1可以理解为 
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("a");
        stringBuilder.append("b");
        stringBuilder.append("c");
        String s = stringBuilder.toString();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值