参考: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. 【后缀自动机】hdu6194 string string string

    题意:给你一个字符串和一个正整数K,让你输出恰好出现K次的子串的数量. 对后缀链接树进行dp预处理后,SAM每个点的endpos大小就是该点结尾的子串出现的次数,maxlen-minlen+1就是子串 ...

  2. bzoj 3900: 交换茸角

    3900: 交换茸角 Description 动物园里有 n 头麋鹿.每头麋鹿有两支茸角,每支茸角有一个重量.然而,一旦某头麋鹿上 两支茸角的重量之差过大,这头麋鹿就会失去平衡摔倒.为了不然这种悲剧发 ...

  3. 零起点学算法09——继续练习简单的输入和计算(a-b)

    #include<stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf("% ...

  4. insert into table(key)value('value') on duplicate key update key=value

    MYSQL篇 新增如果unique索引字段重复,则更新: insert into mg_user(key,key2,key3)value('value','value2','value3') on d ...

  5. SSL协议的握手过程(摘录)

    SSL协议的握手过程 为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议.SSL 协议既用到了公钥加密技术(非对称加密)又用到了对称加密技术,SSL对传输内容的加密是采用的对 ...

  6. JavaScript 开发的45个技巧

    JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...

  7. linux Socket send与recv函数详解

    转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解   1 #include ...

  8. Lua学习之类型与值

    Lua是一种动态语言,在语言中没有类型定义的语法. 在lua中有8中基本的类型: 1.nil(空) 2.boolean 3.number(数字) 4.string(字符串) 5.userdata(自定 ...

  9. 靠谱助手 http://www.kpzs.com/

    靠谱助手 http://www.kpzs.com/ 靠谱助手是于2013年5月18日推出的一个专为第三方智能安卓引擎提供管理的免费应用程序,是国内最完美的PC端管理软件. 安卓引擎支持微信.陌陌等日常 ...

  10. 虚拟机选择配置:解决tomcat内存溢出

    用于解决java.tomcat内存溢出:-server -XX:PermSize=128M -XX:MaxPermSize=256m