String(一)的不可变验证

String(一)的不可变验证


String不可变性

  String是Java的一个不可变的类,所以他一旦被创建就无法被修改,查看啊JDK文档你就会发现,String类每一个看起来会修改String值的方法,实际上都会返回一个全新的String对象。而最初的String对象丝毫未动。

image_1ckv7ubvu1h0hr9uo8217qn18jv9.png-12.8kB

String的 sbstring()方法

image_1cl1klucc18nk1kkneh43b8glf9.png-28.6kB

可以看到返回的是一个新的String.

String创建后存放的位置

String str1 = "aaa" 在编译时期就确定str1的值,它的位置在常量池里面

String str2 = new String("bbb") 这段代码一共生成了两个对象,"bbb"在编译时期就能确定值,第一次生成对象在常量池, 当执行new String(),它还会在里面生成一个对象,当你调用str2时调用的是里面的引用。
image_1cl1lgjem1dfq1p9ar4917indtcm.png-43.1kB

无图无真相,来进入反编译看看。

public class StringNewTest {
    public static void main(String[] args) {

        String str1 = "aaa";
        String str2 = new String("bbb");
        System.out.println(str1+str2);
    }

}

这里使用javap -verbose -c StringNewTest.class 进入反编译。

这里是常量池的截图,内容太多分开弄
image_1cl1nb5fg1q2b1ioi1d0h10sp1mdm1g.png-45.7kB

在方法区里面查看堆里面的信息

image_1cl1nf6mdf4g1sl0lum1ip21b651t.png-34.7kB

重载”+”与StringBuilder

在java中仅有两个重载过的操作符分别是:++=

下面这段代码通过反编译就可以看到看到+StringBuild的关系了

public class StringConn {
    public static void main(String[] args) {

        String a = "aaa";
        String b = "bbb";
        String c = a+b+"ccc";
        String d = new String("ddd");

        System.out.println(c);

    }
}

这里使用javap -c命令进行反编译

image_1cl1mh3e21bq61emv1f3n1vno1m6m13.png-47kB

在这里可以看到当使用+时,会调用StringBuild的append()来拼接字符串,这里一共执行了两次append()方法,最后调用toString()生成结果。这里更加可以确定String是不可变的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值