String,StringBuffer,StringBuilder的区别
来源:互联网 发布:小学网络安全教育题目 编辑:程序博客网 时间:2024/05/21 17:00
先说结论 再简单分析:
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
String:字符串常量
StringBuffer:字符串变量 线程安全
StringBuilder:字符串变量 无线程安全
使用情况:
1.如果要操作少量的数据用 :String
2.单线程操作字符串缓冲区 下操作大量数据 :StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 :StringBuffer
执行速度不一的原因:1 String s = "abc";
2 s = s+1;
3 System.out.print(s);// result : abc1
String是字符串常量, 每次更改其值时, JVM是这样解析这段代码的:首先创建对象s,赋予一个abc,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
这让我们很容易想到另外一个很相似的概念:HashTable和HashMap,对,就是支持线程同步保证线程安全而导致性能下降的问题。HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也在于此,新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。
简单的测试代码:
public class StringBuilderTester {
private static final String base = " base string. ";
private static final int count = 2000000;
public static void stringTest() {
long begin, end;
begin = System.currentTimeMillis();
String test = new String(base);
for (int i = 0; i < count/100; i++) {
test = test + " add ";
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used String. ");
}
public static void stringBufferTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuffer test = new StringBuffer(base);
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used StringBuffer. ");
}
public static void stringBuilderTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuilder test = new StringBuilder(base);
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used StringBuilder. ");
}
- String,StringBuffer,StringBuilder的区别
- String StringBuffer StringBuilder的区别
- String, StringBuffer, StringBuilder的区别?
- String,StringBuffer, StringBuilder 的区别
- String,StringBuffer,StringBuilder的区别
- String , StringBuffer, StringBuilder的区别
- String 、 StringBuffer 、StringBuilder 的区别
- String StringBuffer StringBuilder的区别
- String、StringBuffer、StringBuilder的区别
- String, StringBuffer, StringBuilder的区别
- String StringBuffer StringBuilder的区别
- string、stringbuffer、stringbuilder的区别
- String、StringBuffer 、StringBuilder 的区别
- String,StringBuffer,StringBuilder的区别
- String ,StringBuffer,StringBuilder的区别
- String,StringBuffer,StringBuilder的区别
- String StringBuffer StringBuilder的区别
- String,StringBuffer,StringBuilder的区别?
- Android检查应用版本
- guava部分使用API
- C/C++判断文件文件夹是否存在
- QML_import声明
- Android 编译环境安装
- String,StringBuffer,StringBuilder的区别
- cocoStudio:ScrollView控件使用记录
- java异常处理
- Android初学笔记之<Handler理解>
- Servlet的编码问题
- STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)
- MySQL创建全文索引
- C语言的字符串查找函数
- 修改jar包中的内容并把新内容打到jar包中