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 ...
随机推荐
- [BZOJ4013][HNOI2015]实验比较(树形DP)
4013: [HNOI2015]实验比较 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 756 Solved: 394[Submit][Status] ...
- wannafly挑战赛14
第一次打wannafly..觉得自己好菜啊... 题目描述 在三维空间中,平面 x = 0, y = 0, z = 0,以及平面 x + y + z = K 围成了一个三棱锥. 整天与整数打交道的小明 ...
- [LOJ2553]暴力写挂
锟题x2 以下用$a\rightarrow b$表示端点为$a,b$的链 把式子写成$(h_1(x)+h_1(y)-h_1(lca))-h_2(lca')$,第一部分就是$x\rightarrow r ...
- 小H的硬币游戏
题目大意: 有n个物品排成一排,每个物品都有自己的价值,你每次可以从中挑选两个距离为k的物品取走,问最大的收益. (如果原来两个物品中间有物品被取走,距离不变) 思路: 贪心. 先按照每个物品的位置m ...
- 使用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. ...
- Ubuntu下查看APT安装的软件安装路径和版本
1.查询安装路径 dpkg -L 软件名 例如:dpkg -L gedit dpkg -L gedit /. /usr /usr/bin /usr/bin/gedit /usr/share /usr/ ...
- iOS中 三种随机数方法详解
ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(t ...
- css实现半颗星评分效果
效果如下: html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS)
这篇文章介绍如何允许跨域访问 浏览器安全不允许不同域名的网页之间发送请求.这种限制叫做同源策略(the same-origin policy). 同源策略可以防止一个恶意的站点读取另一个站点的敏感数据 ...
- Struts2实现登录流程
本节将演示一个基本的登录流程,在登录界面中若输入正确的用户名和密码,跳转到登录成功界面:否则路转到登录失败界面. 1 建立一个名为LoginDemo的动态Web项目 2 添加struts2相关的jar ...