文章目录
四、StringBuilder类
4.1 字符串拼接问题
不可变的String: String 字符串是常量,它们的值在创建之后不能更改。
字符串的底层是一个被final修饰的数组,不能改变,是一个常量:privare final byte[] value;
因为String对象是不可变的,所以可以共享。例如:String str='abc';
等效于:char date=['a','b','c']; String str=new String(data);
由于String类的对象内容不可改变,所以进行字符串拼接,内存中会创建一个新的字符串对象,占用空间多,效率低下。例如:
public class StringDemo {
public static void main(String[] args) {
String s = "Hello";
s += "World";
System.out.println(s);
}
}
上述代码在内存中总共产生了三个字符串,即"Hello"
、"World"
和"HelloWorld"
。引用变量s首先指向Hello
对象,最终指向拼接出来的新字符串对象,即HelloWord
。
解决这一问题,使用字符串缓冲区java.lang.StringBuilder
类。
4.2 StringBuilder概述
java.lang.StringBuilder是字符串缓冲区,即是一个容器, 支持可变的字符串。
底层也是一个数组,但是没有被final修饰,可以改变长度。byte[] value=new byte[16];
它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容(默认16字符空间,超过自动扩充)。
4.3 StringBuilder构造方法
- public StringBuilder(); 空参构造方法
- public StringBuilder(String s); 添加字符串的StringBuilder 容器
public static void main(String[] args) {
//空参数构造方法
StringBuilder bu1 = new StringBuilder();
System.out.println("bu1:"+bu1);//bu1:""
//带字符串的构造方法
StringBuilder bu2 = new StringBuilder("abc");
System.out.println("bu2:"+bu2);//bu2:abc
}
}
4.4 常用方法
4.4.1 append方法
功能: 添加任意类型数据的字符串形式,并返回当前对象自身。
注意: append方法返回的是this,this就是调用方法的对象
使用:
public static void main(String[] args) {
//创建StringBuilder对象
StringBuilder bu1 = new StringBuilder();
//使用append方法往StringBuilder中添加数据
StringBuilder bu2 = bu1.append("abc");//把bu的地址赋值给了bu2
//打印测试append方法
System.out.println(bu1);//"abc" //append方法返回的是this,调用方法的对象bu1,this==bu
System.out.println(bu2);//"abc"
//打印测试两个对象是否为同一对象
System.out.println(bu==bu2);//比较的是地址 true
System.out.println("====================================");
//使用append方法无需接收返回值
//方法重载
bu.append("abc");
bu.append(1);
bu.append(true);
bu.append(8.8);
bu.append('中');
System.out.println(bu);//abc1true8.8中
//链式编程:方法返回值是一个对象,可以继续调用方法
System.out.println("abc".toUpperCase().toLowerCase().toUpperCase().toLowerCase());
bu1.append("abc").append(1).append(true).append(8.8).append('中');
System.out.println(bu);//abc1true8.8中
}
4.4.2 reverse方法
功能: 将字符串缓冲区的内容进行翻转
示例:
public static void main(String[] args) {
StringBuilder bu = new StringBuilder("abc");
System.out.println("反转前"+bu);//bu:abc
bu.reverse();
System.out.println("反转后"+bu);//bu:cba
}
4.4.3 toString方法
StringBuilder和String的相互转换:
- String->StringBuilder:StringBuilder的构造方法
public StringBuilder StringBuilder(String str) 构造一个字符串生成器,并初始化为指定的字符串内容。 - StringBuilder->String:StringBuilder的toString方法
public String toString():将当前StringBuilder对象转换为String对象
使用:
public static void main(String[] args) {
//String->StringBuilder
String str = "hello";
System.out.println("str:"+str);
StringBuilder bu = new StringBuilder(str);
//往StringBuilder中添加数据
bu.append("world");
System.out.println("bu:"+bu);
//StringBuilder->String
String s = bu.toString();
System.out.println("s:"+s);
}