「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
String、StringBuffer、StringBuilder三者的异同?
-
不同点:
- String:不可变的字符序列(final),是线程安全的。
- StringBuffer:可变的字符序列;线程安全,效率低。
- StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全效率高。
-
相同点:
- 底层都是使用char[]数组存储
字符串String、StringBuffer、StringBuilder分析
源码分析:
String str = new String();//char[] value = new char[];
String str1 = new string("abc" ); // char[] value = new char[]{ 'a ' , ' b' , 'c'};
StringBuffer sb1 = new StringBuffer(); //char[] value = new char[16];底层创建了一个长度为16的动态数组用于存放字符。
System.out.printLn(sb1.Length());
sb1.append( 'a'); //value[e] = 'a';sb1. append( ' b');//value[1] = 'b ';
StringBuffer sb2 = new StringBuffer("abc") ; //char[] value = new char["abc".Length() +2]
//问题1.System.out.println(sb2.Length());7/ 3
//问题2.扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中
建议:开发中建议大家使用StringBuffer(int capacity)或 stringBuilder(int capacity)
StringBuffer/StringBuilder的常用方法?
- StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
- StringBuffer delete(int start,int end):删除指定从start开始位置到end结束的内容
- StringBuffer replace(int start, int end,String str):把从start(包含start)开始位置到end结束的内容替换为str
- StringBuffer insert(int offset, xxx):在指定位置(offset位置)插入xxx
- StringBuffer reverse():把当前字符序列逆转
- public int indexof(String str)
- public string substring(int start,int end):截取左闭右开区间的子字符串
- public int length():显示字符串长度
- public char charAt(int n ):查询该字符串中第 n 个字符是什么?
- public void setcharAt(int n ,char ch):把字符串中的第 n 个位置的字符替换为 h 总结:
- 增:append(xxx)
- 删:delete(int start,int end)
- 改:setcharAt(int n ,char ch) / replace(int start, int end,String str)
- 查:charAt(int n )
- 插入:insert(int offset, xxx)
- 长度:length()
- 遍历:for()+charAt()
对比StringBulider、StringBuffer、String的效率问题?
@Test
public void test2(){
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++) {
text+=i;
}
endTime=System.currentTimeMillis();
System.out.println("String消耗时间为:"+(endTime-startTime));
startTime=System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
Buffer.append(String.valueOf(i));
}
endTime=System.currentTimeMillis();
System.out.println("Buffer消耗时间为:"+(endTime-startTime));
startTime=System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
Builder.append(String.valueOf(i));
}
endTime=System.currentTimeMillis();
System.out.println("Bulider消耗时间为:"+(endTime-startTime));
}
运行时间结果:
时间从高到低对比:StringBulider > StringBuffer > String
String消耗时间为:1061
Buffer消耗时间为:3
Bulider消耗时间为:2