深入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给我们做了什么操作:
在这里插入图片描述
在这里插入图片描述