摘要:在中,是不可變類型,所以對(duì)于字符串的操作提供了兩個(gè)輔助類和。考慮如下代碼在利用直接進(jìn)行拼接時(shí),每次循環(huán)都會(huì)生成一個(gè)新的對(duì)象,也就是說(shuō)等同這樣運(yùn)行的效率明顯是低于顯式調(diào)用的。
在Java中,String是不可變類型,所以對(duì)于字符串的操作提供了兩個(gè)輔助類:StringBuffer和StringBuilder。
這個(gè)兩個(gè)類的主要區(qū)別在于:
StringBuilder的效率更高
StringBuffer是線程安全的,而StringBuilder不是
不過(guò),需要注意的是,在利用+對(duì)String對(duì)象直接進(jìn)行拼接的時(shí)候,Java內(nèi)部其實(shí)還是用StringBuilder來(lái)實(shí)現(xiàn)的,但是和顯式地調(diào)用StringBuilder略有區(qū)別。
考慮如下代碼:
javaString[] strings = new String[]{"one", "two", "three", "four", "five"}; String resultStr = ""; StringBuilder resultBuilder = new StringBuilder(); for (int i = 0; i < strings.length; i++) { resultStr += strings[i]; } for (int i = 0; i < strings.length; i++) { resultBuilder.append(strings[i]); }
在利用+直接進(jìn)行拼接時(shí),每次循環(huán)都會(huì)生成一個(gè)新的StringBuilder對(duì)象,也就是說(shuō)等同:
javaStringBuilder stringBuilder = new StringBuilder(resultStr); stringBuilder.append(strings[i]); resultStr = stringBuilder.toString();
這樣運(yùn)行的效率明顯是低于顯式調(diào)用StringBuilder的。
但是在有一種情況下,利用+拼接的速度會(huì)遠(yuǎn)遠(yuǎn)快于用StringBuilder或者StringBuffer,考慮如下代碼:
javaString str = "one" + "two" + "three"; StringBuilder strBuilder = new StringBuilder().append("one").append("two").append("three");
在這種情況下,JVM會(huì)直接把String str = "one" + "two" + "three";理解為String str = "onetwothree”;,也就說(shuō)不需要像通常情況下生成StringBuilder對(duì)象然后再拼接,速度自然快很多。不過(guò)需要強(qiáng)調(diào)的一點(diǎn)是,當(dāng)然字符串來(lái)自其他對(duì)象的時(shí)候,JVM不會(huì)做這種特殊處理,也就說(shuō)如下代碼:
javaString one = "one"; String two = "two"; String three = "three"; String str = one + two + three;
效率仍然是非常低的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64293.html
摘要:當(dāng)然大多數(shù)情況下就是我們是在單線程下進(jìn)行的操作,所以大多數(shù)情況下是建議用而不用的,就是速度的原因。 第三階段 JAVA常見(jiàn)對(duì)象的學(xué)習(xí) StringBuffer和StringBuilder類 (一) StringBuffer類的概述 (1) 基本概述 下文以StringBuffer為例 前面我們用字符串做拼接,比較耗時(shí)并且也耗內(nèi)存(每次都會(huì)構(gòu)造一個(gè)新的string對(duì)象),而這種拼接操作又...
摘要:測(cè)試拼接速度測(cè)試的結(jié)果在循環(huán)中,拼接字符串的速度遠(yuǎn)低于和利用查看字節(jié)碼文件,尋找其中的差異命令行執(zhí)行結(jié)果可以看出,拼接的時(shí)候也是通過(guò)的方法進(jìn)行拼接的產(chǎn)生差異的原因是,在每次循環(huán)中,拼接的時(shí)候都了一個(gè)是線程安全的,只比稍慢了一點(diǎn)若不是 String、StringBuilder、StringBuffer 測(cè)試拼接速度 @Test public void testString() { ...
摘要:不指定容量會(huì)顯著降低性能一般使用在方法內(nèi)部來(lái)完成類似功能,因?yàn)槭蔷€程不安全的,所以用完以后可以丟棄。主要用在全局變量中相同情況下使用相比使用僅能獲得左右的性能提升,但卻要冒多線程不安全的風(fēng)險(xiǎn)。 String 作為最基礎(chǔ)的引用數(shù)據(jù)類型,日常的開(kāi)發(fā)中被大量的使用?;诓豢勺兊奶匦裕坏┍贿^(guò)度地使用,堆內(nèi)存就會(huì)負(fù)荷不堪,甚至影響性能,為此,Java 設(shè)計(jì)者特意為 String 在方法區(qū)中開(kāi)辟...
摘要:如果對(duì)于經(jīng)常改變內(nèi)容的字符串,使用效率高,但是它只適用于單線程的場(chǎng)景,在多線程場(chǎng)景下,容易導(dǎo)致數(shù)據(jù)不一致的現(xiàn)象出現(xiàn)。多線程場(chǎng)景下,要使用。在大部分情況下,線程安全的可變字符序列??蓪⒆址彌_區(qū)安全地用于多個(gè)線程。 本人博客 http://www.cnblogs.com/runfor... 總結(jié): 1.String是字符串常量,StringBuffer是線程安全的字符串變量,Stri...
摘要:是可以序列化的標(biāo)志。構(gòu)造器可以看出,默認(rèn)的容量大小為。不過(guò)這個(gè)構(gòu)造器是具有包訪問(wèn)權(quán)限,一般情況下是不能調(diào)用的。總結(jié)和都是可變字符串,前者線程不安全,后者線程安全。和的大部分方法均調(diào)用父類的實(shí)現(xiàn)。其擴(kuò)容機(jī)制首先是把容量變?yōu)樵瓉?lái)容量的倍加。 簡(jiǎn)介 StringBuilder與StringBuffer是兩個(gè)常用的操作字符串的類。大家都知道,StringBuilder是線程不安全的,而Stri...
摘要:所以如果要進(jìn)行的操作是多線程的,那么就要使用,但是在單線程的情況下,還是建議使用速度比較快的。總結(jié)一下適用于少量的字符串操作的情況適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況 [TOC] 原文鏈接:[https://www.cnblogs.com/su-fe...]: 這三個(gè)類之間的區(qū)別主要是在兩個(gè)方面,即運(yùn)行速度和線程安全這兩方面 1、首先說(shuō)...
閱讀 663·2021-11-22 14:45
閱讀 3165·2021-10-15 09:41
閱讀 1717·2021-10-11 10:58
閱讀 2865·2021-09-04 16:45
閱讀 2684·2021-09-03 10:45
閱讀 3303·2019-08-30 15:53
閱讀 1276·2019-08-29 12:28
閱讀 2210·2019-08-29 12:14