String字符串相关类—4
StringBuffer StringBuilder
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. StringBuffer类概述
1). StringBuffer类基本概念
(1). StringBuffer类的源码声明及含义
[1]. StringBuffer类声明
public final class StringBufferextends AbstractStringBuilder
implements java.io.Serializable, CharSequence
[2]. StringBuffer类也是final修饰的类,所以StringBuffer类不能被继承
[3]. StringBuffer类与String类的区别
{1}. 字符串常量一旦被初始化,值就不能被改变。
{2}. StringBuffer可以对里面的字符串进行修改,是字符串缓冲区
(2). 缓冲区
[1]. 缓冲区含义
可以向缓冲区中添加数据。使用的时候,可以用StringBuffer的toString方法来查看缓冲区中的内容【因此StringBuffer重写了Object的toString()】
[2]. 缓冲区的三个特点
{1}. 长度可变
StringBuffer是一个容器,长度可以变化
{2}. 可以直接操作各种类型的数据
StringBuffer可以直接操作各种类型的数据
但是数组只能操作一种类型的数据
{3}. 最终通过toString()方法变成字符串
(3). StringBuffer应用场景
满足以下三要素,就可以使用StringBuffer
【操作数据类型不确定】
【操作数据的长度不确定】
【最终变成字符串】
2). StringBuffer的常用方法
****【StringBuffer知识点】StringBuffer是一个存放字符串的容器。
【记住一个规律】只要是容器,就能增、删、改、查(CRUD)
(1). 增(也叫存储)
[1]. 将指定数据向StringBuffer的容器结尾处追加元素
{1}. 函数原型:StringBufferappend(任意类型的参数)
{2}. append方法返回StringBuffer本身这个容器
【StringBuffer】这个容器里面的内容如何变化,容器本身不变。
【注意】
{1}.StringBuffer类很多方法都返回StringBuffer对应的容器本身。这是因为CRUD是容器里面的数据,而容器本身没有变。
{2}.String类的很多方法都返回String类型的字符常量,不能被修改,所以,返回来的字符串并不是原来那个字符串本身,而是常量池中新的字符串的引用。
{3}. 举例比较两者的区别
【方法调用链】使用前提:方法每次返回的都是同一个对象
StringBuffer的连续append形式:
由于append返回的是容器本身,所以连续的append方法会一直向StringBuffer对应的容器添加数据。
e.g.
StringBuffer sb1= new StringBuffer();
//方法调用链,append每次返回的都是sb1这个容器
sb1.append("abc").append(true).append(34).append(23.4);
System.out.println(sb1);
打印结果:
[2].向StringBuffer的容器指定位置添加元素
{1}. 函数原型:StringBuffer insert(int offset, String str)//还有许多重写形式
{2}. insert方法返回StringBuffer本身这个容器
e.g. 向刚才的StringBuffer容器的'a'后面添加"qq"这个字符串
StringBuffer sb1= new StringBuffer();
sb1.append("abc").append(true).append(34).append(23.4);
System.out.println(sb1);
sb1.insert(1, "qq");
System.out.println(sb1);
打印结果:
(2). 删
[1]. 删除StringBuffer缓冲区中的指定区间数据
{1}. 函数原型:StringBufferdelete(int start,int end)
【注意】Java中操作两个端点的时候,含头不含尾
{2}. 删除完其中的数据之后,容器还是以前的容器。所以delete方法返回StringBuffer本身这个容器
{3}. 删除整个缓冲区中的所有数据
调用delete(0,StringBuffer容器内容长度)
根据Java中操作两个端点的时候,含头不含尾的特点,第二个端点写成StringBuffer容器内容长度,实际上是删除0--->StringBuffer容器内容长度-1的内容。所以这条语句可以清空缓冲区。
举例:
StringBuffer sb1= new StringBuffer();
sb1.append("abc").append(true).append(34).append(23.4);
System.out.println(sb1);
sb1.delete(0, sb1.length());
System.out.println("清空之后:"+sb1);
打印结果
[2]. 删除StringBuffer缓冲区中的指定位置字符
{1}. 函数原型:StringBuffer deleteCharAt(int index)
{2}. deleteCharAt方法返回StringBuffer本身这个容器
{3}. deleteCharAt(int index)的原理
实际上是采用了delete(index,index+1)这样的调用
(3). 改
[1]. 用新的字符串替换StringBuffer容器中指定区间的内容
{1}. 函数原型:StringBuffer replace(int start,int end, String str)
{2}. replace方法返回StringBuffer本身这个容器
{3}. Java中的两个端点,含头不含尾
[2]. 为StringBuffer中指定位置的内容替换为新的字符串
{1}.函数原型:StringBuffer setCharAt(int index,char ch)
{2}. setCharAt方法返回不是StringBuffer本身这个容器,而是void
[3]. 反转StringBuffer中的内容
{1}. 函数原型:StringBuffer reverse()
{2}. reverse方法返回StringBuffer本身这个容器
[4]. 转换StringBuffer中的内容到字符数组
{1}. 函数原型:void getChars(int srcBegin,int srcEnd, char dst[],int dstBegin)
{2}. Java中的两个端点,含头不含尾
(4). 查/获取
【StringBuffer这个功能和String类相关的功能非常类似,这里仅仅给出简写即可】
char charAt(int index) 获取StringBuffer中的内容在指定位置的字符
int indexOf(int ch) 获取字符ch在StringBuffer中的内容的第一次出现的位置
int lastIndexOf(int ch) 获取字符ch在StringBuffer中的内容的最后一次出现的位置
int length() 获取StringBuffer中内容的长度
String subString(int beginIndex,int endIndex) 获取StringBuffer内容中的子串
【注意,获取功能返回的不是StringBuffer这个容器】
2. StringBuilder
1). StringBuilder与StringBuffer
功能上和StringBuffer一致
[1]. StringBuilder是StringBuffer的一个简易替换。
API与StringBuffer一致,但是StringBuilder不保证线程同步
[2]. StringBuilder出现在JDK5之后
{1}. StringBuilder线程不同步 ----->数据不安全----->效率高
{2}. StringBuffer线程同步 ----->数据安全----->效率低
【注意】多线程的时候,可以使用StringBuilder,可以自行加锁,保持同步
3. JDK升级的三方面
(1). 提高安全性
(2). 提高效率
StringBuffer的升级版StringBuilder就是为了提高效率而产生的
(3). 简化书写
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------