Java有哪些操作字符串的類(lèi)?區(qū)別在哪?
操作字符串的類(lèi)都有哪些?區(qū)別是什么?
操作字符串的類(lèi)主要用三個(gè),分別是String類(lèi),StringBuffer類(lèi)和StringBuilder類(lèi).
不可變字符串
String類(lèi)
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.當(dāng)使用=
對(duì)String類(lèi)初始化的時(shí)候,會(huì)在常量池創(chuàng)建對(duì)象,將引用s1指向常量池中的地址.
2.創(chuàng)建s2的時(shí)候,會(huì)先在常量池中檢查是否有"abc"
的對(duì)象,如果有則直接將s2指向常量池中的"abc"
.所以s1和s2指向的是相同的對(duì)象.
3.使用new
關(guān)鍵字創(chuàng)建String對(duì)象的時(shí)候,會(huì)在堆空間中開(kāi)辟一塊內(nèi)存,然后在堆中對(duì)s3進(jìn)行初始化,s3指向的是堆內(nèi)存空間中的一塊區(qū)域.
4.當(dāng)我們對(duì)s2進(jìn)行修改的時(shí)候,其實(shí)是在常量池中添加了新的對(duì)象"abcdef"
,此時(shí)我們創(chuàng)建新的對(duì)象s4會(huì)和創(chuàng)建s2的步驟相同.s4在常量池中找到了"abcdef"
,所以直接指向這個(gè)對(duì)象.
當(dāng)我們對(duì)String類(lèi)型的變量進(jìn)行操作的時(shí)候,其實(shí)每次改變都是創(chuàng)建除了新的對(duì)象.
可變字符串
StringBuffer和StringBuilder類(lèi)中都提供了增刪字符串的方法,下面展示一個(gè)在原始對(duì)象上增加新的字符的示例.
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 } }
通過(guò)這個(gè)例子我們能清晰看到,s1和s2在增加元素前后仍舊是同一個(gè)對(duì)象.
StringBuffer和StringBuilder都繼承了AbstractStringBuilder
類(lèi).
StringBuffer類(lèi)
和StringBuilder類(lèi)對(duì)比發(fā)現(xiàn),StringBuffer類(lèi)中的方法沒(méi)有使用synchronized
關(guān)鍵字進(jìn)行修飾.
@Override public StringBuilder append(String str) { super.append(str); return this; }
StringBuilder類(lèi)
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; }
AbstractStringBuilder類(lèi)的append方法
擴(kuò)容方法:調(diào)用ensureCapacityInternal()方法檢查初始char[] value
空間是否足夠,如果不夠的話,就進(jìn)行擴(kuò)容操作.
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 // 如果空間不夠就重新開(kāi)辟一塊新的空間 if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); } }
copyOf方法:重新創(chuàng)建一個(gè)新的char數(shù)組然后將原數(shù)組數(shù)據(jù)拷貝到新數(shù)組去.
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; }
小結(jié)
Java操作字符串的類(lèi)主要有三個(gè),分別是String類(lèi),StringBuffer類(lèi)和StringBuilder類(lèi).這三個(gè)類(lèi)的底層都是以char[]
形式保存字符串對(duì)象的.他們之間的區(qū)別主要體現(xiàn)在:
1.String類(lèi)型進(jìn)行修改操作之后相當(dāng)于重新創(chuàng)建對(duì)象,StringBuffer和StringBuilder進(jìn)行增刪操作都是針對(duì)同一個(gè)對(duì)象.
2.StringBuffer中的大部分方法都沒(méi)有使用synchronized關(guān)鍵字修飾,所以性能更高(我刷題的時(shí)候也都是寫(xiě)這個(gè)).單線程情況下首選使用StringBuffer類(lèi),多線程環(huán)境下需要使用StringBuilder類(lèi)保證線程安全.
3.如果字符串聲明之后不需要進(jìn)行改動(dòng),則直接聲明String類(lèi)是最好的選擇,不使用new關(guān)鍵字聲明String對(duì)象時(shí),它不會(huì)再堆內(nèi)存中開(kāi)辟空間,而是直接指向String常量池.這樣可以實(shí)現(xiàn)復(fù)用,降低資源消耗.
擴(kuò)展閱讀
Java基礎(chǔ)系列第一彈之方法重載和方法重寫(xiě)的區(qū)別
Java基礎(chǔ)系列第二彈之Java多態(tài)成員訪問(wèn)的特點(diǎn)
到此這篇關(guān)于Java有哪些操作字符串的類(lèi)?區(qū)別在哪?的文章就介紹到這了,更多相關(guān)Java操作字符串的類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Hibernate三種狀態(tài)和Session常用的方法
本文主要介紹了Hibernate三種狀態(tài)和Session常用的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03解決SpringBoot整合MybatisPlus分模塊管理遇到的bug
這篇文章主要介紹了解決SpringBoot整合MybatisPlus分模塊管理遇到的bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringCloud實(shí)現(xiàn)全鏈路灰度發(fā)布的示例詳解
灰度發(fā)布是指在軟件或服務(wù)發(fā)布過(guò)程中,將新版本的功能或服務(wù)以較小的比例引入到生產(chǎn)環(huán)境中,僅向部分用戶或節(jié)點(diǎn)提供新功能的一種發(fā)布策略,下面我們就來(lái)學(xué)習(xí)一下SpringCloud如何實(shí)現(xiàn)全鏈路灰度發(fā)布2023-11-11springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐
在系統(tǒng)業(yè)務(wù)中,需要想客戶發(fā)送手機(jī)驗(yàn)證碼,進(jìn)行驗(yàn)證后,才能提交,本文主要介紹了springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法示例
這篇文章主要給大家介紹了關(guān)于Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解
這篇文章主要介紹了SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08