String类、StringBuffer类、StringBuilder类的区别
String是Java中基礎且重要的類,并且String也是Immutable類的典型實現,被聲明為final class,除了hash這個屬性其它屬性都聲明為final,因為它的不可變性,所以例如拼接字符串時候會產生很多無用的中間對象,如果頻繁的進行這樣的操作對性能有所影響。
StringBuffer就是為了解決大量拼接字符串時產生很多中間對象問題而提供的一個類,提供append和add方法,可以將字符串添加到已有序列的末尾或指定位置,它的本質是一個線程安全的可修改的字符序列,把所有修改數據的方法都加上了synchronized。但是保證了線程安全是需要性能的代價的。
在很多情況下我們的字符串拼接操作不需要線程安全,這時候StringBuilder登場了,StringBuilder是JDK1.5發布的,它和StringBuffer本質上沒什么區別,就是去掉了保證線程安全的那部分,減少了開銷。
StringBuffer 和 StringBuilder 二者都繼承了 AbstractStringBuilder ,底層都是利用可修改的char數組(JDK 9 以后是 byte數組)。
所以如果我們有大量的字符串拼接,如果能預知大小的話最好在new StringBuffer 或者StringBuilder 的時候設置好capacity,避免多次擴容的開銷。擴容要拋棄原有數組,還要進行數組拷貝創建新的數組
String是一個不可變的字符序列,字符串常量
StringBuffer是一個可變的字符序列 ,字符串變量(線程安全)
StringBuilder 是一個可變的字符序列 ,字符串變量(非線程安全)
String對象值的修改都是重新創建一個新的對象,然后把新的值保存進去
StringBuffer類對象,每次返回的都是原對象,可以通過append()方法來修改值
String對象底層重寫了hascode和equals
StringBuffer對象底層未重寫了hascode和equals
StringBuffer性能比String高
StringBuffer是線程安全的
無參構造方法,Sting為空字符初始容量為0,StringBuffer初始容量為16
StringBuffer和StringBuilder的區別
StringBuffer 線程安全 同步的 速度慢
StringBuilder 線程不安全 非同步的 速度快
在java中有4個類來負責字符的操作。
- 1.Character 是進行單個字符操作的,
- 2.String 對一串字符進行操作,不可變類。
- 3.StringBuffer 對一串字符操作,可變類
- 4.StringBuilder 對一串字符操作,可變類
1.可變與不可變
String類中使用字符數組保存字符串,如下就是,因為有“final”修飾符,所以可以知道string對象是不可變的。private final char value[];我的理解:String對象不可變:比如 String aa = new String("hello"); //新建一個String對象,指向一個地址,地址上的值是"hello"; aa = "world";//新取一段地址空間(不是原來的),值是"world",aa指向這個新的地址aa += "!";//新取一段地址空間(不是原來的),值是"world!",aa指向這個新的地址//所以說String值每修改一次,內存里就會新建一個字符串,String對象指向的地址也會發生改變StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,如下就是,可知這兩種對象都是可變的。 char[] value;總結
以上是生活随笔為你收集整理的String类、StringBuffer类、StringBuilder类的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git下载安装、验证、企业实战单机、多人
- 下一篇: gblfy大数据技术之安装CentOS系