String、StringBuilder、StringBuffer对比
参考: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对比的更多相关文章
- String StringBuilder StringBuffer 对比 总结得非常好
		转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ... 
- (转)String StringBuilder StringBuffer 对比 总结得非常好
		来源:http://blog.csdn.net/clam_clam/article/details/6831345 转自:http://www.iteye.com/topic/522167 作者:每次 ... 
- java中String StringBuilder StringBuffer比较和效率(性能)测试
		string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ... 
- 深入源码剖析String,StringBuilder,StringBuffer
		[String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ... 
- String, StringBuilder, StringBuffer问题
		1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ... 
- String  StringBuilder  StringBuffer区别
		String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ... 
- difference among String,StringBuilder,StringBuffer
		difference among String,StringBuilder,StringBuffer String常用构造函数 String(byte[] bytes) String(byte[] b ... 
- JDK源码分析系列---String,StringBuilder,StringBuffer
		JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ... 
- string,stringbuilder,stringbuffer用法
		总结:1.如果要操作少量的数据用 = String ==================================>字符串常量2.单线程操作字符串缓冲区 下操作大量数据 = Strin ... 
- java中string stringbuilder stringbuffer 的区别
		1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ... 
随机推荐
- bzoj3012(Trie)
			bzoj3012 题解 3012: [Usaco2012 Dec]First! Desdescription Bessie has been playing with strings again. S ... 
- POJ 2404 Jogging Trails(最小权完美匹配)
			[题目链接] http://poj.org/problem?id=2404 [题目大意] 给出一张图,求走遍所有的路径至少一次,并且回到出发点所需要走的最短路程 [题解] 如果图中所有点为偶点,那么一 ... 
- Android Studio导入第三方库的三种方法
			叨叨在前 今天在项目中使用一个图片选择器的第三方框架——GalleryFinal,想要导入源码,以便于修改,于是上完查找了一下方法,想到之前用到过其他导入第三方库的方法,现在做个小总结,以防忘记. A ... 
- C,C++开源项目中的100个Bugs
			俄罗斯OOO Program Verification Systems公司用自己的静态源码分析产品PVS-Studio对一些知名的C/C++开源项目,诸如Apache Http Server.Chro ... 
- CSS -- 文字竖直居中
			元素的height 和 lineheight 设置为一样即可. 
- jquery接收后台数组或集合回显复选框
			公司使用的框架比较旧,没有使用el等表达式.如果后台传递的是数组,需要把数组转为以逗号分隔的字符串. <% String context = request.getContextPath(); ... 
- docker是PaaS,与openstack是IaaS的关系
			个人理解Docker的每一个虚机其实是宿主操作系统中的一个进程.主要是一种虚拟化技术.OpenStack主要解决的是基础架构云的云服务问题.OpenStack是在虚拟化技术之上的一层,主要解决系统部署 ... 
- JS函数节流和函数防抖问题分析
			问题1:如果实现了dom拖拽功能,但是在绑定拖拽事件的时候发现每当元素稍微移动一点便触发了大量的回调函数,导致浏览器直接卡死,这个时候怎么办? 问题2:如果给一个按钮绑定了表单提交的post事件,但是 ... 
- ci框架(二)
			自定义SQL语句 当提供的API满足不了我们对S ... 
- SQL Server 2008数据库备份与恢复
			在这所要说的是“分离/附加”数据库: 1.分离数据库就是将某个数据库(如student_Mis)从SQL Server数据库列表中删除,使其不再被SQL Server管理和使用,但该数据库的文件(.M ... 
