© 版权声明:本文为博主原创文章,转载请注明出处

String、StringBuffer、StringBuilder的区别

1.String是一个常量,其对象一旦创建完毕就无法改变,当使用“+”拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。

 StringBuffer和StringBuilder都是变量,追加内容时不会生成新的对象。

2.String初始化的时候是最快的,StringBuilder其次,StringBuffer最慢

 但是修改内容的时候StringBuilder是最快的,StringBuffer其次,String最慢

3.String是常量,因此线程安全。

 StringBuffer是线程安全的,StringBuilder是非线程安全的

验证

1.String是常量,改变值会生成新的对象;StringBuffer和StringBuilder是变量,改变值不会生成新的对象

 /**
* 内存比较
*/
private static void memery() { String str1 = "abc";
System.out.println("String first memery address is " + str1.hashCode());
str1 += "efg";
System.out.println("String second memery address is " + str1.hashCode()); StringBuilder sb1 = new StringBuilder("abc");
System.out.println("StringBuilder first memery address is " + sb1.hashCode());
sb1.append("efg");
System.out.println("StringBuilder second memery address is " + sb1.hashCode()); StringBuffer sb2 = new StringBuffer("abc");
System.out.println("StringBuffer first memery address is " + sb2.hashCode());
sb2.append("efg");
System.out.println("StringBuffer second memery address is " + sb2.hashCode()); }

memery

结果:

2.初始化速度:String>StringBuilder>StringBuffer

 /**
* 初始化性能比较
*/
private static void initial() { long time1 = System.nanoTime();
String str1 = "abc";
long time2 = System.nanoTime();
System.out.println("String time: " + (time2 - time1) + "ns"); long time3 = System.nanoTime();
StringBuffer sb1 = new StringBuffer("abc");
long time4 = System.nanoTime();
System.out.println("StringBuffer time: " + (time4 - time3) + "ns"); long time5 = System.nanoTime();
StringBuilder sb2 = new StringBuilder("abc");
long time6 = System.nanoTime();
System.out.println("StringBuilder time: " + (time6 - time5) + "ns"); }

initial

结果:

3.执行速度(即改变值的时候):StringBuilder>StringBuffer>String

 /**
* 性能比较
*/
private static void performance() { long time1 = System.nanoTime();
String str1 = "";
for (int i = 0; i < 10; i++) {
str1 += i;
}
long time2 = System.nanoTime();
System.out.println("the time required for String to execute 1000 times: " + (time2 - time1) + "ns"); long time3 = System.nanoTime();
StringBuffer sb1 = new StringBuffer();
for (int i = 0; i < 10; i++) {
sb1.append(i);
}
long time4 = System.nanoTime();
System.out.println("the time required for StringBuffer to execute 1000 times: " + (time4 - time3) + "ns"); long time5 = System.nanoTime();
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb2.append(i);
}
long time6 = System.nanoTime();
System.out.println("the time required for StringBuilder to execute 1000 times: " + (time6 - time5) + "ns"); }

performance

结果:

4.特殊例子:当执行String str = "a" + "b" + "c"时,String的速度是最快的,因为等价于String = "abc";上面讲过,初始化的时候String是最快的

 /**
* 特殊例子
*/
private static void special() { long time1 = System.nanoTime();
String str1 = "abc" + "def" + "ghi" + "jk";
long time2 = System.nanoTime();
System.out.println("String time: " + (time2 - time1) + "ns"); long time3 = System.nanoTime();
StringBuffer sb1 = new StringBuffer("abc").append("def").append("ghi").append("jk");
long time4 = System.nanoTime();
System.out.println("StringBuffer time: " + (time4 - time3) + "ns"); long time5 = System.nanoTime();
StringBuilder sb2 = new StringBuilder("abc").append("def").append("ghi").append("jk");
long time6 = System.nanoTime();
System.out.println("StringBuilder time: " + (time6 - time5) + "ns"); }

special

结果:

