1.String的缺點
小編在前幾天的學習中遇到了一道簡單的java題目,也就是前面提到的大小寫的轉換。其中是字符串的大小寫轉換。其中涉及到了字符串的定義,關於字符串的操作,我們有以下幾個類,我們來說說他們各自的特點
String類:java中的字符串是屬於對象,java中使用String對字符串進行操作,需要注意的是,String操作的字符串的值是不可以進行改變的,即,固定值,所以每次對String的操作都會生成新的String對象,這樣會是的效率遍地,並且很佔存儲空間。
以下圖操作爲例
注:這個是我自己畫的草圖,還是俺上學時候的草稿信紙呢,上學時候買了太多竟然用到了現在。
我們能夠看到初始化String的值爲“hello”。然後後面加上新的字符串“world”,這個過程是需要重新在堆內存中創建空間的,最後“hello world”字符串也需要在堆內創建空間。就是我們平時所打印一盒hello world就需要進行三次內存空間的創建
正因爲 String對字符串的操作存在不可更改的特性,因此引入了StringBuffer和StringBuilder類,這倆種方法可以對堆上存儲的對象進行操作以及更改。
2.StringBuffer和StringBuilder方法
1)和String類不同的是:StringBuffer類和 StringBuilder類定義的對象能夠被多次修改,並且不產生新的未使用對象。
2)StringBuffer類和 StringBuilder類的區別是什麼呢?
區別主要是:StringBuffer類的方法是線程安全的,可以同步訪問,速度慢;StringBuilder類的方法不是線程安全的,不能同步訪問,速度快
3)那麼爲神馬StringBuffer類的方法是線程安全的呢?
一個StringBuffer對象在字符串緩衝區內部被多個線程使用,StringBuffer中方法帶有synchronized關鍵字,因此能夠保證線程是安全的。但StringBuilder的類,被定義的對象中的方法使用時則沒有synchronized關鍵字,因此不能保證線程安全,會出現一些錯誤的情況。
如果要進行的操作是多線程的,那麼請使用StringBuffer;如果是單線程的情況,建議使用速度比較快的StringBuilder。
4)那麼String、StringBuffer、StringBuilder的運行速度是什麼樣的呢?
StringBuilder > StringBuffer > String
String最慢原因:String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量。String對象一旦創建之後該對象是不可更改的,但StringBuilder和StringBuffer均爲字符串變量,是可以更改的。
對於StringBuilder和StringBuffer來說,他們的對象是變量,對變量進行操作就是直接對該對象進行更改,而不進行創建和回收的操作,所以速度要比String快很多。