1、String、StringBuffer、StringBuilder的区别
String是Java中基础类型,是immutable类(不可变)的典型实现,利用string进行拼接是会产生过多无用对象。
StringBuffer就是为解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列中的末尾或者定位置。
StringBuilder与StringBuffer本质上没有什么区别,只是除去了线程安全那部分。
(1)在字符串不经常发生变化的业务场景优先使用String(代码更清晰简洁)。如常量的声明,少量的字符串操作(拼接,删除等)。
(2)在单线程情况下,如有大量的字符串操作情况,应该使用StringBuilder来操作字符串。不能使用String"+"来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。如JSON的封装等。
(3)在多线程情况下,如有大量的字符串操作情况,应该使用StringBuffer。如HTTP参数解析和封装等。
2、String的不变性
(1)String不变性指:被声明为 final,是不可变的,它也不可被继承。如以下例子:
String s="abc",String s="abcde";给一个已有字符串"abc"第二次赋值成"abcde",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。
(2)String的源码
1)首先String类是用final关键字修饰,这说明String不可继承。
2)String类的主要成员字段value是用final修饰的char[]数组。虽然保证了char数组的引用不可变。但是可以通过char[0] = 'a’来修改值。不过String内部并不提供方法来完成这一操作,所以String的不可变也是基于代码封装和访问控制的。
(3)String不变性的优势
1)线程安全,在多线程的环境下,可以被安全使用。
2)hash值不需要重复计算,比如使用 String 做为 HashMap 中的 key ,那么不需要重复计算 hash 值。
3)一个 String 被创建后,被可以放入 String Pool 中,就可以被其他地方所引用;因为 String 是不可变的,所以才能实现 String Pool 。