目录
13.StringBuilder类
13.1.String类和StringBuilder类区别
String类:
1.字符串都是常量,它们的值在创建之后不能更改。
2.字符串的底层是一个被final修饰的数组,不能改变,是一个常量。即底层private final byte[] value;
3.进行字符串的相加,内存就会有多个字符串,占用空间多,效率低下。
StringBuilder类:
1.也称字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变化的字符串)。
2.底层也是一个数组,但是没有被final修饰,可以改变长度。byte[] value=new byte[16];
3.StringBuilder在内存中使用是一个数组,占用空间少,效率高。若超出缓冲区默认容量,会自动扩容。
总之:
字符串是常量,它们的值在创建之后不能更改,因此在字符串相加时需要不断创建字符串对象,效率低。
字符串缓冲器支持可变的字符串,因此字符串拼接时始终是一个数组中完成。效率高。
13.2.字符串拼接问题
1.由于String类的对象内容不可改变(常量),所以每当进行字符串拼接时,总是会在内存中创建一个新的对象:
public static void main(String[] args){
String s="hello";
s+="word";
System.out.println(s);
}
2.分析:
在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被修改。
根据这句话分析上面代码,其实总共产生了三个字符串,即"hello","word","helloword",
引用变量s首先指向hello对象,最终指向拼接出来的新字符串对象即helloword.
13.3.StringBuilder类的构造函数和API
1.java.lang.StringBuilder类:字符串缓冲区,可以提高字符串效率,底层是一个长度可变的数组。
2.构造方法:
StringBuilder():构造一个不带任何字符的字符串生成器(底层是可变数组),其初始容量为16个字符。
StringBuilder(String str):构造一个字符串生成器,初始化为指定的字符串内容。
3.StringBuilder类常用2个方法:
---public StringBuilder append(...):
1.向字符串缓冲池StringBuilder中添加任意类型(重载)数据,返回当前对象自身即this。
2.append方法返回的是this,即调用方法的对象,this==bu3,即把bu3地址赋值给了bu4
3.使用append方法无需接收返回值,bu5.append("abc");bu5.append(1);...
4.链式编程:方法返回值是一个对象,则可以继续调用方法。
append方法返回的是自身对象this,因此仍可以继续调用它的方法append.
bu6.append("abc").append(1).append(true).append(8.8).append("中");
---public String toString():
StringBuilder对象与String对象相互转换。(StringBuilder和String类区别)
1.将string-->StringBuilder
:使用StringBuilder的带参构造方法将字符串转化为StringBuilder
StringBuilder(String str):构造一个字符串生成器,并初始化为指定的字符串内容。
2.将StringBuilder-->String
:使用StringBuilder中的toString方法。
public String toString():把当前StringBuilder对象转化为String对象。
4.关键代码:
: StringBuilder bu1=new StringBuilder();//空参数构造方法
: StringBuilder bu2=new StringBuilder("abc");//带字符串的构造方法
: StringBuilder bu4 = bu3.append("abc"); //使用append方法往字符串缓冲区中添加数据
: bu5.append("abc");//使用append方法无需接收返回值
: String str="hello";//String-->StringBuilder
: StringBuilder bu7=new StringBuilder(str);
: String s=bu7.toString();//StringBuilder-->Stringpublic class StringBuilder01 { public static void main(String[] args) { //空参数构造方法 StringBuilder bu1=new StringBuilder(); System.out.println(bu1); //bu1:""空的 //带字符串的构造方法 StringBuilder bu2=new StringBuilder("abc"); System.out.println(bu2);//bu2:abc //StringBuilder的append方法 StringBuilder bu3=new StringBuilder(); //使用append方法往StringBuilder字符串缓冲区中添加数据 //append方法返回的是this,即调用方法的对象,this==bu3,即把bu3地址赋值给了bu4 StringBuilder bu4 = bu3.append("abc"); System.out.println(bu3); System.out.println(bu4); System.out.println(bu3==bu4);//比较的是地址,true //使用append方法无需接收返回值 StringBuilder bu5=new StringBuilder(); bu5.append("abc"); bu5.append(1); bu5.append(true); bu5.append(1.1); bu5.append("中"); System.out.println(bu5);//输出abc1true1.1中 /* 链式编程:方法返回值是一个对象,则可以继续调用方法。 append方法返回的是自身对象this,因此仍可以继续调用它的方法append */ StringBuilder bu6=new StringBuilder(); bu6.append("abc").append(1).append(true).append(8.8).append("中"); System.out.println(bu6); //通过StringBuilder构造函数将字符串(对象)转化为StringBuilder对象(字符串缓冲区) //String-->StringBuilder String str="hello"; StringBuilder bu7=new StringBuilder(str); //往StringBuilder中添加任意数据的字符串形式 bu7.append("word"); System.out.println("bu7:"+bu7);//字符串缓冲区中bu7:helloword //通过StringBuilder类的toString方法将StringBuilder对象化为String对象 String s=bu7.toString(); System.out.println(s); } }