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