(1)请你说明String 和StringBuffer,StringBuilder的区别
(1):String 是对象不是原始类型,是不可变对象,一旦创建,就不能修改它的值,对于已经存在的String对象的修改都是重新创建一个String对象,把新的值保存进去;String是final类,不能被继承。
:这里补充下原始类型:char,boolean,byte,short,int,long,float,double对应其包装类型:首字母大写:Character,Boolean,Byte,Short,Integer,Long,Float,Double
(2):StringBuffer 是可以修改的对象,修改它的时候不会像创建String对象一样重新创建赋值,它只能通过构造函数创建,在创建后会在内存中分配空间,初始化会保存一个null,当向StringBuffer赋值的时候可以通过它的append方法。它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上synchronized。但是保证了线程安全是需要性能的代价。
(3):在操作字符串连接中StringBufer效率要比String要高:
String str = new String("hello,word");
str + = "xiaoming";
上面的处理其实是先通过建立一个StringBuffer 通过append方法,最后 .toString(); 通过对比知道String的连接操作比StringBuffer多了一些操作,效率会大打折扣。
(4):String对象的创建修改过程每次都会创建新的对象,这样之前的对象就会被垃圾回收,影响性能。
-------------
(5):StringBuilder JDK1.5发布的,与StringBuffer本质上没有区别,就是去掉了保证线程安全那部分,减少了开销。
(6):StringBuffer与StringBuilder都继承了AbstractStringBuilder,底层都是利用可修改的char数组(JDK9后是byte数组)。
(7):如果有大量字符串需要拼接,如果能预知大小,最好在new StringBuffer,StringBuilder的时候设置capacity,避免多次扩容,扩容要抛弃原有数组拷贝创建新的数组。
总结:少量操作字符串使用String就够了,如果在程序中需要对字符串频繁修改连接操作,String在操作字符串的时候new了很多次StringBuffer,建议使用StringBuffer,这样性能更高,很多情况下我们操作字符串不需要线程安全,可以用StringBuilder,减小开销。