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