1.区别:
- String是不可变类,也就是说,String对象一旦被创建,其值将不能被修改;而其余两个可变。
- StringBuffer在JDK1.0产生,同步处理,线程安全,效率较低
- StringBuilder在JDK1.5产生,异步处理,线程不安全,效率较高,当在String中使用“+”来进行字符串连接,编译时会将String类变为StringBuffer类进行apperd( )处理。示例如下:
public class append_Test {
public static void main(String[] args) {
String s = "Hello";
s+=" World";
s+="!";
System.out.println(s);//Hello World!
}
}
以上代码等价于:
//可以作为字符串的拼接方法来使用
public class StringBuffer_Test {
public static void main(String[] args) {
String s = "Hello";
StringBuffer sb = new StringBuffer(s);
sb.append(" World").append("!");
System.out.println(sb);//Hello World!
}
}
2.String与StringBuffer的互相转换
- String–>StringBuffer:利用StringBuffer的构造方法或append( )方法
- StringBuffer–>String:调用StringBuffer的toString( )方法
3.StringBuffer的常用操作
3.1 增
@Test
public void test5(){
StringBuffer buffer = new StringBuffer("abc");
System.out.println(buffer.append("hello"));//abchello
}
3.2 删
@Test
public void test6(){
StringBuffer buffer = new StringBuffer("hello");
System.out.println(buffer.delete(1, 3));//hlo
}
3.3 改
@Test
public void test7(){
StringBuffer buffer = new StringBuffer("hello");
buffer.replace(2,4,"cd");
System.out.println(buffer);//hecdo
}
3.4 查
@Test
public void test8(){
StringBuffer buffer = new StringBuffer("hello");
System.out.println(buffer.charAt(3));//l
}
3.5 插入
@Test
public void test9(){
StringBuffer buffer = new StringBuffer("hello");
System.out.println(buffer.insert(1, "abc"));//habcello
}
3.6 长度
@Test
public void test10(){
StringBuffer buffer = new StringBuffer("hello");
System.out.println(buffer.length());//5
}
4.源码分析【重要】
package String类的使用;
import org.junit.Test;
/**
* @BelongsProject: untitled
* @BelongsPackage: String类的使用
* @Author: mcc
* @CreateTime: 2020-10-24 08:24
* @Description:源码分析
*/
public class StringBufferBuilderTest {
@Test
public void test1() {
String str = new String();//char[] value = new char[0];
String str1 = new String("abc");//char[] value = new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度是16的数组
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length()+16]
//问题1:
System.out.println(sb2.length());//3,关注不是初始化了多少,而是实际有多少
//问题2:如果添加的数据底层数组盛不下,该怎么扩容底层的数组
//默认情况下扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中
//指导意义:开发中建议使用StringBuffer(int capacity)或StringBuilder(int capacity),避免后续扩容,影响效率
}
}
5.使用场合
在执行效率方面,StringBuilder最高,StringBuffer次之,String最低,鉴于这一情况,一般而言,如果要操作的数据量比较小,应优先使用String类;如果是在单线程下操作大量数据,应优先使用StringBuilder类;如果是在多线程下操作大量数据,应优先考虑StringBuffer类。
6.效率对比
@Test
public void test4() {
//初始设置
long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
//开始对比
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
}