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

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. CentOS7.0使用Yum安装Nginx

    安装Nginx yum install nginx 正常情况下必定是: 已加载插件:fastestmirror, langpacks base | 3.6 kB 00:00:00 docker-mai ...

  2. luogu P1332 血色先锋队

    题目描述 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好 ...

  3. POJ 2987 Firing(最大权闭合图)

    [题目链接] http://poj.org/problem?id=2987 [题目大意] 为了使得公司效率最高,因此需要进行裁员, 裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果, 如果裁 ...

  4. 八. 输入输出(IO)操作6.文件与目录管理

    目录是管理文件的特殊机制,同类文件保存在同一个目录下不仅可以简化文件管理,而且还可以提高工作效率.Java 语言在 java.io 包中定义了一个 File 类专门用来管理磁盘文件和目录. 每个 Fi ...

  5. 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-使用工厂创建代理(Using the ProxyFactoryObject to create AOP proxies)

    本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 如果你正在为你的业务模型使用 ...

  6. What is the purpose of mock objects?

    Since you say you are new to unit testing and asked for mock objects in "layman's terms", ...

  7. ios frame,bound和center

    frame:指的是视图在父视图的坐标系统中的大小和位置. bound:指的是视图在试图本身的坐标系统中的大小(位置起点是原点). center:指的是视图在父视图坐标系统中的中心点. 贴张苹果官网的图 ...

  8. 通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃

    1.基本信息: 2017/11/27,Check Point 软件技术部门报告了一个华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215),Mirai的升级版变种中已经使用该漏洞.看 ...

  9. Spring IoC Container and Spring Bean Example Tutorial

    Spring Framework is built on the Inversion of Control (IOC) principle. Dependency injection is the t ...

  10. ElasticSearch 安装中文分词器

    1.安装中文分词器IK 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 在线下载安装: elasticsearch-plugin.bat ...