欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

String(一)的不可变验证

程序员文章站 2022-05-08 19:42:07
...

String(一)的不可变验证


String不可变性

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

String(一)的不可变验证

String的 sbstring()方法

String(一)的不可变验证

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

String创建后存放的位置

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

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

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

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 进入反编译。

这里是常量池的截图,内容太多分开弄
String(一)的不可变验证

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

String(一)的不可变验证

重载”+”与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命令进行反编译

String(一)的不可变验证

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