StringBuilder概述
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率
String Builder是Java已经写好的类,Java在底层对他做了一些特殊处理,打印对象不是地址值二十属性值
package stringdemo;
public class StringBuilderDemo {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("sb");
//添加元素
sb.append(133);
//反转
sb.reverse();
//获取长度
int len = sb.length();
System.out.println(sb);
System.out.println(len);
}
}
package stringdemo;
public class SteingBuilderDemo2 {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
//添加字符串
sb.append("sad");
sb.append("sda");
sb.append("ada");
sb.append("dsa");
System.out.println(sb);
//3.再把String Builder变回去
String str = sb.toString();
System.out.println(str);
}
}
链式编程
当我们在调用一个方法的时候,不需要用变量接收他的成果,可以继续调用其他方法可以进行改写
sb.append("sad").append("sda").append("ada").append("dsa");
回文字符串小练习
package stringdemo;
import java.util.Scanner;
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.对称
//2.键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//2.反转键盘录入的字符串
String result = new StringBuilder().append(str).reverse().toString();
//3.进行比较
if (str.equals(result)){
System.out.println("当前字符串是对称字符串");
}else {
System.out.println("当前字符串不是对称字符串");
}
}
}
使用String Builder的场景
1.字符串的拼接
2.字符串的反转
拼接字符串小练习
package stringdemo;
public class StringBuilder4 {
public static void main(String[] args) {
//1.定义数组
int arr[] = {1,2,3};
//调用数组变成字符串
String str = arrToString(arr);
System.out.println(str);
}
public static String arrToString(int[] arr){
StringBuilder sb = new StringBuilder().append("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length-1){
sb.append(arr[i]);
}else {
sb.append(arr[i]).append(",");
}
}
sb.append("]");
return sb.toString();
}
}
扩展底层原理
1.字符串存储的内存原理
直接赋值会复用字符串常量池中的
new出来不会服用,而是开辟一个新的空间
2.==号比较到底是什么
基本数据类型比较数据值
引用数据类型比较地址值
3.字符串拼接的底层原理
(1)等号右边没有变量
拼接的时候没有变量,都是字符串
触发字符串优化机制
在编译的时候就已经是最终结果了
(2)等号右边有变量参与
调用了StringBuilder
JDK8字符串拼接的底层原理
会对字符串产生一个预估,产生一个数组
4.String Builder提高效率的原理图解
是一个内容可变的容器
String Builder源码分析
如果超过了容量,那么就会自动扩容,容量*2+2,如多超出了默认扩容,那么容量会以实际长度为准
扩容
如果超出扩容
返回实际长度