java中String、StringBuilder、StringBuffer区别与联系

博客从一道面试题引入,探讨去掉某些条件后内部创建对象及追加操作,研究相关方法运行结果。对比发现StringBuilder和某些情况结果相近,添加特定内容后又有变化。还分析了StringBuilder较快的原因,指出StringBuffer因有synchronized而线程安全。

由一道面试题开始:

/*
这段代码去掉final之后结果完全不一样
*/
public class TestMode {

	public static void main(String[] args) {
		final String a = "1";
		final String b = "2";
		String c = a + b;
		String d = "12";
		System.out.println(c == d);//返回true,证明a,b的确作为编译期常量
		                           //加入了常量池,而c也在编译期确定其值
	}
}

在有 final 的情况下是这样的:
在这里插入图片描述
这个不多说

去掉 final 之后:
在这里插入图片描述
这里做了什么呢?
内部是创建了一个 StringBuilder 对象,然后不停地 append 追加
最后调用 StringBuilder 对象的 toString 方法得到一个 String 对象
注意这个 toString 方法会 new 一个 String 对象

所以接下来研究一下 StringBuilder

package CodeTest;
public class StringTimeTest {
	public static void test1() {
		String str1 = "abc";
		String str2 = "de";
		String str = str1 + str2;
	}
	public static void test2() {
		String str = "abc" + "de";
	}
	public static void test3() {
		StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
	}
	public static void main(String[] args) {
		long startTime1=System.nanoTime(); // 获取开始时间
		test1();
		long endTime1=System.nanoTime(); // 获取结束时间
		System.out.println("test1运行时间: "+(endTime1-startTime1)+"ns");// 输出程序运行时间
		
		long startTime2=System.nanoTime(); // 获取开始时间
		test2();
		long endTime2=System.nanoTime(); // 获取结束时间
		System.out.println("test2运行时间: "+(endTime2-startTime2)+"ns");// 输出程序运行时间
		
		long startTime3=System.nanoTime(); // 获取开始时间
		test3();
		long endTime3=System.nanoTime(); // 获取结束时间
		System.out.println("test3运行时间: "+(endTime3-startTime3)+"ns");// 输出程序运行时间
	}

}

运行结果如下:
这里不能一起执行,以免常量池造成的混淆
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,test1test3 的结果是差不多的

随后加了 final 再看看:
在这里插入图片描述
test1 就和 test2 差不多了。

爲什麽 StringBuilder 比較快呢?

在StringBuilder源碼中:
在这里插入图片描述
它并沒有重複創建對象,StringBuffer中也是一样不重复创建对象,但它多了一个synchronized,这就是它StringBuffer线程安全的原因
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值