[轉載] Java StringBuilder StringJoiner

參考鏈接: 何時在StringBuilder上使用StringJoiner

1. StringBuilder?

Java編譯器對String做了特殊處理,使得我們可以直接用+拼接字符串。?

雖然可以直接拼接字符串,但是,在循環中,每次循環都會創建新的字符串對象,然后扔掉舊的字符串。這樣,絕大部分字符串都是臨時對象,不但浪費內存,還會影響GC效率。?

為了能高效拼接字符串,Java標準庫提供了StringBuilder,它是一個可變對象,可以預分配緩沖區,這樣,往StringBuilder中新增字符時,不會創建新的臨時對象。?

package com.learn.string;

?

//StringBuilder相關

?

public class Test {

? ? public static void main(String[] args) {

?

? ? ? ? /**

? ? ? ? ?* Java編譯器對String做了特殊處理,使得我們可以直接用+拼接字符串。

? ? ? ? ?* 雖然可以直接拼接字符串,但是,在循環中,每次循環都會創建新的字符串對象,然后扔掉舊的字符串。

? ? ? ? ?* 這樣,絕大部分字符串都是臨時對象,不但浪費內存,還會影響GC效率。

? ? ? ? ?* 為了能高效拼接字符串,Java標準庫提供了StringBuilder,它是一個可變對象,可以預分配緩沖區,

? ? ? ? ?* 這樣,往StringBuilder中新增字符時,不會創建新的臨時對象

? ? ? ? ?*/

? ? ? ? String s="";

? ? ? ? for(int i=0; i<100; i++){

? ? ? ? ? ? s=s+","+i;

? ? ? ? }

? ? ? ? System.out.println(s.substring(1));

?

? ? ? ? StringBuilder stringBuilder=new StringBuilder(1024);

? ? ? ? for(int i=0;i<100;i++){

? ? ? ? ? ? stringBuilder.append(",");

? ? ? ? ? ? stringBuilder.append(i);

? ? ? ? }

? ? ? ? System.out.println(stringBuilder.substring(1));

? ? ? ? s=stringBuilder.toString();

? ? ? ? System.out.println(s.substring(1));

?

? ? ? ? /**

? ? ? ? ?* StringBuilder還可以進行鏈式操作

? ? ? ? ?* 查看StringBuilder的源碼,可以發現,進行鏈式操作的關鍵是,

? ? ? ? ?* 定義的append()方法會返回this,這樣,就可以不斷調用自身的其他方法。

? ? ? ? ?*/

? ? ? ? StringBuilder stringBuilder2=new StringBuilder(1024);

? ? ? ? stringBuilder2.append("xiao").append("ming").append("!").insert(0,"haha,");

? ? ? ? System.out.println(stringBuilder2);

? ? ? ? //haha,xiaoming!

? ? }

}

?

仿照StringBuilder,設計一支持鏈式操作的類。例如,一個可以不斷增加的計數器:?

package com.learn.string;

?

//設計一個支持鏈式操作的類

?

class Adder{

?

? ? private int sum=0;

?

? ? public Adder add(int n){

? ? ? ? sum+=n;

? ? ? ? return this;

? ? }

?

? ? public Adder inc(){

? ? ? ? sum+=1;

? ? ? ? return this;

? ? }

?

? ? public int value(){

? ? ? ? return sum;

? ? }

}

?

public class Test2 {

?

? ? public static void main(String[] args) {

? ? ? ? Adder adder=new Adder();

? ? ? ? adder.add(2).add(3).inc().add(60);

? ? ? ? System.out.println(adder.value());

? ? ? ? //66? ? ? ??

? ? }

? ??

}

?

注意:對于普通的字符串+操作,并不需要我們將其改寫為StringBuilder,因為Java編譯器在編譯時就自動把多個連續的+操作編碼為StringConcatFactory的操作。在運行期,StringConcatFactory會自動把字符串連接操作優化為數組復制或者StringBuilder操作。?

2. StringJoiner?

package com.learn.string;

?

import java.util.StringJoiner;

?

public class Test3 {

?

? ? public static void main(String[] args) {

? ? ? ? String[] names={"aaa","bbb","ccc"};

? ? ? ? /**

? ? ? ? ?* 類似用分隔符拼接數組的需求很常見,所以Java標準庫還提供了一個StringJoiner來干這個事

? ? ? ? ?* 可以給StringJoiner指定“開頭”和“結尾”

? ? ? ? ?*/

? ? ? ? StringJoiner sj=new StringJoiner(", ","Hello ","!");

? ? ? ? for(String name:names){

? ? ? ? ? ? sj.add(name);

? ? ? ? }

? ? ? ? System.out.println(sj.toString());

? ? ? ? //Hello aaa, bbb, ccc!

?

? ? ? ? //在不需要指定“開頭”和“結尾”的時候,用String.join()更方便

? ? ? ? String s=String.join(", ",names);

? ? ? ? System.out.println(s);

? ? ? ? //aaa, bbb, ccc

? ? }

}

