18-StringBuffer/StringBuilder

String是不可变的,会额外产生很多临时变量。如果需要频繁对字符串进行修改操作时,使用StringBuffer或StringBuilder。但StringBuffer/StringBuilder有个局限:最终必须转成字符串才可以使用

将数组变成字符串,用StringBuffer的sb.append(数据+分隔符)方法,在for循环中添加数据,最后用sb.toString()返回String类型。或者直接用Arrays.toString(arr) / Arrays.deepToString(arr) 方法

一、StringBuffer

1、StringBuffer:字符串缓冲区,代表字符序列可变的字符串,用于存储数据的容器

2、StringBuffer类的特点

(1)长度是可变的(数组长度是固定的)

(2)可以存储不同类型的数据(数组中只能存储同一类型数据)

(3)最终要转成字符串进行使用(数组中元素是一个一个的,不需要转换,直接使用)

(4)可以对字符串进行修改(字符串本身一初始化完毕不能改变,但可以通过缓冲区进行修改)

注:缓冲区(StringBuffer/StringBuilder)实质还是数组,是将数组封装了,对外提供方法。取出时是一整片字符串

3、StringBuffer类的构造函数

(1)public StringBuffer():构造一个不带字符的字符串缓冲区,其初始容量为16个字符

(2)public StringBuffer(int capacity):构造一个不带字符,但具有指定初始容量的字符串缓冲区

(3)public StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。该字符串的初始容量为16+str.length()

(4)public StringBuffer(CharSequence seq):构造一个字符串缓冲区,它包含与指定的CharSequence相同的字符。该字符串缓冲区的初始容量为16+CharSequence参数的长度

4、StringBuffer类的常见功能

(1)添加:

a)public StringBuffer append(xxx value):将xxx类型参数的字符串表现形式追加到序列的结尾(xxx类型的数据被转换为字符串,类似使用String.valueOf(xxx value)方法)

注:append方法的参数类型,基本数据类型char、boolean、int、long、float、double,有两种不行:byte、short,但byte、short都可以用int类型接收。其他类型参数还可以为:char[]、String、StringBuffer、Object、CharSequence

b)public StringBuffer append(char[] str, int offset, int len):从数组的offset处开始,长度为len

c)public StringBuffer append(CharSequence s, int start, int end):从start处开始,到end处结束,包含头不包含尾

d)public StringBuffer insert(int offset, xxx value):将xxx类型参数的字符串表现形式插入到序列的指定位置

注:xxx可以是基本数据类型char、boolean、int、long、float、double(除了byte、short),也可以是char[]、String、Object、CharSequence

e)public StringBuffer insert(int index, char[] str, int offset, int len)

f)public StringBuffer insert(int dstOffset, CharSequence s, int start, int end)

    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        boolean b = true;
        sb.append(b);
        sb.insert(1, "hah");
        System.out.println(sb.toString());  //thahrue
    }

(2)删除:

a)public StringBuffer delete(int start, int end):移除start到end之间的子字符串,包含start不包含end

b)public StringBuffer deleteCharAt(int index):删除指定位置的元素

注:

清空缓冲区:sb.delete(0, sb.length()):缓冲区还在,只是里面的东西没有了。等效于sb.setLength(0);

sb = new StringBuffer():新开辟了一个缓冲区,内容为空

(3)查找:

a)public char charAt(int index):返回指定索引处的char值

b)public int indexOf(String str, int fromIndex):从指定索引处开始,返回指定子字符串在该字符串中第一次出现的索引

c)public int lastIndexOf(String str, int fromIndex)

(4)修改:

a)public StringBuffer replace(int start, int end, String str):用指定字符串str替换sb中从start开始到end结束的字符串(不包含end) -- 先删除再插入

b)public void setCharAt(int index, char ch):将给定索引处的字符设置为ch

(5)其他方法:

a)public void setLength(int newLength):设置字符序列的长度(newLength<length截取部分,newLength>length后面补null)

注:sb.setLength(0):等效于 sb.delete(0, sb.length()):清空缓冲区

b)public StringBuffer reverse():将此字符序列用其反转形式取代

5、可变长度数组

(1)new StringBuffer():构造一个不带字符串的字符串缓冲区,初始容量为16个字符。如果长度超过16个字符,还可以存 -- 可变长度数组

(2)可变长度数组:遍历复制一个新的数组,长度是原数组长度的一倍或在原数组上延长50%,并将原数组中的内容全部复制到新数组中

(3)如果可以确定数据量,则在创建时直接指定字符串缓冲区长度。使用默认的16个字符长度,一旦超过范围,就要延长。延长要开辟空间,要进行运算,效率较低。所以,可以初始化一个长度刚刚好的,以节省不断创建数组和延长的动作

二、StringBuffer和StringBuilder的异同

1、相同:都是可变字符序列 ...

2、不同:

StringBuffer:线程同步/线程安全,通常用于多线程

StringBuilder:线程不同步,通常用于单线程,提高效率

3、通常应优先使用StringBuilder,因为它支持所有相同的操作,但由于它不执行同步,不需要判断锁,所以速度更快(StringBuilder的出现是专门用来解决单线程使用StringBuffer效率低的问题)

4、单线程使用StringBuilder,多线程使用StringBuffer

5、jdk升级的三个原因:

(1)简化书写(通常都有局限性)

(2)提高效率(有局限性)

(3)增加安全性(带来书写的麻烦)

三、字符串拼接方式的效率比较

1、效率从高到低:append() > concat() > "+"

2、分析

(1)"+":编译器对"+"进行了优化,使用StringBuilder的append()方法进行处理(StringBuilder的速度比StringBuffer更快),但编译器使用append()方法追加后要用toString()转换成String字符串(每append()一次,就要用toString()转换一次),速度很慢

         eg:每次 str += "a"; ==> str = new StringBuilder(str).append("b").toString();

(2)concat():数字拷贝,返回一个新的字符串 new String(0, count_otherLen, buf);

(3)append():字符数组加长、拷贝,返回本身(没有产生新的字符串对象)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值