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 ...
随机推荐
- 一个应用 可以有多个application
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 一个应用里面怎样才能有2个application 一个AndroidManifest.xml中可 ...
- 【数论】nefu118 n!后面有多少个0
就是求n!有多少个因子2和因子5,并在这两者中取较小者.因为必须要一个2和一个5才能拼出1个10. 显然2的数量多于5,因此只需要求n!有多少个因子5即可. n!中素因子p的个数= [n/p]+[n/ ...
- NOIP2014 解题报告·水渣记
Day 1: 第一次参加noip.小激动,小紧张,这些正常的情绪就不用说了.唯一值得一提的是 我早上步行去郑大工学院的时候迷路了,直接转进了隔壁的河南农大,绕了半天找不到机房,还给几个同学打了电话可就 ...
- [转] Hibernate与 MyBatis的比较
hibernateHibernateibatisIBATISMyBatismybatis 目录(?)[-] 第一章 Hibernate与MyBatis 1 Hibernate 简介 2 MyB ...
- Android Logcat Security(转)
讲解了在Android开发中logcat使用不当导致的安全问题 原帖地址:http://drops.wooyun.org/tips/3812 0x00 科普 development version : ...
- <摘录>Linux 环境下编译 0.11版本内核 kernel
系统环境:Fedora 13 + gcc-4.4.5 最近在看<linux内核0.11完全注释>一书,由于书中涉及汇编语言的地方众多,本人在大学时汇编语言学得一塌糊涂,所以实在看不下去了, ...
- node.js 中createConnection参数说明
host:主机地址 (默认:localhost) user:用户名 password:密码 port:端口号 (默认:3306) database:数据库名 charset:连接字符集(默认:'UTF ...
- python中出现 “'gbk' codec can't decode byte 0xf3 in position 20: illegal multibyte sequence”问题
其实是打开文件方法open()中的模式有r,w,a等. 请看: r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针将会放在文件的开头 ...
- Android疑难杂症之android:configChanges="orientation" 无效
通常情况下,当“屏幕方向”变化时会销毁并重建当前Activity.而我们有时候并不希望重新创建Activity实例,然后就会在AndroidManifest.xml中配置Activity: <a ...
- WebLogic 1036的镜像构建
WebLogic1035版本构建出来的镜像有问题,部署应用激活后返回的是后面pod的ip和端口号,在1036版本和12.1.3版本都无此问题. weblogic 1036的Dockerfile [ro ...