java有什么字符串_Java 中操作字符串都有哪些类?它们之间有什么区别
1. String、StringBuffer、StringBuilder
原文出自《編寫高質量代碼:改善 Java 程序的 151 個建議》
CharSequence 接口有三個實現類與字符串有關:String、StringBuffer、StringBuilder,雖然它們都與字符串有關,但是其處理機制是不同的。
String 類是不可改變的量,也就是創建后就不能再修改了,比如創建了一個“abc”這樣的字符串對象,那么它在內存中永遠都會是“abc”這樣具有固定表面值的一個對象,不能被修改,即使想通過 String 提供的方法來嘗試修改,也是要么創建一個新的字符串對象,要么返回自己,比如:
String str = "abc";
String str1 = str.substring(1);
StringBuffer 是一個可變字符序列,它與 String 一樣,在內存中保存的都是一個有序的字符序列(char 類型的數組),不同點是 StringBuffer 對象的值是可改變的,例如:
StringBuffer sb = new StringBuffer("a");
sb.append("b");
從上面的代碼可以看出 sb 的值在改變,初始化的時候是“a”,經過 append 方法后,其值變成了“ab”。可能有讀者會問了,這與 String 類通過“+”連接有什么區別?例如:
String s = "a";
s = s + "b";
有區別,字符串變量 s 初始化時是“a”對象的引用,經過加號計算后,s 變量就修改為了“ab”的引用,但是初始化的“a”對象還是沒有改變,只是變量 s 指向了新的引用地址。再看看 StringBuffer 的對象,它的引用地址雖不變,但值在改變。
StringBuilder 與 StringBuffer 基本相同,都是可變字符序列,不同點是:StringBuffer 是線程安全的,StringBuilder 是線程不安全的,翻翻兩者的源代碼,就會發現在 StringBuffer 的方法前都有 synchronized 關鍵字,這也是 StringBuffer 在性能上遠低于 StringBuilder 的原因。
在性能方面,由于 String 類的操作都是產生新的 String 對象,而 StringBuilder 和 StringBuffer 只是一個字符數組的再擴容而已,所以 String 類的操作要遠慢于 StringBuffer 和 StringBuilder。
弄清楚了三者的原理,我們就可以在不同的場景下使用不同的字符序列了:
(1)使用 String 類的場景
在字符串不經常變化的場景中可以使用 String 類,例如常量的聲明、少量的變量運算等。
(2)使用 StringBuffer 類的場景
在頻繁進行字符串的運算(如拼接、替換、刪除等),并且運行在多線程的環境中,則可以考慮使用 StringBuffer,例如 XML 解析、HTTP 參數解析和封裝等。
(3)使用 StringBuilder 類的場景
在頻繁進行字符串的運算(如拼接、替換、刪除等),并且運行在單線程的環境中,則可以考慮使用 StringBuilder,如 SQL 語句的拼裝、JSON 封裝等。
2?String,StringBuffer, StringBuilder 的區別是什么
總結
以上是生活随笔為你收集整理的java有什么字符串_Java 中操作字符串都有哪些类?它们之间有什么区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java面向对象编程篇5——枚举
- 下一篇: java中pagex_Java/5_ge