1. 程式人生 > >java字串連線效能分析

java字串連線效能分析

字串連線一向是比較常用的 ,異常日誌輸出或者是文字的組裝等等,因此需要去思考選擇哪種方法效能最高 假設我們需要連線strA 和 strB 常用的幾種字串組裝方式如下: 1.String.format("%s%s",strA,strB) 2.srtA + strB 3.strA.concat(strB) 4.new StringBuilder(strA).append(strB) 5.new StringBuffer(strA).appedn(strB) 這幾種有什麼差別, 1、String.format 通過匹配佔位符的方式,往字串裡面插入引數值,而這種實現方法比一般的連線字串方式耗時更長 不過有時候format這種方式的可讀性更好,通過佔位符還可以指定插入的引數型別 2、+操作符連線字串實際上是呼叫StringBuilder.append,但是通過+連線的每個字串都是一個新的物件, 類似String result = "Hello " + "world"; 實際上為了得到一個字串而建立了3個String物件,剩餘的2個物件就交給了GC, 但是如果遇到更多的字串連線,或者是迴圈呼叫,使用+操作符進行連線會導致大量的String物件讓GC去處理  //以下兩者是等價的
s = i + ""
s = String.valueOf(i); //以下兩者也是等價的
s = "abc" + i; s = new StringBuilder("abc").append(i).toString(); 3、contat原始碼實現則是通過拷貝當前字串的char[]成員變數,然後進行擴容,之後再將拼接字串拷貝進去,開銷挺大 每次操作都會產生一個新的String物件 4、StringBuilder只新建了一個物件,通過檢視原始碼可以看到內部有一個char[]型別的動態陣列來儲存字串。 很顯然StringBuilder在開銷方面更小 5、StringBuffer則是執行緒安全的StringBuilder 寫個簡單的程式對比一下字串連線的效能:
/*
 * Copyright (C) 2009-2016 Hangzhou 2Dfire Technology Co., Ltd.All rights reserved
 */
package com.twofire.wechat.service;

/**
 * StringCombineCostTimeTest
 *
 * @author shinan
 * @since 2017-03-03
 */
public class StringCombineCostTimeTest {
    private static String request = "request";
    private static String result = "result";


    public static void combineTimeCost(int count) {
        combineByStringFormat(count);
        combineByStringPlusOperator(count);
        combineByStringBuilder(count);
        combineByStringConcat(count);
        System.out.println("---------------------------------------");
    }

    public static void combineByStringFormat(int count) {
        long start = System.currentTimeMillis();
        for (int i = 0; i< count;i++) {
            String combineResult =  String.format("request = %s, result = %s", request, result);
        }
        long end = System.currentTimeMillis();
        long cost = end - start;
        System.out.println(count + " combine String.format cost : " + cost);
    }

    public static void combineByStringPlusOperator(int count) {
        long start = System.currentTimeMillis();
        for (int i = 0; i< count;i++) {
            String combineResult = "request = " + request + " result = " + result;
        }
        long end = System.currentTimeMillis();
        long cost = end - start;
        System.out.println(count + " combine String add cost : " + cost);
    }

    public static void combineByStringBuilder(int count) {
        long start = System.currentTimeMillis();
        for (int i = 0; i< count;i++) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("request = ").append(request).append(" result = ")
                    .append(result);
        }
        long end = System.currentTimeMillis();
        long cost = end - start;
        System.out.println(count + " combine StringBuilder cost : " + cost);
    }

    public static void combineByStringConcat(int count) {
        long start = System.currentTimeMillis();
        for (int i = 0; i< count;i++) {
            String str = "";
            str.concat("request = ").concat(request).concat(" result = ").concat(result);
        }
        long end = System.currentTimeMillis();
        long cost = end - start;
        System.out.println(count + " combine Concat cost : " + cost);
    }

    public static void main(String[] args){
        combineTimeCost(1000000);
        combineTimeCost(1000000);
        combineTimeCost(1000000);

    }
}


耗時統計: String.format耗時最長 concat中等,+和StringBuilder較為接近 即時在做最簡單的拼接時,如果我們不想建立StringBuffer或StringBuilder例項的時候可以使用concat。但是對於大量的字串拼接操作,我們就不應該使用concat,因為concat會降低程式的效能,消耗cpu。因此,在不考慮執行緒安全和同步的情況下,為了獲得最高的效能,我們應儘量使用StringBuilder

相關推薦

java字串連線效能分析

字串連線一向是比較常用的 ,異常日誌輸出或者是文字的組裝等等,因此需要去思考選擇哪種方法效能最高 假設我們需要連線strA 和 strB 常用的幾種字串組裝方式如下: 1.String.format("%s%s",strA,strB) 2.srtA + strB 3.st

Java字串連線效能問題

Java中使用+作為字串連線符,它是把多個字串合併成一個字串的方便途徑。對於單獨一行的輸出、或者較小的大小固定物件,使用連線符方便且合適。但是對於大規模的場景,字串連線符變得有些不合時宜。 以連線N個

希爾排序的Java實現、效能分析以及適用場景

