String、StringBuilder和StringBuffer区别及效率

三者使用建议: 少量字符(拼接次数少,且字符串总长度短)串拼接String更快一点,拼接的数据量稍大点(拼接字次数十次左右,总长度大概1000个英文字符),StringBuilder和StringBuffer有差距但不是很大,建议采用StringBuffer,安全且效率不会太低。

一、三者区别

String:
String字符串内容定义后是不可变的,拼接字符串会开辟新的内存空间,造成资源浪费。

String str = "我是"; // ①"我是"会开辟一个内存空间
str+="程序员"; // ②"程序员"会开辟一个内存空间,③同时新的str"我是程序员"也会生成一个内存空间

StringBuffer:
继承自AbstractStringBuilder类,append方法拼接字符串,线程安全,但执行效率低。

StringBuilder:

同上,继承自AbstractStringBuilder类,append方法拼接字符串,由于没有对方法加锁同步,造成了线程不安全,但是执行效率高。

二、 执行效率

1.执行效率

StringBuilder > StringBuffer > String

2.实验数据

1.英文SQL拼接耗时(拼接字符总长度3945,拼接次数49,共执行10000次)

StringBuffer > StringBuilder > String

StringBuffer
(149+141+138+135+144) / 5 ≈ 141.4 ms

StringBuilder
(139+155+150+162+155) / 5 ≈ 152.2 ms

String(由于执行10000次进程卡死,以下实验数据为2500次,但此时耗时已明显比前两者多了)
(195+183+196+186+217) / 5 ≈ 195.4 ms

2.中英及特殊字符拼接耗时(拼接字符总长度756,拼接次数28,共执行10000次)

StringBuffer > StringBuilder > String

StringBuffer
(50+59+58+47+49) / 5 ≈ 52.6 ms

StringBuilder
(51+56+53+60+50) / 5 ≈ 54 ms

String
(157+151+136+156+136) / 5 ≈ 147.2 ms

3.测试跳转地址:菜鸟工具

4.测试代码(建议三者单独写main方法测试,减少不可控因素影响)

public class HelloWorld {
	public static void main(String[] args) {
		long start1 = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
	    	StringBuilder sql = new StringBuilder();
	    	sql.append("");
	    	sql.append("");
	    	sql.append("");
	    	sql.append("");
		}
		System.out.println("StringBuilder cost time:" + (System.currentTimeMillis() - start1) + "ms");
		long start2 = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			StringBuffer sql = new StringBuffer();
	    	sql.append("");
	    	sql.append("");
	    	sql.append("");
	    	sql.append("");
		}
		System.out.println("StringBuffer cost time:" + (System.currentTimeMillis() - start2) + "ms");
		long start3 = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			String sql = "";
			sql+="";
			sql+="";
			sql+="";
		}
		System.out.println("string+ cost time:" + (System.currentTimeMillis() - start3) + "ms");
	}
}

5.总结:
实验数据只能仅供参考了(笑哭)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值