StringBuffer类与StringBuilder类

String类的特点是一旦被赋值就不能被改变,当对字符串做拼接操作时,每次都会new一个新的String对象,这样做既耗时,有浪费内存空间,所以java就提供了另外两种对字符串的处理类,就是StringBuffer类和StringBuilder类。StringBuffer和StringBuilder非常类似,包括构造函数和成员方法,仅仅不同的是StringBuffer是线程安全的,同步的但是效率低,StringBuilder是线程不安全的,不同步,但是效率高。在使用时可以根据对安全的需求高低来选择使用StringBuffer还是使用StringBuilder.

String类和StringBuffer类的区别:
String类在字符串常量池中开辟空间,这块空间一旦被赋值就不能再改变。
StringBuffer类是可变的字符序列,它是在字符串缓冲区开辟空间。

StringBuffer类的构造函数:

//构造一个初始容量默认为16个字符的,不带字符的字符串缓冲区
    StringBuffer strb = new StringBuffer();
//构造一个带初始内容的字符串缓冲区,初始内空可以是一下类型:String,StringBuffer,
//StringBuilfer
    StringBuffer strb = new StringBuffer(String | StringBuffer| StringBuilfer);
//构造一个指定容量的字符串缓冲区
    StringBuffer strb = new StringBuffer(int 容量);
//构造一个初始容量为指定字符串的字符串缓冲区
    StringBuffer strb = new StringBuffer(String str);

StringBuffer类的成员方法:
添加功能:

//append()方法的参数类型为:boolean,char,char[],double,float,int,
//long,Object,String,StringBuffer
public *StringBuffer* append(String str);这里就用添加String类型举例
//insert在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offser,string str)

代码演示:
这里写图片描述
这里写图片描述

删除功能:

///删除指定位置的字符,并返回本身
public StringBuffer deleteCharAt(int index)
//删除从指定位置开始到指定位置结束的内容,并返回本身
public StringBuffer delete(int start,int end)

代码演示:
这里写图片描述

替换功能:

//从Start开始到end用Str替换
public StringBuffer replace(int start,int end,String srt)

这里写图片描述

翻转功能:

//把字符串翻转
public StringBuffer reverse()

这里写图片描述

截取功能:

//从Start开始截取,一直到末尾,返回值类型是String
public String substring(int start)
//从Start开始一直截取到end位置,但不含end位置,返回值类型是String
public String substring(int start,int end)

这里写图片描述

String与StringBuffer之间的相互转换:
这里写图片描述

String,StringBuffer,StringBuilder的区别?
String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的
StringBuffer是同步的,数据安全,但效率低
StringBuilder是不同步的,数据不安全,但效率高

StringBuffer和数组的区别?
二者都可以看作是一个容器,装其他的数据,但是,StringBuffer的数据是字符串数据,而数组可以放置多种数据,但必须是同一类型的数据。

String和StringBuffer分别作为参数传递

形式参数:
        基本类型:形式参数的改变不影响实际参数
        引用类型:形式参数的改变直接影响实际参数

这里写图片描述
上面代码有个问题,参数为String的change方法执行完,在main中打印s1,s2的值竟然没有改变。而参数为StringBuffer的change方法执行完,打印的结果完全符合预期。
下面分析一下:
Sting类的值有个特点就是一旦被赋值就不能被改变。main中定义s1,s2时,就在字符串常量池中开辟了两个块内存空间,分别存入hello和world。调用参数为String的change方法时,change方法中也定义了两个参数,分别是s1,s2.这也相当于change方法也在字符串常量池中开辟了两块空间,当main方法中调用change时,把main方法中的s1,s2传递给了change,在字符串常量池中,就是把main方法中的s1,s2的hello,world复制一份给了change方法中的s1,s2,双方仅仅是值传递。所以无论change中s1,s2的值如果改变,跟main方法中的s1,s2一点关系都没有。总结,当String作为参数传递时,效果和基本类型一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值