5.StringBuffer是线程安全的,StringBuilder是非线程安全的

 /**
* 线程安全性验证
*/
public static void thread() { final StringBuffer sb1 = new StringBuffer();
final StringBuilder sb2 = new StringBuilder();
final CountDownLatch latch1 = new CountDownLatch(1000);
final CountDownLatch latch2 = new CountDownLatch(1000); for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
try {
sb1.append("1");
} finally {
latch1.countDown();
} }
}).start();
}
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
try {
sb2.append("2");
} finally {
latch2.countDown();
}
}
}).start();
} try {
latch1.await();
System.out.println(sb1.length());
latch2.await();
System.out.println(sb2.length());
} catch (Exception e) {
e.printStackTrace();
} }

thread

结果:需多执行几次,StringBuffer长度全部为1000,StringBuilder大部分都是小于1000的

6.完整代码

 package org.java.base;

 import java.util.concurrent.CountDownLatch;

 /**
* String、StringBuffer、StringBuilder比较
*/
public class StringAndStringBufferAndStringBuilder { public static void main(String[] args) { //memery();
//initial();
//performance();
//special();
thread(); } /**
* 内存比较
*/
private static void memery() { String str1 = "abc";
System.out.println("String first memery address is " + str1.hashCode());
str1 += "efg";
System.out.println("String second memery address is " + str1.hashCode()); StringBuilder sb1 = new StringBuilder("abc");
System.out.println("StringBuilder first memery address is " + sb1.hashCode());
sb1.append("efg");
System.out.println("StringBuilder second memery address is " + sb1.hashCode()); StringBuffer sb2 = new StringBuffer("abc");
System.out.println("StringBuffer first memery address is " + sb2.hashCode());
sb2.append("efg");
System.out.println("StringBuffer second memery address is " + sb2.hashCode()); } /**
* 初始化性能比较
*/
private static void initial() { long time1 = System.nanoTime();
String str1 = "abc";
long time2 = System.nanoTime();
System.out.println("String time: " + (time2 - time1) + "ns"); long time3 = System.nanoTime();
StringBuffer sb1 = new StringBuffer("abc");
long time4 = System.nanoTime();
System.out.println("StringBuffer time: " + (time4 - time3) + "ns"); long time5 = System.nanoTime();
StringBuilder sb2 = new StringBuilder("abc");
long time6 = System.nanoTime();
System.out.println("StringBuilder time: " + (time6 - time5) + "ns"); } /**
* 性能比较
*/
private static void performance() { long time1 = System.nanoTime();
String str1 = "";
for (int i = 0; i < 10; i++) {
str1 += i;
}
long time2 = System.nanoTime();
System.out.println("the time required for String to execute 1000 times: " + (time2 - time1) + "ns"); long time3 = System.nanoTime();
StringBuffer sb1 = new StringBuffer();
for (int i = 0; i < 10; i++) {
sb1.append(i);
}
long time4 = System.nanoTime();
System.out.println("the time required for StringBuffer to execute 1000 times: " + (time4 - time3) + "ns"); long time5 = System.nanoTime();
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb2.append(i);
}
long time6 = System.nanoTime();
System.out.println("the time required for StringBuilder to execute 1000 times: " + (time6 - time5) + "ns"); } /**
* 特殊例子
*/
private static void special() { long time1 = System.nanoTime();
String str1 = "abc" + "def" + "ghi" + "jk";
long time2 = System.nanoTime();
System.out.println("String time: " + (time2 - time1) + "ns"); long time3 = System.nanoTime();
StringBuffer sb1 = new StringBuffer("abc").append("def").append("ghi").append("jk");
long time4 = System.nanoTime();
System.out.println("StringBuffer time: " + (time4 - time3) + "ns"); long time5 = System.nanoTime();
StringBuilder sb2 = new StringBuilder("abc").append("def").append("ghi").append("jk");
long time6 = System.nanoTime();
System.out.println("StringBuilder time: " + (time6 - time5) + "ns"); } /**
* 线程安全性验证
*/
public static void thread() { final StringBuffer sb1 = new StringBuffer();
final StringBuilder sb2 = new StringBuilder();
final CountDownLatch latch1 = new CountDownLatch(1000);
final CountDownLatch latch2 = new CountDownLatch(1000); for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
try {
sb1.append("1");
} finally {
latch1.countDown();
} }
}).start();
}
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
try {
sb2.append("2");
} finally {
latch2.countDown();
}
}
}).start();
} try {
latch1.await();
System.out.println(sb1.length());
latch2.await();
System.out.println(sb2.length());
} catch (Exception e) {
e.printStackTrace();
} } }

