您的当前位置:首页正文

StringBuilder 和 StringBuffer

2024-11-29 来源:个人技术集锦

StringBuilder 和 StringBuffer

一、可变类字符串

  • 由于 String 类描述的字符串内容是个常量不可改变,当需要在 Java 代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。
  • 为了解决上述问题,可以使用 java.lang.StringBuilder 类和 java.lang.StringBuffer 类来描述字符序列可以改变的字符串,如:“ab”。
  • StringBuffer 类是从 jdk1.0 开始存在,属于线程安全的类,做线程同步检查,故效率比较低
  • StringBuilder 类是从 jdk1.5 开始存在,属于非线程安全的类,不做线程同步检查,效率比较高

二、StringBuilder 类常用的构造方法

​ 由于 StringBuilder 类和 StringBuffer 类的方法基本都是一样的,故以 StringBuilder 类为例进行总结,实际开发中,StringBuilder 类的用处比 StringBuffer 类要多。

方法声明功能介绍
StringBuilder()使用无参方式构造对象,容量为16
StringBuilder(int capacity)根据参数指定的容量来构造对象,容量为参数指定大小
StringBuilder(String str)根据参数指定的字符串来构造对象,容量为:16+字符串长度

三、StringBuilder 常用方法

1、length()
StringBuilder s1 = new StringBuilder("Hello World");
System.out.println(s1.length());//11
2、capacity()

capacity() 方法:返回调用对象的容量,返回值为 int 类型

StringBuilder s1 = new StringBuilder();
System.out.println(s1.capacity());// 16	默认是容量是16
StringBuilder s2 = new StringBuilder(20);
System.out.println(s2.capacity());// 20
StringBuilder s3 = new StringBuilder("Hello World");
System.out.println(s3.capacity());// 11 + 16 = 27
3、append(String str)

append(String str) 方法:将指定的字符串追加到此字符序列,返回值为 StringBuilder 类型

当字符串的长度超过了字符串对象的初始容量时,该字符串对象会自动扩容,默认扩容算法是:原始容量*2 + 2,如果扩容后还不够,则将字符串的长度设置为容量值。底层采用byte数组来存放所有的字符内容。

//默认扩容方法可行时
StringBuilder s1 = new StringBuilder("Hello World");
System.out.println(s1.length());// 11
System.out.println(s1.capacity());// 11 + 16 = 27
s1.append("Give you some color to see see"); //长度为30
System.out.println(s1.length());// 41
System.out.println(s1.capacity());// 27 * 2 + 2 = 56
//添加的字符串过长时
StringBuilder s2 = new StringBuilder("Hello World");
s2.append("Give you some color to see see Give you some color to see see"); //长度为61
System.out.println(s2.length());// 72
System.out.println(s2.capacity());// 27 * 2 + 2 = 56 < 72   72
4、insert(int offset, String str)

insert(int offset, String str) 方法:在指定位置插入字符串,返回值为 StringBuilder 类型,参数插入位置 offset 为 int 类型,字符串 str 为 String 类型。开发中常用 append() 方法来添加字符串

StringBuilder s1 = new StringBuilder("hello");
//字符串前面插入“abc”
s1.insert(0, "abc");
//字符串后面插入“xyz”
s1.insert(s1.length(), "xyz");
System.out.println(s1.length());// 11
System.out.println(s1);// abchelloxyz
s1.insert(5, "o");
System.out.println(s1);// abcheolloxyz
5、delete(int start,int end)

delete(int start,int end) 方法:删除指定位置的字符串,返回值为 StringBuilder 类型,参数 start 和 end均为 int 类型,包括 start,不包括 end

StringBuilder s1 = new StringBuilder("Hello WorldGive you some color to see see");
s1.delete(0, 7);
System.out.println(s1);// orldGive you some color to see see
s1.delete(10, s1.length());
System.out.println(s1);// orldGive y
6、deleteCharAt(int index)

deleteCharAt(int index) 方法:将当前字符串中下标为index位置的单个字符删除,返回值为 StringBuilder 类型,参数为 int 类型

StringBuilder s1 = new StringBuilder("Hello WorldGive you some color to see see");
s1.deleteCharAt(0);
System.out.println(s1);// ello WorldGive you some color to see see
7、replace(int start,int end,String str)

replace(int start,int end,String str) 方法:替换字符串,返回值为 StringBuilder 类型,参数 start 和 end均为 int 类型,包括 start,不包括 end,参数 str 为 String 类型

StringBuilder s1 = new StringBuilder("Hello World");
s1.replace(0, 5, "hi");
System.out.println(s1);// hi World
8、reverse()

reverse() 方法:字符串反转,返回值为 StringBuilder 类型

StringBuilder s1 = new StringBuilder("Hello World");
s1.reverse();
System.out.println(s1);// dlroW olleH

四、返回值的设计

  • StringBuilder 的很多方法的返回值均为 StringBuilder 类型。这些方法的返回语句均为:return this。
  • 由此可见,这些方法在对 StringBuilder 所封装的字符序列进行改变后又返回了该对象的引用。基于这样设计的目的在于可以连续调用

五、String、StringBuffer、StringBuilder 三者效率问题

三者的效率由低到高排序为:

String < StringBuffer < StringBuilder

总结如下:

  • 如果要操作少量的数据用 String
  • 多线程操作字符串缓冲区下操作大量数据用 StringBuffer
  • 单线程操作字符串缓冲区下操作大量数据用 StringBuilder
显示全文