区别部分介绍:
介绍:
String 是java中的字符串,用来创建和操作字符串。
StringBuffer和StringBuilder,对字符串进行修改时会用到。
相同点:
三者都是final类,不能再被继承。
最主要的区别:
主要在 运行效率 和 线程安全 这两方面。
运行效率来说:
StringBuilder > StringBuffer > String?
主要原因是:
? ? ? ? String是不可变类,即字符串常量,每次对String对象的修改都是创建新对象,所以其是最慢的;StringBuffer和StringBuilder则是可变类,即字符串变量,他们的对象在进行修改时不会产生新的对象。
那为什么StringBuilder会比StringBuffer快呢?看下面的线程安全。
线程安全来说:
StringBuffer是线程安全的,支持并发操作,很多方法都含有 synchronized 关键字;相反StringBuilder并未含有该关键字,并不支持多线程,保证不了线程安全。
回答上面的运行效率原因,因为StringBuffer支持多线程操作,所以相对单线程的StringBuilder来说会慢一些,所以在单线程情况下推荐使用StringBuilder。
演示案例:
定义三个对象,都是abc,同时加100000次de,看一下运行时间。
public static void main(String[] args) {
//String
String str = "abc";
long startTime = System.currentTimeMillis();
for(int i = 0; i<100000;i++){
str += "de";
}
long endTime = System.currentTimeMillis();
System.out.println("String的耗时为"+ (endTime - startTime));
//StringBuffer
StringBuffer stringBuffer = new StringBuffer("abc");
startTime = System.currentTimeMillis();
for (int i = 0; i<100000; i++){
stringBuffer.append("de");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的耗时为"+ (endTime - startTime));
//StringBuilder
StringBuilder stringBuilder = new StringBuilder("abc");
startTime = System.currentTimeMillis();
for (int i = 0; i<100000; i++){
stringBuilder.append("de");
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的耗时为"+ (endTime - startTime));
}
String的耗时为20225 StringBuffer的耗时为5 StringBuilder的耗时为2
?最终结果是如此,由此可见,其耗时之间的差距。
总结:
? ? ? ? 1. 少量字符时可以用String类,但是在大量字符需要进行修改时,建议使用StringBuffer或StringBuilder;
????????2. 在使用多线程的时候,建议使用StringBuffer,它支持多线程;
? ? ? ? 3. 在单线程情况下,建议是用StringBuilder
常用方法介绍:
在使用StringBuffer时其内是有很多方法的,在此进行常用的几个的介绍。
StringBuffer stringBuffer = new StringBuffer("abc");
1. append 方法
功能:进行字符串连接,将制定字符拼接到最后
写法:stringBuffer.append("de");
效果:字符串变为 "abcde"
2. insert 方法
功能:在指定对象字符串中插入指定内容
写法:stringBuffer.insert(1,"de");
效果:字符串变为 "adebc"
3. delete 方法
功能:删除从开始位置到结束位置的内容(包括开头,不包括结尾)
写法:stringBuffer.delete(0,2);
效果:字符串变为 "c"
4. deleteCharAt 方法
功能:删除指定位置的字符
写法:stringBuffer.insert(1);
效果:字符串变为 "ac"
5. reverse 方法
功能:将字符串内容进行反转
写法:stringBuffer.reverse();
效果:字符串变为 "cba"
6. subString 方法
功能:将选定位置区间内字符串截取返回一个新字符串(包括开头,不包括结尾,只提供一个默认为开始到结束)
写法:stringBuffer.subString(1); ||??stringBuffer.subString(1,2);
效果:返回字符串?"bc"? || "b"
7. charAt?方法
功能:将字符串指定位置的字符返回出来(注意是返回的字符类型)
写法:stringBuffer.charAt(1);
效果:返回 'b'
8. setCharAt?方法
功能:将指定位置设置成指定字符
写法:stringBuffer.setCharAt(1,'d');
效果:字符串变为 "adc"
9. indexOf?方法 (相反的方法 lastIndexOf )
功能:返回指定字符串出现的第一次下标位置
写法:stringBuffer.indexOf("b");
效果:返回 1
10. replace 方法
功能:将指定区间内字符串替换为指定字符串(包含开头,不包含结尾)
写法:stringBuffer.replace(0,1,"de");
效果:字符串变为 "debc"
11. length?方法
功能:返回字符串长度
写法:stringBuffer.length();
效果:返回 3
综上11个方法是个人用的比较多的一些方法,一般情况下足够满足很多操作了已经,省去很多麻烦的中间过程可以。
|