String,StringBuffer,StringBuilder有什麼區別呢?
大多數面試官會問道這樣的一道基礎面試題。
區別
- String是Java語言非常基礎也是非常重要的類,提供了構造器和和管理字符串的各種邏輯,它是典型的Immutable類(Immutable是Java的一種不可變類機制),所有的屬性都是不可變的(final關鍵字修飾)。也由於不可變性:類似拼接、裁剪等字符串操作都會產生新的String對象。所有效率低
- StringBuffer的出現正是爲了解決String產生的問題(產生新的String對象)而提供的一個類,我們可以利用append或者add方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer本質是一個線程安全的可修改的字符串序列,爲了保證線程安全,也帶來了額外的性能開銷。
- StringBuilder是Java1.5新增的,在能力上和StringBuffer沒有區別,但是去掉了線程安全的部分,減小了開銷。
名稱 | 可變性 | 安全 | 性能效率 |
---|---|---|---|
String | final 不可變 | 安全 | 字符串操作產生新的String對象,效率低 |
StringBuffer | 可變 | 安全 | 有額外的開銷維護線程安全,性能開銷相對大 |
StringBuilder | 可變 | 不安全 | 性能開銷小,效率高 |
其他
- 什麼是Immutable?
- Immutable不可變的。所以天生線程安全。由於不可變在拷貝的時候不需要額外的複製數據
- StringBuffer爲什麼線程安全
- StringBuffer通過把各種修改數據的方法都加上了synchronized關鍵字。
- StringBuffer和StringBuilder爲什麼可以修改字符串序列?
- StringBuffer和StringBuilder都繼承了AbstractStringBuilder(裏面包含了基本操作,區別是否加入synchronized)
- 底層都是利用可修改的數組(char,JDK9是byte),默認大小是字符串長度16