由於String在Java專案中使用非常廣泛,為了解決重複建立String物件,引入字串常量池,當建立一個字串物件時,先在字串常量池中檢視(equals)是否存在相同值的字串物件,存在則直接引用,不存在則建立並加入到字串常量池。但是通過new方法建立的字串物件不檢查常量池,而是直接在堆區或棧區建立一個新的物件,也不會把物件放入池中。
String是不可變的,屬性由final修飾,一旦建立則不能改變。當一個字串在多執行緒共享,被頻繁訪問時,省去同步以及鎖等待的時間,提高效能。String物件拼接時,都會建立一個新的物件。
StringBuffer和StringBuilder物件值是可變的,並且改變後物件的引用不變。底層記憶體中儲存方式與String相同,都是有序的char位元組陣列。當一個物件被建立時,設定預設陣列大小,當隨著值越來越大,超過預設值,將建立一個新的陣列,並將原陣列的值複製到新陣列上,丟棄原陣列。 StringBuffer是執行緒安全,StringBuilder執行緒不安全。StringBuffer類中方法都由synchronized修飾,StringBuilder效能更優。