Java中String类StringBuffer类和StringBuilder类的区别

首先阐述String类和StringBuffer类的区别,String类是常量,不能添加,而StringBuffer则是一个字符缓冲区,可以往里面添加字符串。比如说:

<span style="font-size:18px;">String str = "helloworld";

str += "welcome";</span>

这里其实过程是这样的:生成了String对象 "helloworld" 引用由str持有, 当执行 str += "welcome" ; 这行代码的时候其实是废弃了 原来的 "helloworld"对象 然后产生了新的拼接之后的对象,然后把引用赋给了str。 所以过程中又生成了新的String类型的对象,然后原来的对象就要被垃圾回收器回收。肯定是要影响程序的性能。


那么,我们现在再来看一看StringBuffer的做法


<span style="font-size:18px;">StringBuffer sb  = new StringBuffer("helloworld");

sb.append("welcome");</span>

StringBuffer的过程是这样的。首先构造出一个StringBuffer对象,在缓冲区中,让后可以在缓冲区中直接添加指定的字符串序列。


还有一种写法肯定是错的 :

StringBuffer sb = new StringBuffer();

sb = "helloworld";   //字符串对象怎么能赋给StringBuffer对象呢?

然后下面的测试String  类和StringBuffer类的性能测试代码段


执行效果不绝对,因每一台机子的硬件配置而定。

首先是String类的性能

<span style="font-size:18px;">/* 本代码段测试String类的性能   约2854毫秒
		String tempValue = "helloworld";
		
  		int times = 10000;
		
		String value = "";
		
		long startTime = System.currentTimeMillis();
		
		for(int i = 0 ;i < times ; i++)
		{
			value += tempValue;
		}
		
		long endTime = System.currentTimeMillis();
		
		System.out.println(endTime - startTime);
		
		*/</span>

然后是StringBuffer类

<span style="font-size:18px;">/* 本代码段用于测试StringBuffer类的性能   约为10毫秒
		String tempValue = "helloworld";
		
		int times = 10000;
		
		StringBuffer sb = new StringBuffer();
		
		long startTime = System.currentTimeMillis();
		
		for(int i = 0 ; i < times ; i++)
		{
			sb.append(tempValue);
		}
		
		long endTime = System.currentTimeMillis();
		
		System.out.println(endTime - startTime);
		
		*/</span>


在一个就是StringBuilder 和StringBuffer类的比较

怎么说的StringBuilder类是从JDK5.0开始出现的类。用来替代StringBuffer 。但是不保证线程安全。如果你需要这种同步,请使用StringBuffer类,StringBuilder类是线程不安全的。而StringBuffer是线程安全的。

性能上来说StringBuilder是比StringBuffer的性能要强那么一点点,但是两个类总体上的使用方法是差不多的。


一下是测试StringBuilder类的性能的测试代码段。

<span style="font-size:18px;">/* 本代码段用于测试 StringBuilder类的性能  约10毫秒
		
		String tempValue = "helloworld";
		
		int times = 10000;
		
		StringBuilder sb = new StringBuilder();
		
		long startTime  = System.currentTimeMillis();
		
		for(int i = 0 ; i < times ; i++)
		{
			sb.append(tempValue);
		}
		long endTime = System.currentTimeMillis();
		
		System.out.println(endTime - startTime);
		*/</span>


综上所述:如果你使用的是常量的要多一些,还请使用String类 ,如果经常改变值,还请使用StringBuffer 或StringBuilder。


一般来说性能上 StringBuilder  > StringBuffer > String 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值