StringBuffer /StringBuilder和String 的区别

本文通过实验对比了String、StringBuilder和StringBuffer在字符串拼接操作中的性能表现,揭示了它们之间的速度差异及其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


·        首先要知道它们的作用主要是为了保存字符串(他们的区别也主要体现在这),比起string 的提供的各种操作,前两者主要优势则是体现在速度上(底下附实例验证)。

记住几个重要知识点

·        速度上 StringBuilder>StringBuffer>String (前两个速度很接近,但速度远超string)

·        StringBuilder 线程不安全,推荐使用,但是多线程考虑到同步使用下者

·        StringBuffer是用于线程安全的,如果需要同步才考虑它

 

产生速度差别的原因:

·        String abc="def";

        生成的abc对象其实是个常量,一旦创建无法更改。

·        abc=abc+"aaa";

        而这种给字符串重新赋值的方式,看似改变了对象,其本质是给新生成的字符串在存储区重新分配别的空间,也就是系统重新建立了abc对象,如果频繁改变字符串则就生成很多无用的对象。

重点是String每次改变字符串的时候,而且在jvm中,程序自动创建了StringBuilder,并利用它为你重新生成String,因此直接用StringBuilder相当于主动减少了改变字符串要经历的环节。

·        StringBuilder之所以比StringBuffer快一点,因为他是不支持同步的。

速度验证(java):


import java.util.Random;

public class StringBuilderTest {
	// 以下三个函数遵照同一种方式生成等长字符串,比较他们的速度
	public String toStringTest() { // 生成String对象字符串
		Random rand = new Random(50);
		String result;
		result = "[";
		for (int i = 0; i < 25000; i++) {//注意这与其他两个函数循环次数不同
			result = result + rand.nextInt(100) + ",";
		}
		result.substring(0, result.length() - 1);
		result += "]";
		return result;
	}

	public String toStringTest1() {// 生成StringBuilder对象字符串
		Random rand = new Random(50);
		StringBuilder result = new StringBuilder("[");
		for (int i = 0; i < 250000; i++) {
			result.append(rand.nextInt(100));
			result.append(",");
		}
		result.delete(result.length() - 2, result.length());
		result.append("]");
		return result.toString();
	}

	public String toStringTest2() {// 生成StringBuffer对象字符串
		Random rand = new Random(50);
		StringBuffer result = new StringBuffer("[");
		for (int i = 0; i < 250000; i++) {
			result.append(rand.nextInt(100));
			result.append(",");
		}
		result.delete(result.length() - 2, result.length());
		result.append("]");
		return result.toString();
	}

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		StringBuilderTest test = new StringBuilderTest();
		System.out.println(test.toStringTest());//分别调用他们,算出运行时间
		System.out.println("用时: " + (System.currentTimeMillis() - start) + "ms");
	}
}


运行截图:

·        String(注意这个 函数只循环25000次,是后两者的1/10,因为运行250000次,软件崩了)


·        StringBuilder(循环250000次才看出来与StringBuffer速度上的微弱差异)


·        StringBuffer

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值