正文
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