字符串——第二部分(StringBuilder、StringJoiner、字符串底层原理)
1.StringBuilder(字符串拼接、反转中常用)
普通string创建都是不可变的,eg:s=s1+s2+s3,字符串先让s1+s2创建出一个字符串,在与s3创建出一个字符串,本质上创建了两个字符串。
1.1 构建方法
1.2 成员方法:所有方法在容器内发生
示例代码:StringBuilder是Java写好的类,Java对其进行了一些处理,打印时输出的不是地址值,而是属性值
append、reserve、length方法
tostring方法:利用完stringbuilder工具后,转回字符串,以便使用字符串的方法
1.3 链式编程:当调用一个方法时,不需要用变量接收他的结果,可以继续调用其他方法
如下:“2、添加字符串 ” 代码示例:
public class StringBuilderDemo4 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder();
//2.添加字符串
sb.append("aaa").append("bbb").append("ccc").append("ddd");
System.out.println(sb);//aaabbbcccddd
//3.再把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);//aaabbbcccddd
}
}
1.4 Test
1.4.1 Test1
1.4.2 Test2(与上一天笔记题相同,方法不同)
本方法:
字符串拼接方法:
2.StringJoiner(若需要中间,开头,结尾标记时使用)
2.1 构建方法(没有空参构造)
2.2 成员方法:所有方法在容器内发生
示例代码:
无区分起始、结束、间隔符号:
区分起始、结束、间隔符号:
length():计算的是包含间隔符号、起始、终止符号的总长度
3. 小结
4. 字符串底层原理
4.1 底层原理3:字符串拼接底层原理
情况1:等号右边没有变量都是字符串,如下:
触发字符串优化机制,在编译时已经是最佳结果,下面左边在编译时等同于右边
情况2.1(JDK8以前):等号右边有变量时,如下:
s2=s1+"b",等同于:
new StringBuilder().append(s1).append("b").toString();每次拼接都会在堆内存中这样操作
为何在堆操作?
以下是tostring源码,可见是用new创建的,所以在堆内存中