天天看點

java基礎—String

String,StringBuffer,StringBuilder的差別?

1.運作速度:

String最慢,因為String是字元串常量,String對象一旦建立之後是不可改變的。Java對String對象的操作實際上是不斷的建立新的對象并對舊對象回收的一個過程。是以速度會比較慢;

StringBuilder和StringBuffer都是字元串變量,對變量的操作就是直接對該對象進行修改,沒有建立和回收的操作,是以速度比String快

2.線程安全:

StringBuilder是線程不安全的,

StringBuffer是線程安全的,StringBuffer中很多方法都是Synchronized修飾的,是以它在被多個線程使用的時候,是可以保證線程安全的。

3.選擇使用哪一個

String适合少量字元串操作的情況

StringBuffer适合多線程在字元串緩沖區大量操作的情況

StringBuilder适合單線程在字元串緩沖區大量操作的情況

String如何設計成不可變的

Java中String類就是對字元數組的封裝,在JDK1.6中value是String封裝的數組,offset是數組的起始位置,count是String所占的字元個數。String類裡的所有變量都是private final修飾的,并且沒有對外界提供任何的set方法,也就說在String類的外部是無法修改String的,一旦初始化後就不能修改了。

String為什麼要設計成不可變

1.字元串常量池的需要:字元串常量池是java堆記憶體中的一個特殊的存儲區,當我們建立一個String對象的時候,它先去字元串常量池裡找,如果這個字元串存在于字元串常量池裡,那麼就不去建立新的對象,而是直接使用常量池裡的這個已經存在的對象。假如String是可變的,那麼我們改變一個對象,就會影響另一個獨立對象,導緻邏輯錯誤。這種字元串常量池的思想是一種優化手段

2.允許String對象緩存hashCode:Java中String對象的hash碼被頻繁的使用,比如在hashmap容器裡,字元串不能改變就保證了hashcode的唯一性,這樣就可以放心進行緩存,這也是一種優化手段,不需要每次都去計算hash值

3.從安全性考慮:String是很多Java類的參數,不如網絡連接配接位址URL,檔案路徑path,反射機制需要的String參數等等,如果String不是固定不變的,就會引起安全隐患。

檢測字元串是否相等

string.equals(s):==隻能判斷兩個字元串是否在同一個位置上,當然放在同一個位置上的字元串必然是相等的,但是還有一種可能是多個字元串拷貝放置在不同的位置上。隻有字元串常量是共享的,而"+"或者substring産生的字元串并不共享。