1. StringBuffer&StringBuilder
在前面已经对String有过一定了解,String是一种定长字符串的表现形式,内部是通过char
数组实现;String优势在于使用时速度较快,但是缺点是内容可改变,一经定义则无法修改,所以String类型对象不适合做大量一些字符串拼接运算。
String s1 = "hello";
String s2 = "world";
Stringt s3 = s1 + s2; //new String("hello"+"world");
对于String存在的问题(长度不可变,拼接效率低),因此JDK中提供了用于实现字符串大量拼接运算的StringBuffer
和StringBuilder
类。
1.1. StringBuffer
StringBuffer
是一个线程安全的可变字符串序列实现(实现了CharSequence
接口),内部提供了一系列方法用于修改,删除字符串中的指定子串,其中以append
,insert
居多:
append
:追加,在已知字符串的末尾追加新的子串insert
:插入,在已知字符串的指定位置插入新的子串
无论如何追加,修改,对象的地址始终不会变化
常用构造器:
StringBuffer()
:创建一个默认为空字符串的StringBuffer对象StringBuffer(String s)
:创建一个以参数为字符串为初始值的StringBuffer对象StringBuffer(CharSequence c)
:创建一个以CharSequence实现类对象为初始值的StringBuffer对象StringBuffer(int initCapacity)
:创建一个指定初始缓冲区的StringBuffer对象
常用方法
append(...)
:向当前字符串对象末尾追加子串(任意数据类型)insert(...)
:向当前字符串的指定位置插入子串(任意数据类型)length()
:当前字符串对象中实际存储的字符个数capacity()
:字符串对象中字符数组的总容量reverse()
:将当前字符串内容反转
String s = "123";
StringBuffer sb = new StringBuffer(s);
//链式编程(链条)
sb.append(10)
.append(true)
.append(3.14)
.append("hello")
.insert(0, "start")
.insert(10,'M');
System.out.println(sb.toString());
//返回数组中实际存储的字符个数
System.out.println(sb.length());
//返回数组的容量
System.out.println(sb.capacity());
//字符串反转
sb.reverse();
System.out.println(sb);
//使用reverse()判断对称数
String a = "67876";
StringBuffer b = new StringBuffer(a);
System.out.println(Objects.equals(a, b.reverse().toString()));
b = new StringBuffer("hello123world");
//删除指定索引区间的子串(前包后不包)
b.delete(5,8);
System.out.println(b);
1.2. StringBuffer与String字符串拼接效率对比
public class Test {
public static void testString(int count, String sub) {
String s = new String("");
for (int i = 0; i < count; i++) {
s += sub;
}
}
public static void testStringBuffer(int count, String sub) {
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < count; i++) {
sb.append(sub);
}
}
public static void main(String[] args) {
//获取开始执行时间(毫秒ms 1000ms=1s)
long start = System.currentTimeMillis();
// testString(100000, "hello"); //35000+ 毫秒
testStringBuffer(100000, "hello"); //10+ 毫秒
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
}
}
通过以上字符串效率拼接对比,可以发现
StringBuffer
在进行字符串拼接运算时,效率要远高于String
1.3. StringBuilder
StringBuilder
是JDK1.5之后新增的一个可变长字符序列的实现(实现了CharSequence
),并且具备了与StringBuffer
一模一样的API;唯一区别在于StringBuilder
是一个线程不安全的实现。
1.4. String,StringBuffer,StringBuilder总结
String
是一个定长字符串,初始值即最终值,如果对其修改是在修改地址,如果只是使用String临时存储数据效率较高,但是在进行大量字符串拼接时候会频繁的创建新对象,从而会消耗大量时间,影响程序的性能。StringBuffer
是一个线程安全可变字符串,内部的方法都是用synchronized
修饰,表示当前方法在多线程环境下同一时间只允许一条线程单独访问(其他线程阻塞),对数据的一致性安全性有一定保障,但是效率相对较低StringBuilder
是一个线程不安全的可变字符串,具备和StringBuffer
相同的API,由于该类的方法没有加锁,在多线程环境下允许多个线程同时访问,因此效率较高,但是会存在并发安全问题(最终结果不确定),JDK1.5新增