String、StringBuffer、StringBuilder区别并验证
© 版权声明:本文为博主原创文章,转载请注明出处
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区别并验证的更多相关文章
- 转:String StringBuffer StringBuilder区别
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...
- String&StringBuffer&StringBuilder区别
String String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式: (1)直接赋值(例中,String str = &q ...
- String,StringBuffer,StringBuilder区别
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- Java中String/StringBuffer/StringBuilder区别(转)
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- String StringBuffer StringBuilder区别与联系
java.lang.String.java.lang.StringBuffer.java.lang.StringBuilder都是字符串类型,是Java中用于处理字符串常用的三个类.它们主要有以下区别 ...
- Java学习之String StringBuffer StringBuilder区别
1.String:对象长度是不可变的,是线程安全. 2.StringBuffer:对象长度是可变的,是线程安全. 3.StringBuilder:对象长度是可变,不是线程安全.
- String,StringBuffer,StringBuilder区别(笔记)
String类被final修饰,创建的对象为不可变对象,属于字符串常量. 而StringBuffer与StringBuilder创建的属于字符串常量. StringBuffer的方法大多用了Synch ...
- java中string , StringBuffer , StringBuilder 区别
1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这 ...
- String StringBuffer stringbuilder 区别
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 字符串类 ,长度不可变. 字符串缓存器类, 长度可变, 线程安全, 字符串构造器类,长度 ...
- 【Java基础】String StringBuffer StringBuilder
String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...
随机推荐
- MVC 视图与控制器传值的几种方法
一.页面取值传给控制器 1.表单传值----利用Action 视图页: <form action="方法名" method="post" ...
- 使用Android Studio开发调用.NET Webservice 之初体验
本人是.NET出身 但苦于领导要让研究Android 外壳然后准备套html5 ,当试验兵真坑啊 但也没办法 咱还得研究啊,索性 不辜负领导的期望(也研究好两三天了)总算弄明白了 app本地存储 和 ...
- python 将windows字体中的汉字生成图片的方法
#encoding: utf-8import osimport pygame chinese_dir = '黑体常规'if not os.path.exists(chinese_dir): os.mk ...
- Python与数据库[0] -> 数据库概述
数据库概述 / Database Overview 1 关于SQL / About SQL 构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一 ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- poj3693(后缀数组)
poj3693 题意 给出一个串,求重复次数最多的连续重复子串,输出字典序最小的. 分析 论文 例8(P21). Sparse-Table算法预处理出任意两个后缀串的LCP. code #includ ...
- Spfa【p3385】【模板】负环(spfa)
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述 毒瘤数据要求判负环 分析: 还是融合了不少题解的思想的. 负环定义: 权值和为负的环 //在网络上并没有找到一个官方定义,暂且这么理解. ...
- 洛谷——P3395 路障
P3395 路障 题目背景 此题约为NOIP提高组Day1T1难度. 题目描述 B君站在一个n*n的棋盘上.最开始,B君站在(1,1)这个点,他要走到(n,n)这个点. B君每秒可以向上下左右的某个方 ...
- 监控SQL Server正在执行的SQL语句和死锁情况
原文:监控SQL Server正在执行的SQL语句和死锁情况 SELECT [Individual Query] = SUBSTRING(qt.TEXT, er.statement_start_off ...
- VMware Converter 迁移物理机到 esxi 虚拟机
http://dngood.blog.51cto.com/446195/685082/ VMware Converter 有啥用? VMware Converter 是一款能将物理电脑系统.VMwa ...