参考: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. [BZOJ4013][HNOI2015]实验比较(树形DP)

    4013: [HNOI2015]实验比较 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 756  Solved: 394[Submit][Status] ...

  2. wannafly挑战赛14

    第一次打wannafly..觉得自己好菜啊... 题目描述 在三维空间中,平面 x = 0, y = 0, z = 0,以及平面 x + y + z = K 围成了一个三棱锥. 整天与整数打交道的小明 ...

  3. [LOJ2553]暴力写挂

    锟题x2 以下用$a\rightarrow b$表示端点为$a,b$的链 把式子写成$(h_1(x)+h_1(y)-h_1(lca))-h_2(lca')$,第一部分就是$x\rightarrow r ...

  4. 小H的硬币游戏

    题目大意: 有n个物品排成一排,每个物品都有自己的价值,你每次可以从中挑选两个距离为k的物品取走,问最大的收益. (如果原来两个物品中间有物品被取走,距离不变) 思路: 贪心. 先按照每个物品的位置m ...

  5. 使用redis时出现java.util.ArrayList cannot be cast to java.lang.Long

    java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long at redis.clients. ...

  6. Ubuntu下查看APT安装的软件安装路径和版本

    1.查询安装路径 dpkg -L 软件名 例如:dpkg -L gedit dpkg -L gedit /. /usr /usr/bin /usr/bin/gedit /usr/share /usr/ ...

  7. iOS中 三种随机数方法详解

    ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(t ...

  8. css实现半颗星评分效果

    效果如下: html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  9. asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS)

    这篇文章介绍如何允许跨域访问 浏览器安全不允许不同域名的网页之间发送请求.这种限制叫做同源策略(the same-origin policy). 同源策略可以防止一个恶意的站点读取另一个站点的敏感数据 ...

  10. Struts2实现登录流程

    本节将演示一个基本的登录流程,在登录界面中若输入正确的用户名和密码,跳转到登录成功界面:否则路转到登录失败界面. 1 建立一个名为LoginDemo的动态Web项目 2 添加struts2相关的jar ...