参考:http://swiftlet.net/archives/1694

http://www.cnblogs.com/springcsc/archive/2009/12/03/1616326.html

String  字符串(character strings),不是线程安全的

StringBuilder  非线程安全的字符串序列(A mutable sequence of characters)

StringBuffer  线程安全的字符串序列(A thread-safe, mutable sequence of characters)

1、初始化方式

  String    

String str="abc";
String str1=new String("abc");

  这两种初始化的方式的差别是:后者产生了两个对象,内存浪费。

  StringBuffer

StringBuffer sb1=new StringBuffer("abc");
StringBuffer sbf1=new StringBuffer();
sbf1.append("abc");

  从源码上没看出来这两种的明显差异。有老司机明白的可以指点一二。

  StringBuilder

  和StringBuffer的初始化方式是一样的。

2、性能比较

  测试代码  

package cn.simple.src_study;

public class StringStudy {
public static void main(String[] args) {
long strStart = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { String str = "abc";
}
long strEnd = System.currentTimeMillis();
System.out.println("str=\"abc\"; 执行10000次耗时:" + (strEnd - strStart)); long strStart1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { String str1 = new String("abc");
}
long strEnd1 = System.currentTimeMillis();
System.out.println("str=new String(\"abc\"); 执行10000次耗时:" + (strEnd1 - strStart1)); long sbfStart = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { StringBuffer sbf = new StringBuffer("abc");
}
long sbfEnd = System.currentTimeMillis();
System.out.println("sbf=new StringBuffer(\"abc\"); 执行10000次耗时:" + (sbfEnd - sbfStart)); long sbfStart1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuffer sbf1 = new StringBuffer();
sbf1.append("abc");
}
long sbfEnd1 = System.currentTimeMillis();
System.out.println("sbf.append(\"abc\"); 执行10000次耗时:" + (sbfEnd1 - sbfStart1)); long sbdStart = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuilder sbd = new StringBuilder("abc");
}
long sbdEnd = System.currentTimeMillis();
System.out.println("sbd=new StringBuilder(\"abc\"); 执行10000次耗时:" + (sbdEnd - sbdStart)); long sbdStart1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuilder sbd = new StringBuilder();
sbd.append("abc");
}
long sbdEnd1 = System.currentTimeMillis();
System.out.println("sbd.append(\"abc\"); 执行10000次耗时:" + (sbdEnd1 - sbdStart1)); }
}

  结果截图

  从测试结果可以看出:如果值是固定的直接赋值给字符串,效率最高。

  如果字符串存在拼接过程呢?

  测试代码:

package cn.simple.src_study;

public class StringStudy2 {
public static void main(String[] args) {
long strStart = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { String str = "abc";
str+="def";
}
long strEnd = System.currentTimeMillis();
System.out.println("str=\"abc\"; 执行10000次耗时:" + (strEnd - strStart)); long strStart1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { String str1 = new String("abc");
str1+="edf";
}
long strEnd1 = System.currentTimeMillis();
System.out.println("str=new String(\"abc\"); 执行10000次耗时:" + (strEnd1 - strStart1)); long sbfStart = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { StringBuffer sbf = new StringBuffer("abc");
sbf.append("edf");
}
long sbfEnd = System.currentTimeMillis();
System.out.println("sbf=new StringBuffer(\"abc\"); 执行10000次耗时:" + (sbfEnd - sbfStart)); long sbfStart1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuffer sbf1 = new StringBuffer();
sbf1.append("abc");
sbf1.append("edf");
}
long sbfEnd1 = System.currentTimeMillis();
System.out.println("sbf.append(\"abc\"); 执行10000次耗时:" + (sbfEnd1 - sbfStart1)); long sbdStart = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuilder sbd = new StringBuilder("abc");
sbd.append("edf");
}
long sbdEnd = System.currentTimeMillis();
System.out.println("sbd=new StringBuilder(\"abc\"); 执行10000次耗时:" + (sbdEnd - sbdStart)); long sbdStart1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
StringBuilder sbd = new StringBuilder();
sbd.append("abc");
sbd.append("edf");
}
long sbdEnd1 = System.currentTimeMillis();
System.out.println("sbd.append(\"abc\"); 执行10000次耗时:" + (sbdEnd1 - sbdStart1)); }
}

  测试结果:

  从测试结果可以看出:存在字符串拼接的情况下性能StringBuilder>StringBuffer>String

String、StringBuilder、StringBuffer对比的更多相关文章

  1. String StringBuilder StringBuffer 对比 总结得非常好

    转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...

  2. (转)String StringBuilder StringBuffer 对比 总结得非常好

    来源:http://blog.csdn.net/clam_clam/article/details/6831345 转自:http://www.iteye.com/topic/522167 作者:每次 ...

  3. java中String StringBuilder StringBuffer比较和效率(性能)测试

    string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...

  4. 深入源码剖析String,StringBuilder,StringBuffer

    [String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...

  5. String, StringBuilder, StringBuffer问题

    1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...

  6. String StringBuilder StringBuffer区别

    String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...

  7. difference among String,StringBuilder,StringBuffer

    difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ...

  8. JDK源码分析系列---String,StringBuilder,StringBuffer

    JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...

  9. string,stringbuilder,stringbuffer用法

    总结:1.如果要操作少量的数据用 = String   ==================================>字符串常量2.单线程操作字符串缓冲区 下操作大量数据 = Strin ...

  10. java中string stringbuilder stringbuffer 的区别

    1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...

随机推荐

  1. 初识C#设计模式

    利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护.各种面向对象的程序设计语言都提供了基本相同的机制:比如类.继承.派生.多态等等.但是又有各自的特色,C# 中的反射机制便是一个很重要的工具, ...

  2. hdu 3547 (polya定理 + 小高精)

    DIY CubeTime Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  3. BZOJ 1430 小猴打架(prufer编码)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1430 [题目大意] 一开始森林里面有N只互不相识的小猴子,它们经常打架, 但打架的双方 ...

  4. python 多继承详解

    class A(object): # A must be new-style class def __init__(self): print "enter A" print &qu ...

  5. kong结合consul

    早期版本 ./etcdctl ls / --recursive /name /name1 /name1/wyc /name1/wu /name1/chao /name1/chao/age ------ ...

  6. JDK源码学习笔记——HashMap

    Java集合的学习先理清数据结构: 一.属性 //哈希桶,存放链表. 长度是2的N次方,或者初始化时为0. transient Node<K,V>[] table; //最大容量 2的30 ...

  7. Problem F: 零起点学算法42——多组测试数据输出II

    #include<stdio.h> int main() { ; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { ...

  8. nginx负载均衡upstream参数配置

    一定要注意两台机器能够telnet 访问通过  如果不能通过则两台机器都执行一下 iptables -F 机器A: php-fpm配置[www]user = wwwgroup = wwwlisten ...

  9. Educational Codeforces Round 8 A. Tennis Tournament 暴力

    A. Tennis Tournament 题目连接: http://www.codeforces.com/contest/628/problem/A Description A tennis tour ...

  10. mysql错误 Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES)

    mysql -u root -p Aaa111222333 grant all privileges on *.* to root@'%' identified by 'aaa111222333; Q ...