?

StringJoiner內部是如何拼接字符串的呢?查看源碼,可以發現,StringJoiner內部實際上就是使用了StringBuilder,所以拼接效率和StringBuilder幾乎是一模一樣的。?

String還提供了一個靜態方法join(),這個方法在內部使用了StringJoiner來拼接字符串,在不需要指定“開頭”和“結尾”的時候,用String.join()更方便?

注:?

1.用指定分隔符拼接字符串數組時,使用StringJoiner或者String.join()更方便;?

用StringJoiner拼接字符串時,還可以額外附加一個“開頭”和“結尾”。?

2.StringBuffer,是Java早期的一個StringBuilder的線程安全版本,它通過同步來保證多個線程操作StringBuffer也是安全的,但是同步會帶來執行速度的下降。?

3.StringBuilder是可變對象,用來高效拼接字符串;?

StringBuilder可以支持鏈式操作,實現鏈式操作的關鍵是返回實例本身。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540160.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540160.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540160.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EMC VMAX的磁盤構成,fast policy(重要)

首先是流程&#xff0c; 不同種類的磁盤&#xff08;sata&#xff0c;fc&#xff0c;flah&#xff09;->disk group->raid->DATA volume->thin pool->TDEV and BCVDEV (lun) 然后細看&#xff1a; 1&#xff09; 不同種類的磁盤叫做disk&#xff0c;這是可見的物…

[轉載] Java反射是什么?看這篇絕對會了!

參考鏈接&#xff1a; Java中的util.Arrays與Reflection.Array的示例 作者&#xff1a;火星十一郎 https://www.cnblogs.com/hxsyl 一.概念 反射就是把Java的各種成分映射成相應的Java類。 Class類的構造方法是private&#xff0c;由JVM創建。 反射是java語言的一個特性…

[精講-3]Offline Domain Join

從windows 2008 ,windows 7開始起就具備脫機加入域的功能,就是它們在未連接DC的情況下,也可以加入域. 假如環境lab.com ,一臺已加入域的PC (WIN7Client) 和即將加入域的PC(win7-2) 在win7client上run下面這個命令 DC已作了一次預先的動作:創建了computer object 在win7-2上,用本…

[轉載] Java——toArray,集合轉換為數組

參考鏈接&#xff1a; 從ArrayList到Java的Array數組轉換&#xff1a;toArray()方法 package day04; import java.util.ArrayList; import java.util.Collection; /** * 集合轉換為數組 * Collection中定義了兩個方法 * Object[] toArray * <T>Y[] toArray(T[] array) …

c#匿名方法

//以下示例和說明都源于《visual c# 2005 技術內幕》 //匿名函數就是沒有名字的函數&#xff0c;是專用于委托的函數。 using System; using System.Collections.Generic; using System.Text; namespace 匿名方法 { public delegate void DelegateClass(); public dele…

[轉載] JAVA8 創建流的5種方式

參考鏈接&#xff1a; 用Java創建流的10種方法 java8中的流式操作是一個很重要的內容 1、通過 stream 方法把 List 或數組轉換為流&#xff0c;如Arr.stream()&#xff1b; //通過stream方法把List或數組轉換為流 Arrays.asList("a1", "a2", "a3&…

用戶反饋:對 Rafy 開發框架的一些個人建議

對Rafy開發框架的一些個人建議 1、潛在使用群體分析 個人認為使用類似Rafy、AgileEAS.NET、PDF.NET及OpenWorks框架的群體主要為以下幾種&#xff1a; 1.1、小微軟件企業 小微軟件企業&#xff0c;這類軟件公司的開發人員一般在10人以下&#xff0c;多以項目實施為主基本談不上…

[轉載] Java8新特新--Stream語法應用在ArrayList的元素移除和排序

參考鏈接&#xff1a; 如何在Java 8中打印Stream的元素 單元測試&#xff1a; Test public void Test02(){ // 源 ArrayList<Integer> IdsSour new ArrayList<>(); IdsSour.add(5); IdsSour.add(1); IdsSour.add(3); IdsSour.add(2); IdsSour.add(6); IdsSour.a…

搭建iscsi存儲系統

搭建iscsi存儲系統 NAS和SAN服務器概述 NAS網絡附屬存儲&#xff1a; NAS&#xff08;Network Attached Storage)&#xff0c;NAS服務器是連接在網絡上&#xff0c;具備資料存儲功能的服務器&#xff0c;一種與用數據存儲服務器。網絡附屬存儲基于標準網絡協議&#xff08;Tcp/…

