
文章插圖
String對(duì)象String對(duì)象是java中重要的數(shù)據(jù)類(lèi)型,在大部分情況下我們都會(huì)用到String對(duì)象 。其實(shí)在Java語(yǔ)言中,其設(shè)計(jì)者也對(duì)String做了大量的優(yōu)化工作,這些也是String對(duì)象的特點(diǎn),它們就是:不變性,常量池優(yōu)化和String類(lèi)的final定義 。1.1 不變性String對(duì)象的狀態(tài)在其被創(chuàng)建之后就不在發(fā)生變化 。為什么說(shuō)這點(diǎn)也是Java設(shè)計(jì)者所做的優(yōu)化,在java模式中,有一種模式叫不變模式,了解的童鞋也應(yīng)該知道不變模式的作用:在一個(gè)對(duì)象被多線(xiàn)程共享,而且被頻繁的訪(fǎng)問(wèn)時(shí),可以省略同步和鎖的時(shí)間,從而提高性能 。而String的不變性,可泛化為不變模式 。1.2 常量池優(yōu)化常量池優(yōu)化指的是什么呢?那就是當(dāng)兩個(gè)String對(duì)象擁有同一個(gè)值的時(shí)候,他們都只是引用了常量池中的同一個(gè)拷貝 。所以當(dāng)程序中某個(gè)字符串頻繁出現(xiàn)時(shí),這個(gè)優(yōu)化技術(shù)就可以節(jié)省大幅度的內(nèi)存空間了 。例如:
以上代碼中,s1和s2引用的是相同的地址,故而第四行打印出的結(jié)果是true;而s3雖然只與s1,s2相等,但是s3時(shí)通過(guò)new String(“123”)創(chuàng)建的,重新開(kāi)辟了內(nèi)存空間,因引用的地址不同,所以第5行打印出false;intern方法返回的是String對(duì)象在常亮池中的引用,所以最后一行打印出true 。
1.3 final的定義String類(lèi)以final進(jìn)行了修飾,在系統(tǒng)中就不可能有String的子類(lèi),這一點(diǎn)也是出于對(duì)系統(tǒng)安全性的考慮 。字符串操作中的常見(jiàn)優(yōu)化方法
2.1 split()方法優(yōu)化通常情況下,split()方法帶給我們很大的方便,但是其性能不是很好 。建議結(jié)合使用indexOf()和subString()方法進(jìn)行自定義拆分,這樣性能會(huì)有顯著的提高 。
2.2 String常量的累加操作優(yōu)化方法示例代碼:
結(jié)果:
上例所示,使用+號(hào)拼接字符串,其效率明顯較低,而使用StringBuffer和StringBuilder的append()方法進(jìn)行拼接,效率是使用+號(hào)拼接方式的百倍甚至千倍,而StringBuffer的效率比StringBuilder低些,這是由于StringBuffer實(shí)現(xiàn)了線(xiàn)程安全,效率較低也是不可避免的 。所以在字符串的累加操作中,建議結(jié)合線(xiàn)程問(wèn)題選擇,應(yīng)避免使用+號(hào)拼接字符串 。
2.3 StringBuffer和StringBuilder的選擇上例中也使用過(guò)StringBuffer和StringBuilder了,兩者只有線(xiàn)程安全方面的差別,所以呢,在無(wú)需考慮線(xiàn)程安全的情況下,建議使用性能相對(duì)較高的StringBuilder類(lèi),若系統(tǒng)要求線(xiàn)程安全,就選擇StringBuffer類(lèi) 。
2.4 基本數(shù)據(jù)類(lèi)型轉(zhuǎn)化為String類(lèi)型的優(yōu)化方案
示例代碼:
以上示例中,String.valueOf()直接調(diào)用了底層的Integer.toString()方法,不過(guò)其中會(huì)先判空;+””由StringBuilder實(shí)現(xiàn),先調(diào)用了append()方法,然后調(diào)用了toString()方法獲取字符串;num.toString()直接調(diào)用了Integer.toString()方法,所以效率是:num.toString()方法最快,其次是String.valueOf(num),最后是num+””的方式 。以下是結(jié)果截圖:
建議童鞋們避免使用+””的方式轉(zhuǎn)換,最好是使用基本數(shù)據(jù)類(lèi)型自帶的toString()方法轉(zhuǎn)換 。就先分享到這兒吧!!!
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 登山基本常識(shí) 登山注意事項(xiàng)
- oracle數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí) oracle數(shù)據(jù)庫(kù)類(lèi)型的文件
- 數(shù)據(jù)分析師培訓(xùn)機(jī)構(gòu)推薦 網(wǎng)站數(shù)據(jù)分析課程報(bào)告
- java filter函數(shù)的用法 object轉(zhuǎn)long問(wèn)題
- 今天是父親節(jié),我們用大數(shù)據(jù)來(lái)聊聊真實(shí)的爸爸 父親節(jié)是哪天
- 如何將舊iPhone數(shù)據(jù)轉(zhuǎn)移過(guò)來(lái)? 兩臺(tái)蘋(píng)果手機(jī)靠近遷移
- 人工智能新技術(shù)概念 人工智能與大數(shù)據(jù)區(qū)別和聯(lián)系
- 恐怖數(shù)據(jù)來(lái)襲 美元兌人民幣仍具備上行空間 美元兌人民幣
- 圖文講解 教你怎么看自己電腦的配置和硬件的型號(hào) 怎么查電腦的型號(hào)和基本信息
- Excel如何快速查找標(biāo)記多行多列數(shù)據(jù)中的重復(fù)值 表格查重復(fù)怎么查
