1.String与StringBuilder、StringBuffer的主要区别
String id = "我的";
System.out.println(id);
id="你的";
System.out.println(id);
结果是:
虽然输出的值不一样,但这是String的操作生成新了String对象,原有的并没有改变。
在内存中原有的不会改变,String的操作后会在内存中新生成一个。不仅效率低下,而且浪费大量优先的内存空间
而StringBuilder、StringBuffer会在原有的基础上改变值。
String
固定不可变字
符串
|
StringBuffer
可变
|
StringBuilder
可变
|
---|---|---|
String
的值是不可变
的,这就导致每次对
String
的操作都会生
成新的
String
对象,
不仅效率低下,而且
浪费大量优先的内存
空间
|
StringBuffer
是可变类,和线程安全的字符串
操作类,任何对它指向的字符串的操作都不会
产生新的对象。每个
StringBuffer
对象都有一
定的缓冲区容量,当字符串大小没有超过容量
时,不会分配新的容量,当字符串大小超过容
量时,会自动增加容量
|
可变类,速度
更快
|
不可变
|
可变
|
可变
|
线程安全
|
线程不安全
| |
多线程操作字符串
|
单线程操作字符串
|
2.StringBuilder和StringBuffer的主要区别
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
因此StringBuffer适用于多线程环境下的大量操作。对于StringBuilder来说,执行效率虽然高,但是因为线程不安全,所以不建议在多线程的环境下对同一个StringBuilder对象进行操作。因此StringBuilder适用于单线程环境下的大量字符串操作。
3.总结
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
感谢大家的观看,希望能给大家带来帮助