StringBuilder
StringBuilder可看作是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率
public class StringBuilderDemo {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder();
//打印:
//因为StringBuilder是Java已经写好的类
//Java在底层对他做了一些特殊处理
//打印对象不是地址值而是属性值
//所以打印结果为空
System.out.println(sb);
StringBuilder sb1 = new StringBuilder("a");
System.out.println(sb1);
//2.添加数据
sb1.append(1);
sb1.append(2.3);
sb1.append("lll");
sb1.append(true);
sb1.append('黑');
System.out.println(sb1);//a12.3llltrue黑
//3.反转reverse
StringBuilder sb2 = new StringBuilder("abc");
sb2.reverse();
System.out.println(sb2);//cba
//4.获取长度length()
System.out.println(sb2.length());//3
//5.用toString把StringBuilder变回字符串
StringBuilder sb3 = new StringBuilder();
sb3.append("aaa");
sb3.append("bbb");
sb3.append("ccc");
sb3.append("ddd");
System.out.println(sb3);//aaabbbcccddd
//sb3只是一个容器,是对字符串进行操作的工具,用toString把StringBuilder变回字符串
String str = sb3.toString();
System.out.println(str);//aaabbbcccddd
}
}
/**
* ClassName:StringBuilderDemo1
* Description:
* 从键盘输入一个字符串,判断字符串是否对称
*/
public class StringBuilderDemo1 {
public static void main(String[] args) {
//从键盘输入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.next();
//反转字符串
StringBuilder sb = new StringBuilder();
String str1 = sb.append(str).reverse().toString();
if(str.equals(str1)){
System.out.println("当前字符串是对称字符串 ");
}else {
System.out.println("当前字符串不是对称字符串 ");
}
}
}
使用StringBuilder的场景:
-
字符串的拼接
-
字符串的反转
练习:
/**
* ClassName:StringBuilderDemo12
* Description:
*
* 定义一个方法,把int数组中的数据按照指定格式拼接成一个字符串
* 调用该方法,并从控制台输出结果
* 例如:数组为 int[] arr = {1,2,3};
* 执行方法后的输出结果为:[1,2,3]
*
* @version 1.0
* @Author wang
*/
public class StringBuilderDemo12 {
public static void main(String[] args) {
//1.定义数组
int[] arr = {1,2,3};
//2.调用方法把数组变成字符串
String str = arrToString(arr);
System.out.println(str);
}
public static String arrToString(int[] a) {
StringBuilder sb =new StringBuilder();
sb.append("[");
for (int i = 0; i < a.length; i++) {
if (i == a.length-1){
sb.append(a[i]);
}else {
sb.append(a[i]).append(",");
}
}
sb.append("]");
return sb.toString();
}
}
StringJoiner
StringJoiner与StringBuilder一样,也可看作是一个容器,创建之后里面的内容是可变的。
public class StringJoinerDemo {
public static void main(String[] args) {
//1.创建对象
StringJoiner sj = new StringJoiner("----");
//2.添加元素
sj.add("1").add("2").add("3");
//打印
System.out.println(sj);//1----2----3
//1.创建对象
StringJoiner sj2 = new StringJoiner(",", "[", "]");
//2.添加元素
sj2.add("aaa").add("bbb").add("ccc");
//打印
System.out.println(sj2);//[aaa,bbb,ccc]
//长度
int length = sj2.length();
System.out.println(length);
//toString
String str = sj2.toString();
System.out.println(str);//[aaa,bbb,ccc]
}
}
字符串原理
1、字符串存储的内存原理
-
直接赋值会复用字符串常量池中的
-
new出来的不会复用,而是开辟一个新的空间
2、==号比较多的到底是什么
-
基本数据类型比较数据值
-
引用数据类型比较地址值
3、字符串拼接的底层原理
-
如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
-
如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。