StringAndStringBufferAndStringBuilder

String、StringBuffer、StringBuilder区别并验证的更多相关文章

  1. 转:String StringBuffer StringBuilder区别

    转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...

  2. String&StringBuffer&StringBuilder区别

    String  String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式:    (1)直接赋值(例中,String str = &q ...

  3. String,StringBuffer,StringBuilder区别

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  4. Java中String/StringBuffer/StringBuilder区别(转)

    1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuild ...

  5. String StringBuffer StringBuilder区别与联系

    java.lang.String.java.lang.StringBuffer.java.lang.StringBuilder都是字符串类型,是Java中用于处理字符串常用的三个类.它们主要有以下区别 ...

  6. Java学习之String StringBuffer StringBuilder区别

    1.String:对象长度是不可变的,是线程安全. 2.StringBuffer:对象长度是可变的,是线程安全. 3.StringBuilder:对象长度是可变,不是线程安全.

  7. String,StringBuffer,StringBuilder区别(笔记)

    String类被final修饰,创建的对象为不可变对象,属于字符串常量. 而StringBuffer与StringBuilder创建的属于字符串常量. StringBuffer的方法大多用了Synch ...

  8. java中string , StringBuffer , StringBuilder 区别

    1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这 ...

  9. String StringBuffer stringbuilder 区别

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 字符串类 ,长度不可变. 字符串缓存器类, 长度可变, 线程安全, 字符串构造器类,长度 ...

  10. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

随机推荐

  1. uva11019矩阵匹配器D316

    #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #inclu ...

  2. Reporting Services 的一些问题

    做报表有一段时间,感觉Reporting Services还是比较麻烦的,因为网上的例子有的比较少,很多地方都需要自己摸索,说说我遇到的一些问题 1:页首的设计 一些固定显示的资料放在页首里面比较方便 ...

  3. (寒假集训) Cow Jog(二分优化的最长上升子数列)

    Cow Jog 时间限制: 1 Sec  内存限制: 64 MB提交: 24  解决: 5[提交][状态][讨论版] 题目描述 Farmer John's N cows (1 <= N < ...

  4. Xamarin XAML语言教程使用方法设置进度条进度

    Xamarin XAML语言教程使用方法设置进度条进度 在ProgressBar中定义了一个ProgressTo方法,此方法也可以用来对进度条当前的进行进行设置,ProgressTo与Progress ...

  5. UVA 11990 ”Dynamic“ Inversion(线段树+树状数组)

    [题目链接] UVA11990 [题目大意] 给出一个数列,每次删去一个数,求一个数删去之前整个数列的逆序对数. [题解] 一开始可以用树状数组统计出现的逆序对数量 对于每个删去的数,我们可以用线段树 ...

  6. 合理配置SQL Server的最大内存

    http://blog.itpub.net/26435490/viewspace-1481846/

  7. 如何暂停sqlserver数据订阅服务

    原文:如何暂停sqlserver数据订阅服务 从 Management Studio 启动和停止快照代理或日志读取器代理 在 Management Studio 中连接到发布服务器,然后展开服务器节点 ...

  8. Go -- 读取文件内容

    Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查. 一次性读取 小文件推荐一次性读取,这样程序更简单,而且速度最快. 代码如下: func ReadAll(filePth ...

  9. numpy 多维数组的存取

    多维数组的存取和一维数组类似,由于多维数组有多个轴,所以他的下标需要多个值来表示.这里讨论的主要是二维数组.二维数组0轴以行为单位,1轴以列为单位,存取数组使用元组作为下标,需要注意的是,python ...

  10. 2017.9.15 mybatis批量插入后实现主键回填

    参考来自:mybatis mysql 批量insert 返回主键 注意:必须要在mybatis3.3.1及其以上才能实现. 1.service List branchEntryList = (Arra ...