深入String字符串相加结果与原理
String a = "a";
String b = "b";
String c1 = "ab";
String c = "a"+"b";
String c2 = "a"+"b";
1.字符串常量直接相加
分析:
String a = "a";
String b = "b";
String c1 = "ab";
1.会把字符串"a"、“b”、“ab"放进常量池中,并返回给a、b、c1
2.String c=”a“+“b” jvm会在运行时将"a”+“b"自动拼接成"ab”,
然后会首先在常量池中寻找是否已有"ab",有则将”ab“在常量池中的地址返回给c,否则在常量池中创建"ab",并返回常量池中”ab“的地址
3.c2同理;
所以c、c1、c2都是存放的时常量池中’'ab"的地址。
2.1字符串常量对象相加
String a = "a";
String b = "b";
String c1 = "ab";
String c = "a"+"b";
String c2 = "a"+"b";
分析:
String a = "a";
String b = "b";
String c1 = "ab";
1.会把字符串"a"、“b”、"ab"放进常量池中,并返回给a、b、c1
2.String c=a+b,此时会在堆内存中直接创建一个为"ab"的对象并返回给c;
3.c2同理,此时在堆内存中创建了2个”ab“对象;
所以c1是存放的时常量池中’'ab"的地址
c、c2分别存放的是堆内存中自己对应"ab"对象的地址。
2.2字符串常量对象相加(new String(“abc”))
此时new String(“a”) 等价于 a = new String(“a”);
所以与2同理
分析:
String a = "a";
String b = "b";
String c1 = "ab";
1.会把字符串"a"、“b”、"ab"放进常量池中,并返回给a、b、c1
2.String c=a+b,此时会在堆内存中直接创建一个为"ab"的对象并返回给c;
3.c2同理,此时在堆内存中创建了2个”ab“对象;
所以c1是存放的时常量池中’'ab"的地址
c、c2分别存放的是堆内存中自己对应"ab"对象的地址。
3.字符串相加(常量+引用类型)(“a”+new String(“abc”))
分析:
1.会把字符串"a"、“b”、"ab"放进常量池中,并返回给a、b、c1
2.String c=“a”+new String(“b”),此时会在堆内存中创建一个StringBuilder对象传入"a",然后通过调用append(“b”)方法追加"b"并返回给c;
注意:String字符串相加 只要相加过程中出现引用类型都会采用创建StringBuilder的方式拼接字符串;
来看看反编译后的class文件,你就会一目了然
看看编译的时候JVM给我们做了什么操作: