1.String类的劣势
字符串是常量;它们的值在创建之后不能更改。
字符串缓冲区支持可变的字符串。
因为 String 对象是不可变的,所以可以共享
String类的底层是被final修饰的byte数组:private final char value[];
因此,其值不可改变。
字符串每相加一次,就会重新占用一块内存。
如:“a”+“b”+“c”:这三个字符串本身会占用一块空间。当执行"a"+“b”=“ab"又占用一个空间
最后"ab”+“c”="abc"结果又占用一块空间。一个字符串相加,便占用了5块字符串的空间,可见其效率低下,空间复杂度之高。
2. StringBuilder类
StringBuilder类:字符串缓冲区类
StringBuilder类底层也是一个数组,但其长度可变。
底层定义为:byte[] value = new byte[16];初始长度为16字节,空间不够,自动扩容。
字符串每相加一次,仍然还是在原缓冲区放入字符串,始终在一个字符串缓冲区
如:“a”+“b”+"c"只会占用一个字符串缓冲区空间
缓冲区:缓冲区可以提高操作效率。
3. StringBuilder类的构造方法
StringBuilder()
//构造一个其中不带字符的字符串,初始容量为 16 个字符。
StringBuilder(String str)
//构造一个字符串,并初始化为指定的字符串内容。
3. StringBuilder类的成员方法
StringBuilder append(...)
//添加任意数据类型的字符串格式,并返回当前对象自身
String toString()
//将StringBuilder对象转化为String对象
示例:
package linxu.day14;
public class demo2 {
public static void main(String[] args) {
StringBuilder str1=new StringBuilder();
StringBuilder str2=new StringBuilder("abc");
System.out.println("str1:"+str1);
System.out.println("str2:"+str2);
System.out.println(str1==str2);//直接==是比较地址值,结果为false,说明不是同一个对象
str1=str2.append("1");
System.out.println("str1:"+str1);//根据打印结果,可以看出,append是追加字符串
System.out.println("str2:"+str2);
System.out.println(str1==str2);//结果为true,说明是同一个对象,即:append返回值返回的是this,而不是数据值
//所以,既然返回的是this,是调用对象本身,那么返回值是否接受便无所谓了
str1.append(23);
str1.append(8.8);
str1.append('a');
System.out.println("str1:"+str1);//append方法可以追加任意数据类型的值,然后转化为字符串跟在原字符串后面
}
}
/*打印结果
str1:
str2:abc
false
str1:abc1
str2:abc1
true
str1:abc1238.8a
str2:abc1238.8aa90lin
*/
4. 链式编程
链式编程:如果一个方法是返回值是一个对象,那么可以直接继续调用所返回对象的方法,如:
str2.append('a').append(90).append("lin");
System.out.println("str2:"+str2);
//再比如:
System.out.println("abC".toLowerCase().toUpperCase());
//toLowerCase字符串全部转化为小写/toUpperCase字符串全部转化为大写
5. StringBuilder和String的相互转换
StringBuilder->String:使用StringBuilder的toString()
方法
String->StringBuilder:使用含参构造StringBuilder(String str)