[轉載] Java8 Stream流遍歷 如何使用索引

參考鏈接&#xff1a; Java 8中迭代帶有索引的流Stream 1. 問題來源 Java8的Stream流為我們的遍歷集合帶來了方便&#xff0c;基本可以取代for循環了。但是有一些情況需要知道當前遍歷的索引&#xff0c;使用for循環當然可以輕易獲得&#xff0c;但使用stream就很難了。 比如…

Jquery簡單的右側浮動菜單

今天有空稍微看了下Jquery動畫函數animate這個方法&#xff0c;發現可以用這個方法來做下簡單的右側浮動菜單 因為經常做淘寶頁面時候會碰到這樣的效果 以前都是用人家的javascript組件代碼 發現老是用人家也不好&#xff0c;所以今天有空用jqeury中的animate這個方法寫了一個簡…

[轉載] Java8-Stream API 詳解

參考鏈接&#xff1a; 如何在Java 8中從Stream獲取ArrayList 摘要 Stream 作為 Java 8 的一大亮點&#xff0c;它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 對 XML 解析的 Stream&#xff0c;也不是 Amazon Kinesis 對大數據實時處理…

在Microsoft System Center中利用您的現有投資管理VMware--Veeam MP v6.5

在 Microsoft System Center 中利用您的現有投資管理 VMware VeeamManagement Pack (MP) v6.5 適用于物理、虛擬和備份基礎架構的單一的虛擬管理平臺 前段時間介紹了Veeam Management Pack (MP) v6.0產品&#xff0c;昨天發布了新版本VeeamManagement Pack (MP) v6.5&#xff0…

[轉載] Java關鍵字(Java 8版本)

參考鏈接&#xff1a; 所有Java關鍵字列表 定義 被Java語言賦予了特殊含義&#xff0c;用作專門用途的字符串&#xff08;單詞&#xff09;&#xff0c;這些關鍵字不能用于常量、變量、和任何標識符的名稱。 Java關鍵字(Java 8版本) Java關鍵字(Java 8 以后版本) 注意事…

uiw 1.2.17 發布,基于 React 16 的組件庫

發布&#xff0c; 高品質的UI工具包&#xff0c;React 16的組件庫。 文檔網站&#xff1a;uiw-react.github.io開源倉庫&#xff1a;github.com/uiw-react/u… 更新內容&#xff1a; ? 修復沒有代碼檢測文件匹配*.css。 5712887 ? 添加 .editorconfig 文件. d82dabf ? 給測試…

[轉載] Java中this和super關鍵字分別是什么意思

參考鏈接&#xff1a; Java中的Super關鍵字 this和super關鍵字 this是自身的一個對象&#xff0c;代表對象本身可以理解為指代當前的對象&#xff0c;它可以調用當前對象的屬性、方法和構造方法&#xff0c;一般情況下可以省略&#xff0c;必須使用this的地方是區分出現名字重…

SpringMVC注解HelloWorld

今天整理一下SpringMVC注解 歡迎拍磚 RequestMapping RequestMapping是一個用來處理請求地址映射的注解&#xff0c;可用于類或方法上。用于類上&#xff0c;表示類中的所有響應請求的方法都是以該地址作為父路徑。 RequestMapping注解有六個屬性&#xff0c;下面我們把她分成三…

mysql問答匯集

問:A&#xff0c;B兩臺mysql實現主從復制,A提供寫&#xff0c;B提供讀,那既然B要同步A&#xff0c;當A更新數據的時候&#xff0c;B不也一樣要更新嗎&#xff1f;那B不還是沒有實現負載減輕嗎&#xff1f;還有能通過MYSQL proxy實現3臺mysq均衡l嗎&#xff1f;一臺寫&#xff0…

自制 移動端 純原生 Slider滑動插件

在Google搜關鍵字“slider”或“swiper”能找到一大堆相關插件&#xff0c;自己造輪子是為了能更好的理解其中的原理。 給這個插件取名為“veSlider”是指“very easy slider”非常簡單的一個滑動插件。 這只是個半成品&#xff0c;僅僅實現了手指滑動、自動輪播、跳轉等基本功…

ISA Server 2006 部署步驟

ISA Server 2006 部署步驟 Posted by 尹揆 在這里先把ISA2006的安裝步驟給大家貼出來,后面陸續會有一些配置及日常的應用,希望大家多多指教!呵呵.ISA功能的強大自然不用多說了,一句話只要能想到它就能做到!放入光盤出現在我們面前還是其人性化的界面點默認的下一步吧接受協議序…