Java有哪些操作字符串的類?區別在哪?
操作字符串的類都有哪些?區別是什麼?
操作字符串的類主要用三個,分別是String類,StringBuffer類和StringBuilder類.
不可變字符串
String類
public class StringTest { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System.out.println(s1 == s2); // true System.out.println(s2 == s3); // false s2 = "abc" + "def"; System.out.println(s1 == s2); // false String s4 = "abcdef"; System.out.println(s4 == s2); // true } }
1.當使用=
對String類初始化的時候,會在常量池創建對象,將引用s1指向常量池中的地址.
2.創建s2的時候,會先在常量池中檢查是否有"abc"
的對象,如果有則直接將s2指向常量池中的"abc"
.所以s1和s2指向的是相同的對象.
3.使用new
關鍵字創建String對象的時候,會在堆空間中開辟一塊內存,然後在堆中對s3進行初始化,s3指向的是堆內存空間中的一塊區域.
4.當我們對s2進行修改的時候,其實是在常量池中添加瞭新的對象"abcdef"
,此時我們創建新的對象s4會和創建s2的步驟相同.s4在常量池中找到瞭"abcdef"
,所以直接指向這個對象.
當我們對String類型的變量進行操作的時候,其實每次改變都是創建除瞭新的對象.
可變字符串
StringBuffer和StringBuilder類中都提供瞭增刪字符串的方法,下面展示一個在原始對象上增加新的字符的示例.
public class StringTest2 { public static void main(String[] args) { StringBuffer sb1 = new StringBuffer("abc"); StringBuilder sb2 = new StringBuilder("abc"); System.out.println(sb1.hashCode()); // 460141958 System.out.println(sb2.hashCode()); // 1163157884 sb1.append("def"); sb2.append("def"); System.out.println(sb1.hashCode()); // 460141958 System.out.println(sb2.hashCode()); // 1163157884 } }
通過這個例子我們能清晰看到,s1和s2在增加元素前後仍舊是同一個對象.
StringBuffer和StringBuilder都繼承瞭AbstractStringBuilder
類.
StringBuffer類
和StringBuilder類對比發現,StringBuffer類中的方法沒有使用synchronized
關鍵字進行修飾.
@Override public StringBuilder append(String str) { super.append(str); return this; }
StringBuilder類
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; }
AbstractStringBuilder類的append方法
擴容方法:調用ensureCapacityInternal()方法檢查初始char[] value
空間是否足夠,如果不夠的話,就進行擴容操作.
public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); // 查看空間是否足夠 ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; }
private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code // 如果空間不夠就重新開辟一塊新的空間 if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); } }
copyOf方法:重新創建一個新的char數組然後將原數組數據拷貝到新數組去.
public static char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
小結
Java操作字符串的類主要有三個,分別是String類,StringBuffer類和StringBuilder類.這三個類的底層都是以char[]
形式保存字符串對象的.他們之間的區別主要體現在:
1.String類型進行修改操作之後相當於重新創建對象,StringBuffer和StringBuilder進行增刪操作都是針對同一個對象.
2.StringBuffer中的大部分方法都沒有使用synchronized關鍵字修飾,所以性能更高(我刷題的時候也都是寫這個).單線程情況下首選使用StringBuffer類,多線程環境下需要使用StringBuilder類保證線程安全.
3.如果字符串聲明之後不需要進行改動,則直接聲明String類是最好的選擇,不使用new關鍵字聲明String對象時,它不會再堆內存中開辟空間,而是直接指向String常量池.這樣可以實現復用,降低資源消耗.
擴展閱讀
Java基礎系列第一彈之方法重載和方法重寫的區別
Java基礎系列第二彈之Java多態成員訪問的特點
到此這篇關於Java有哪些操作字符串的類?區別在哪?的文章就介紹到這瞭,更多相關Java操作字符串的類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java字符串拼接的五種方法及性能比較分析(從執行100次到90萬次)
- Java面試題沖刺第一天–基礎篇1
- 簡單聊聊C#字符串構建利器StringBuilder
- 詳解Java中String,StringBuffer和StringBuilder的使用
- java中String、StringBuffer與StringBuilder的區別