StringBuffer和StringBuilder
StringBuffer和StringBuilder
StringBuffer
- String类型的字符串,一旦new出来后不可变
/*这一行代码对创建了三个String对象:"abc","bc","abcbc"
  故如果频繁进行字符串拼接,会造成方法区里的字符串常量池里无用对象过多,造成浪费
  推荐使用StringBuffer或StringBulider
*/
String s1 = "abc"+"bc";
- 在Java9之前 String,StringBuffer和StringBuilder的底层结构是char[]数组, 在这种方式下,每一个字符都将占用两个字节的空间。
- 在Java9之后 String,StringBuffer和StringBuilder的底层结构是byte[]数组
- coder的用法:
- 当检测到变量按照latin1或ISO进行标识时,会为其分配一个字节大小的空间;
- 当检测到变量按照utf-16进行标识时,会为其分配而两个字节大小的空间。
 
为什么同样底层是char[]数组,String不可变,StringBuffer可变
- 因为String的底层数组char[]使用final修饰的,new出来后就只能指向这个数组的地址,而char[]数组一旦new出来后,长度不能变
- StringBuffer的底层数组char[16],初始化长度16,没有用final修饰; 当长度不够时,会进行扩容,创建一个长度更大的的char[]数组,再使用System.arraycopy( )将内容复制到长度更长的数组中,这时StringBuffer转而指向这个数组的地址,而之前的对象会被gc回收.
怎么优化StringBuffer的性能
- 在创建StringBuffer时,最好给一个初始化容量
- 尽量减少StringBuffer的扩容次数
- 关键点: 给一个合适的的初始化容量
StringBuffer和StringBuilder的区别
- StringBuffer的方法都有用synchronized修饰,是线程安全的,速度较慢
- StringBuilder的方法都没有用synchronized修饰,是线程不安全的,速度较慢
    我成功因为我志在成功
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号