经过前两篇的介绍,终于把String类的所有能用到的构造方法和常用成员方法都介绍了一遍。
终于开始了重点:可变的字符串:StringBuilder、StringBuffer
在使用上,两者的方法和用法都是一样的。其中的差别我们来分析一下:
- 共同点:都是字符串的缓冲区,都是字符串的生成器,都是可变的字符序列。
- 不同点:
出现版本不同 : StringBuffer 1.0
StringBuilder 1.5
线程安全不同 : StringBuffer是线程安全的
StringBuilder是线程不安全的
效率不同 : StringBuilder 效率较高
StringBuffer 效率较低
字符串缓冲区StringBuilder
概述:
- StringBuilder是一个可变的字符序列,因为在类中提供了修改私有成员变量的方法。常用的方法是append和insert,就是在StringBuilder对象本身上,进行修改操作。
- StringBuilder底层和String类型一样,也是维护了一个字符数组,数组是私有的,外界无法直接访问,因此在StringBuilder或者String中对数组进行操作的公有方法的封装。
- String类型和StringBuilder的关系:都是用于描述字符串。
- String是不可变的字符序列,没有提供修改私有成员的方法;StringBuilder是可变的字符序列,因为提供了修改成员变量的方法;
- String长度本身也不可以变化,StringBuilder长度可以变化,可以认为StringBuilder就像一个可以伸缩的容器,用于存储字符。
我们可以看到名字:字符串缓冲区,那么什么是缓冲区呢,就像是我们的水杯一样,我们接水的水龙头只能一滴一滴的接,但是我们不能等到渴的时候去等着水龙头一滴滴的喝,所以我们拿一个水杯放在那里,等我们渴了就去喝水杯里积攒的水一样。那么我们还要考虑的问题又多了起来,水杯的容量要多大呢,水杯接满了怎么办,水杯里的水喝完了怎么办?这些问题都会有相应的初识设置和方法来解决。
构造方法:
代码示例:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println(sb);
StringBuilder sb1 = new StringBuilder(30);
System.out.println(sb1);
StringBuilder sb2 = new StringBuilder("adfds");
System.out.println(sb2);
}
adfds
(这里只示例三种,另外一种不太常用)这里可以看出上面的两种都没有赋值,都还是空串,第三个有了内容。
这里前两种构造方法里说的容量,就像是上面比喻的水杯的容量一样,提供一个大小差不多的杯子来接水。这里初始化提供的是16容量的大小。
成员方法:
添加功能:
- append(任意类型):可以将任意数据类型,转成字符,添加到生成器中
- insert(int index, 任意数据类型):可以将任意数据类型,添加到指定的位置
说明:1、index的范围是0~当前缓冲区的大小;2、插入数据之后,数据本身的索引就是参数中指定的index
这里的两个方法都有很多的重载方法,因为太多,就不一一列举了,可以自行去API文档中查看练习。
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("aaaaaaa");
System.out.println(sb);
sb.insert(3, "bbbbb");
System.out.println(sb);
}
aaaaaaa
aaabbbbbaaaa
删除功能
- deleteCharAt(int index) :删除指定索引的字符
- delete(int start, int end):删除指定范围的字符,被删除的部分包含头不包含尾
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("12345678");
System.out.println(sb);
sb.deleteCharAt(0);
System.out.println(sb);
sb.delete(3, 4);
System.out.println(sb);
}
12345678
2345678
234678
替换和反转功能
- replace(int start, int end ,String str):将字符串缓冲区中的从start开始到end-1这部分内容,替换成str
- reverse():将原有字符序列进行反转
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("12345678");
System.out.println(sb);
sb.replace(1, 5, "abc");
System.out.println(sb);
sb.reverse();
System.out.println(sb);
}
12345678
1abc678
876cba1
String和StringBuilder拼接字符串的区别
使用String类型拼接字符串:时间和空间上都非常浪费。
1、创建一个StringBuilder的存储空间,大小为第一个字符串的长度+16(第一个对象)
2、将第一个字符串添加到缓冲区中
3、将第二个字符串添加到缓冲区中
4、将缓冲区对象转成字符串对象(创建了一个新的字符串对象)(第二个对象)
5、返回该字符串对象
使用StringBuilder拼接字符串:时间和空间上都非常节省,无论循环多少次,都只创建两个对象。
1、创建一个新的StringBuilder的存储空间
2、在StringBuilder的基础上进行添加,不创建新的字符串
3、循环完成后,将StringBuilder转成String
String和StringBuilder的相互转换
String转成StringBuilder
1、StringBuilder的构造方法
2、append方法
StringBuilder转成String类型
1、toString的方法
2、使用String的构造方法
大概到这里,三者的区别和联系相信已经博友们已经有大概的了解了。