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