String,StringBuffer,StringBuilder的区别(代码亲测总结)

1、用String定义出来的是字符串常量,不可以更改;StringBuffer,StringBuilder创建的是变量
what?你在逗我?事实上是真的,只是我们没有看不见而已。
在这里插入图片描述
看见了吗?我可是改了a的值哟。其实通过网上查询最后发现这是Java虚拟机在背后搞事,在第七行它确实创建了一个对象str,也赋了值,但是第八行却不是重新给a赋值哦,jvm实际上是创建了一个新的对象,赋值bcd,而原来的str实际上是被jvm的回收机制给回收了而已。所以说用String定义的是常量。而StringBuffer,StringBuilder创建的是变量,即你可以动态的修改它的值,而不是创建或者会被jvm回收。

2、执行时间,速度上StringBuilder>StringBuffer>String,毕竟每次对String来说都是新创建一个对象还要进行回收,所以String操作字符串毫无疑问是最耗时间的,看下实例代码会更清楚。

package ali_different_sting.sty;

public class StringTest {
//测试
	public static void StringTest(){
		String str=null;//先定义一个产量
		long start_time = System.currentTimeMillis();//获取下面操作前的时间
		for(int i=0;i<1000;i++){//添加1000次字符串
			str=str+"test";
		}
		long end_time = System.currentTimeMillis();//获取操作完成后的时间
		long waste_time = end_time  - start_time;//总过花费时间
		System.out.println("用string花费时间:"+waste_time);
	}
	
	public static void StringBufferTest(){
		StringBuffer str=new StringBuffer();//先定义一个产量
		long start_time = System.currentTimeMillis();//获取下面操作前的时间
		for(int i=0;i<1000;i++){//添加1000次字符串
			str=str.append("test");
		}
		long end_time = System.currentTimeMillis();//获取操作完成后的时间
		long waste_time = end_time  - start_time;//总过花费时间
		System.out.println("用StringBuffer花费时间:"+waste_time);
	}
	
	public static void StringBuilderTest(){
		StringBuilder str=new StringBuilder();//先定义一个产量
		long start_time = System.currentTimeMillis();//获取下面操作前的时间
		for(int i=0;i<1000;i++){//添加1000次字符串
			str=str.append("test");
		}
		long end_time = System.currentTimeMillis();//获取操作完成后的时间
		long waste_time = end_time  - start_time;//总过花费时间
		System.out.println("用StringBuilder花费时间:"+waste_time);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a = "abc";
		a = "bcd";
		System.out.println(a);
		StringTest();
		StringBufferTest();
		StringBuilderTest();
	}
}

在这里插入图片描述
3、StringBuffer是线程安全的,因为它的很多方法都带有synchronized关键字,就是同步的意思。同步就是我做完之后你再做,比如有两个线程都要对字符串进行操作,如果设置了synchronized关键字,当有一个线程进行操作的时候就会将另一个线程阻塞。所以对应的StringBuilder就缺乏这个关键字,因此不是线程安全的。

总结就是:

  1. 字符串少的时候用String就够了速度也快;有大量字符串时用StringBuffer或者StringBuilder都行。
  2. String操作的是常量,对其的任何操作都会新建一个对象并且回收垃圾。StringBuffer,StringBuilder操作的是变量,可在原对象的基础上动态增长或者其他操作。
  3. 执行速度:StringBuilder>StringBuffer>String
  4. StringBuffer带有synchronized,线程安全;StringBuilder非线程安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值