前面学过,字符串是常量(因为字符串的底层是一个被final修饰的byte数组private final byte[] value),他们的值在创建之后不能更改,进行字符串相加时,内存中就会有多个字符串,占用空间多,效率低下,举例:
String s = “a” + “b” + “c “;
这”a””b””c”三个字符串分别占用三块内存空间,然后”a”+”b”结果生成一个新的字符串,占用一块空间,最后 “a” + “b” + “c “又是一个字符串,一共五个字符串,占用内存,效率低下。
但字符串缓冲区支持可变的字符串。
这个字符串缓冲区,就是String Build类,可以提高字符串的操作效率(看成是一个长度可以变化的字符串),底层是一个数组,但是没有被final修饰,可以改变长度。
byte[] value = new byte[16],初始长度16。
回忆知识点:ArrayList无参构造初始化的空集合初始容量为10。
此时举例:String s = “a” + “b” + “c “;
首先初始化一个长度为16的空数组,先把”a”放在索引为0的位置,再把”‘b”放在索引为1的位置,接着把”c”放在索引为2的位置。
StringBuild在内存中始终是一个数组,占用空间少,效率高,如果超出了StringBuild的容量,会自动地扩容。
StringBuild构造方法:
StringBuild():构造一个不带任何字符的字符串生成器,其初始容量为16个字符。
StringBuild(String str):构造一个字符串生成器,并初始化为指定的字符串内容。
// 构造一个不带任何字符的字符串生成器,其初始容量为16个字符。 StringBuilder stringBuilder = new StringBuilder(); System.out.println(stringBuilder); // 空,非地址值,重写toString() //构造一个字符串生成器,并初始化为指定的字符串内容。 StringBuilder stringBuilder1 = new StringBuilder("abc"); System.out.println(stringBuilder1);//abc
常用的成员方法:
public StringBuilder append(…):添加任意类型数据的字符串形式,并返回当前对象自身(地址值)。即返回的是this,调用的方法对象。
private static void demo01(){ StringBuilder stringBuilder = new StringBuilder(); // 一次传一个,返回当前对象自身(地址) StringBuilder stringBuilder1 = stringBuilder.append(1); // 对于引用类型,==比较的是地址值 //回忆知识点:如果要比较内容,使用equals()方法 System.out.println(stringBuilder == stringBuilder1); // true // 使用append方法可以不接收返回值 stringBuilder.append(3); stringBuilder.append("2"); // 可以添加进字符串 stringBuilder.append('c'); System.out.println(stringBuilder); /* 链式编程:方法返回值是一个对象,可以继续调用方法 */ // 比如: System.out.println("abc".toUpperCase().toLowerCase().toUpperCase()); stringBuilder.append("abc").append("1").append('c'); System.out.println(stringBuilder); }
public String toString():将当前StringBuilder对象转换为String对象。
对应StringBuilder的有参构造方法反向转换。
private static void demo02(){ //String-->StringBuilder StringBuilder stringBuilder = new StringBuilder("abc"); stringBuilder.append(3).append(2).append('d'); System.out.println("StringBuilder:" + stringBuilder); // StringBuilder:abc32d //StringBuilder-->String String str = stringBuilder.toString(); System.out.println("String:" + str); // String:abc32d }