1.希爾排序的Java實現: 程式碼如下: package com.zm.testSort; /** *希爾排序的最優化 * @author zm */ public class ShellS

使用JDK自帶的VisualVM進行Java程式的效能分析

VisualVM是什麼? VisualVM是JDK自帶的一個用於Java程式效能分析的工具,JDK安裝完畢後就有啦,在JDK安裝目錄的bin資料夾下能找到名稱為jvisualvm.exe。 要使用VisualVM分析您的應用效能,首先得讓Visual

直接插入排序的Java實現、效能分析以及適用場景

1.直接插入排序的Java實現: 程式碼如下: package com.zm.testSort; /** * 直接插入排序類 * @author zm */ public class InsertSort { public static v

Java字串連線

由於字串不可變性,使得“abc” + "123" 會建立3個物件:"abc"、"123"、“abc123”。而“abc” + "123" +"test"則會建立"abc"、“123”、“test”、"abc123" 、"abc123test"物件。由於該過程產生了很多不必要的

歸併排序的Java實現、效能分析以及適用場景

1.歸併排序的Java實現: 程式碼如下: package com.zm.testSort; /** * 歸併排序 * @author zm */ public class MergeSort

堆排序的Java實現、效能分析以及適用場景

1.堆排序的Java實現: 程式碼如下: package com.zm.testSort; /** * 堆排序 * @author zm */ public class HeapSort {

氣泡排序的Java實現、效能分析以及適用場景

1.氣泡排序的Java實現: 程式碼如下: package com.zm.testSort; public class BubbleSort { public static void getBubbleSort(int[] a) {

Java 字串拼接 五種方法的效能比較分析 “+”、contact、join、append

一、五種方法分析: 1. 加號 “+” 2. String contact() 方法 3. StringUtils.join() 方法 4. StringBuffer append() 方法 5. StringBuilder append() 方法 二、優劣勢分析 開

字串全排列(效能分析Java版)

具體的思路我就不寫了,借用網上的一張圖來表示: 我的程式碼如下: import java.util.*; public class Solution { public ArrayList<String> Permutation(String str

java四種字串拼接方式效能分析

前幾天寫一個防重複提交的元件的時候,有一個操作是需要將各個欄位的字串拼接成一個requestKey。看了別人的程式碼,我發現,中介軟體這種東西,每天都要處理幾百幾千萬的請求,但是裡面很多字串拼接的時候還是很原始的“+”號拼接,如果將所有的字串拼接操作都換成更高效

Java 字串拼接四種方式的效能比較分析

一、簡單介紹 編寫程式碼過程中,使用"+"和"contact"比較普遍,但是它們都不能滿足大資料量的處理,一般情況下有一下四種方法處理字串拼接,如下: 1、 加號"+" 2、 String的 contact()方法 3、 StringBuffer 的 append()方法 4、 StringBuil

Java 字串拼接 五種方法的效能比較分析

> 字串拼接一般使用“+”,但是“+”不能滿足大批量資料的處理,Java中有以下五種方法處理字串拼接,各有優缺點,程式開發應選擇合適的方法實現。1. 加號 “+”2. String contact() 方法3. StringUtils.join() 方法4. Strin

hibernate抓取策略效能分析,子查詢/連線查詢效能對比

https://blog.csdn.net/qq_40762011/article/details/82993283 https://blog.csdn.net/lzm18064126848/article/details/50578285 https://blog.csdn.net/luckarecs/

連線join查詢與where後使用子查詢的效能分析

宣告:本文摘自https://www.cnblogs.com/cdf-opensource-007/p/6540521.html 子查詢就是在一條查詢語句中還有其它的查詢語句,主查詢得到的結果依賴於子查詢的結果。 子查詢的子語句可以在一條sql語句的FROM,JOIN,和WHERE後面,本文主要針對在WH

cmake:gperftools效能分析工具find libprofiler 指令碼暨profiler的靜態連線問題

gperftools是一個很好用的效能分析工具,但沒有提供官方的用於查詢profiler庫的cmake指令碼,所以在基於cmake管理的專案中如果要在系統查詢libprofiler庫就就要自己寫FindPROFILER.cmake指令碼。 將指令碼所在的資料夾加入CMAKE_MODULE

Go 字串連線+=與strings.Join效能對比

Go字串連線 對於字串的連線大致有兩種方式: 1、通過+號連線 func StrPlus1(a []string) string { var s, sep string for i := 0; i < len(a); i++ { s += sep + a[i]

java程式效能分析之thread dump和heap dump

一.dump基本概念         在故障定位(尤其是out of memory)和效能分析的時候,經常會用到一些檔案來幫助我們排除程式碼問題。這些檔案記錄了JVM執行期間的記憶體佔用、執行緒執行等情況,這就是我們常說的dump檔案。常用的有heap dump和threa

Java的知識點5——擴充套件賦值運算子、 關係運算符、 邏輯運算子、字串連線符、 條件運算子

擴充套件運算子 程式 public class Dd1 { public static void main(String[] args) { int a=3; int b=4; a+=b;//相當於a=a+b; System.out.println("a