String(一)的不可变验证
程序员文章站
2022-05-08 19:42:07
...
String(一)的不可变验证
String不可变性
String
是Java的一个不可变的类,所以他一旦被创建就无法被修改,查看啊JDK文档你就会发现,String类每一个看起来会修改String值的方法,实际上都会返回一个全新的String对象。而最初的String对象丝毫未动。
String的 sbstring()方法
可以看到返回的是一个新的String.
String创建后存放的位置
String str1 = "aaa"
在编译时期就确定str1的值,它的位置在常量池里面
String str2 = new String("bbb")
这段代码一共生成了两个对象,"bbb"
在编译时期就能确定值,第一次生成对象在常量池
, 当执行new String()
,它还会在堆
里面生成一个对象,当你调用str2时调用的是堆
里面的引用。
无图无真相,来进入反编译看看。
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
进入反编译。
这里是常量池的截图,内容太多分开弄
在方法区里面查看堆里面的信息
重载”+”与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
命令进行反编译
在这里可以看到当使用+
时,会调用StringBuild的append()来拼接字符串,这里一共执行了两次append()方法,最后调用toString()生成结果。这里更加可以确定String是不可变的。