4,String、StringBuffer、StringBuilder区别
答:
1,可变与不可变
String类使用字符数组保存字符串,并用final修饰符修饰,所以String对象是不可变的。
StringBuilder和StringBuffer也是用字符数组来保存字符串,但是这两种对象是可变的。
2,是否多线程安全
String对象是不可变的,也就可以理解为常量,显然线程安全。
StringBuilder没有对方法进行加同步锁,所以是非线程安全的。
StringBuffer对所有方法都加了Synchronized同步锁,所以是线程安全的。
3,效率
String是字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
以下面一段代码为例:
String str = “abc”;
System.out.println(str);//输出abc
str = str + “de”;
Systrm.out.println(str);//输出abcde
JVM对于这段代码是这样处理的:首先创建一个String对象str,并把“abc”赋值给str,然后再第三行中,其实JVM又创建了一个新的对象str,然后把原来str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,java对String对象的操作实际上是一个不断创建新的对象并将旧的对象回收的过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
而StringBuilder和StringBuffer进行比较的话,因为StringBuffer中的很多方法可以带有synchronized关键字,所以效率要比StringBuilder低。
总结一下:
String:适用于少量的字符串的操作
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作的情况