StringBuffer详解(8大常用方法与示例)

StringBuffer详解(8大常用方法与示例)-mikechen

StringBuffer介绍

StringBuffer是一个字符的缓冲区,是一个线程安全的可变的字符序列,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer。

StringBuffer的关系图如下:

StringBuffer详解(8大常用方法与示例)-mikechen

StringBuffer它继承于AbstractStringBuilder,实现了CharSequence接口。

StringBuilder 也是继承于AbstractStringBuilder的子类,但是StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的。

 

StringBuffer常用方法

StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

1.append方法

public StringBuffer append(boolean b)

该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接,该方法以后,StringBuffer对象的内容也发生改变,例如:

StringBuffer buffer = new StringBuffer("hello,");    // 创建一个 StringBuffer 对象
String str = "World!";
buffer.append(str);    // 向 StringBuffer 对象追加 str 字符串
System.out.println(buffer);    // 输出:Hello,World!

 

2.insert方法

public StringBuffer insert(int offset, boolean b)

该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串,insert(int offset,String str),在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身。

 

3.deleteCharAt(int index)方法

public StringBuffer deleteCharAt(int index)

该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串,例如:

StringBuffer sb = new StringBuffer(“Test”);

sb. deleteCharAt(1);

该代码的作用删除字符串对象sb中索引值为1的字符,所以对象sb的值变为”Tst”。

 

4.delete(int start,int end)方法

public StringBuffer delete(int start,int end)

删除从指定位置开始,并从指定位置结束字符,并返回本身,例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb. delete (1,4);

该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串,则对象sb的值是”TString”。

注意:包左不包右。

 

5.replace (int start,int end,String str) 方法

StringBuffer的替换功能:从start到end用 str 替换

 

6.字符串反转reverse()

StringBuffer 类中的 reverse() 方法用于将字符串序列用其反转的形式取代,该方法的语法格式如下:

stringBuffer.reverse();

reverse() 示例如下:

StringBuffer sb = new StringBuffer("java");
sb.reverse();
System.out.println(sb);    // 输出:avaj

 

7.替换字符串setCharAt()

public void setCharAt(int index, char ch)

 

StringBuffer 类的 setCharAt() 方法用于在字符串的指定索引位置替换一个字符,代码示例如下:

StringBuffer sb = new StringBuffer("hello");
sb.setCharAt(1,'E');
System.out.println(sb);    // 输出:hEllo
sb.setCharAt(0,'H');
System.out.println(sb);    // 输出:HEllo
sb.setCharAt(2,'p');
System.out.println(sb);    // 输出:HEplo

 

8.trimToSize()方法

public void trimToSize()

该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

StringBuffer常用方法总结如下:

StringBuffer详解(8大常用方法与示例)-mikechen

 

StringBuffer源码示例

package com.Lesson;

// 定义一个字符串缓冲区类
public class JavaAPI_StringBuffer {
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer();

        // 增加 插入 删除 替换

        // append 在末尾附加.添加
        stringBuffer.append("张三");
        stringBuffer.append(true);
        stringBuffer.append(20);
        stringBuffer.append(13.5);
        System.out.println(stringBuffer.toString());
        // 张三true2013.5
        // stringBuffer是有序的
        // 转换成字符串类型的值

        // insert
        stringBuffer.insert(6, "李四");
        System.out.println(stringBuffer.toString());
        // 张三true李四2013.5
        // 插入'男'
        stringBuffer.insert(8, '男');
        System.out.println(stringBuffer.toString());
        // 张三true李四男2013.5

        // 删除
        // delete(int start,int end)
        // 从start到end,不包含end [start,end)
        // 注意索引越界问题
        StringBuffer delete = stringBuffer.delete(6, 8);//6,7元素
        System.out.println("删除之后的剩余的值:"+delete.toString());
        // 删除的元素:张三true男2013.5
        System.out.println(stringBuffer.toString());
        // 张三true男2013.5

        // 替换
        // replace (int start,int end ,String str);
        // 使用给定的String中的字符替换此序列中的子字符串中的字符
        // 先删除delete(),在插入insert()
        StringBuffer replace = stringBuffer.replace(2, 6, "女性");
        System.out.println(stringBuffer.toString());
        // 张三女性男2013.5
        System.out.println("replace的值:"+replace.toString());
        // replace的值:张三女性男2013.5
        // 返回的还是替换之后的值

        // toString() 打印对象时,JVM会自动调用toString()方法

    }
}

 

StringBuffer与String、StringBuilder的区别

1、StringBuffer和StringBuilder的唯一区别

StringBuffer对象是线程安全的,这意味着StringBuffer对象可以同时被多个并行线程修改,因为它所有的方法都被声明为”synchronized(同步)”。
StringBuilder类是JDK 1.5版引入的非线程安全的类,这意味着它的所有方法都是非同步方法。
因此,在单一模型的应用中,我们应该使用StringBuilder,这样对象不会有锁定和解锁,这样性能就会增加。
而在单线程模型应用中,会按顺序执行操作,因此对象不会崩溃。

2、什么时候选择String和StringBuffer

如果我们不需要在同一内存空间中存储字符串的修改,那么我们必须使用String。
而如果需要在同一内存空间中存储字符串的修改,那么我们必须使用StringBuffer或StringBuilder。

3、String的优缺点

优点:使用String时,如果字符串发生修改,那么修改后的内容会保存在内存中的不同位置,这样的话,内存中就同时有原始的字符串值和修改后的字符串值。
缺点:对于每一个这样的操作,它会消耗更多的内存,因为它把修改后的字符串值存储在新的内存空间中。因此它会导致性能问题。
解决方案:要解决这个性能问题,开发者应该使用StringBuilder或者StringBuffer来实现字符串的修改,然后再转换成String对象把字符串传递给用户。

4、StringBuffer和StringBuilder的优缺点

优点:StringBuffer和StringBuilder有更好的性能,因为它们对内存的消耗更少,所有对字符串的修改操作都存储在同一内存位置。
缺点:修改前的原始字符串值不会被保留。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法