下列代码的运行结果是?
public class test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1 == s3);
}
}
/*
* Copyright (c) 2017, 2023, zxy.cn All rights reserved.
*
*/
package cn.str;
/**
* <p>Description:</p>
* <p>Class:</p>
* <p>Powered by zxy On 2023/6/9 20:36 </p>
*
* @author zxy [zxy06291@163.com]
* @version 1.0
* @since 17
*/
public class test {
public static void main(String[] args) {
String s1 = "abc";//记录串池中的地址值
String s2 = "ab";
String s3 = s2 + "c";//新new出来的对象
System.out.println(s1 == s3);//false
}
}
字符串拼接的时候,如果有变量:
JDK8以前:系统底层会自动创建一个 StringBuilder 对象,然后再调用其 append 方法完成拼接
JDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串
下列代码的运行结果是?
public class test1 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "a" + "b" + "c";
System.out.println(s1 == s2);
}
}
/*
* Copyright (c) 2017, 2023, zxy.cn All rights reserved.
*
*/
package cn.str;
/**
* <p>Description:</p>
* <p>Class:</p>
* <p>Powered by zxy On 2023/6/9 20:48 </p>
*
* @author zxy [zxy06291@163.com]
* @version 1.0
* @since 17
*/
public class test1 {
public static void main(String[] args) {
String s1 = "abc";//记录串池中的地址值
String s2 = "a" + "b" + "c";//复用串池中的字符串
System.out.println(s1 == s2);//true
}
}
在编译的时候,就会将"a" + "b" + "c"拼接为“abc"
拓展:
字符串拼接的底层原理
- 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串
- 如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存
StringBuilder 提高效率原理图
- 所有要拼接的内容都会往StringBuilder 中放,不会创建很多无用的空间,节约内存