StringBuffer介绍
StringBuffer是一个字符的缓冲区,是一个线程安全的可变的字符序列,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer。
StringBuffer的关系图如下:
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源码示例
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睿哥
mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》