成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

京東一面:為什么 IDEA 建議去掉 StringBuilder,而要使用 “+” 拼接字符串?

開發
大家普遍認知中,字符串拼接要用 StringBuilder,那為什么 idea 會建議你是用“+”呢,那到底 StringBuilder 和 “+”有什么具體區別呢?

各位小伙伴在字符串拼接時應該都見過下面這種提示:

內容翻譯:報告StringBuffer、StringBuilder或StringJoiner的任何用法,這些用法可以用單個java.lang.String串聯來替換。使用字符串串聯可以使代碼更短、更簡單。只有當得到的串聯至少與原始代碼一樣高效或更高效時,此檢查才會報告。

大家普遍認知中,字符串拼接要用 StringBuilder,那為什么 idea 會建議你是用“+”呢,那到底 StringBuilder  和 “+”有什么具體區別呢,我們一起來探究一下。

1.普通拼接

普通的幾個字符串拼接成一個字符串,直接使用“+” 因為教材等原因,當前依舊有許多人拼接字符串時認為使用“+”耗性能,首選StringBuilder。

實際上,從JDK5開始,Java編譯器就做了優化,使用“+”拼接字符串,編譯器編譯后實際就自動優化為使用StringBuilder。

新建測試類StringTest,分別創建使用“+”拼接字符串和使用StringBuilder拼接字符串的方法;并新增Junit測試用例,分別調用拼接字符串100000次(這里不是循環拼接,而是執行多次拼接,因為一次拼接耗時太少,看不出差異),打印耗時。

/**
 * 使用+拼接字符串
 */
public String concatenationStringByPlus(String prefix, int i) {
    return prefix + "-" + i;
}

/**
 * 使用StringBuilder拼接字符串
 */
public String concatenationStringByStringBuilder(String prefix, int i) {
    return new StringBuilder().append(prefix).append("-").append(i).toString();
}

/**
 * 測試使用+拼接字符串耗時
 */
@Test
public void testStringConcatenation01ByPlus() {
    long startTime = System.currentTimeMillis();
    int count = 100000;
    for (int i = 0; i < count; i++) {
        String str = concatenationStringByPlus("testStringConcatenation01ByStringBuilder:", i);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("testStringConcatenation01ByPlus,拼接字符串" + count + "次,花費" + (endTime - startTime) + "秒");
}

/**
 * 測試使用StringBuilder拼接字符串耗時
 */
@Test
public void testStringConcatenation02ByStringBuilder() {
    long startTime = System.currentTimeMillis();
    int count = 100000;
    for (int i = 0; i < count; i++) {
        String str = concatenationStringByStringBuilder("testStringConcatenation02ByStringBuilder:", i);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("testStringConcatenation02ByStringBuilder,拼接字符串" + count + "次,花費" + (endTime - startTime) + "秒");
}

執行Junit用例,看耗時統計輸出:

testStringConcatenation01ByPlus,拼接字符串100000次,花費33秒
testStringConcatenation02ByStringBuilder,拼接字符串100000次,花費36秒

雖然有差異,但是差異極小,考慮到執行了100000次,每次耗時的差異就更小了,而且程序執行有各種因素影響執行效率,可以認為耗時差不多。也可以多次執行對比耗時差異,也可以發現基本一致。

到class文件所在目錄,執行 javap -c StringTest.class,對class文件進行反編譯,查看編譯后的代碼差異。這里不要使用Intellij idea和JD進行反編譯,因為反編譯有優化,會都反編譯成“+”拼接的,看不出來編譯后的真正情況。

從圖上可以看出兩種拼接方法反編譯后完全一樣,沒有差異,執行效率自然也是一樣的。

既然執行效率一樣,從代碼簡潔利于閱讀考慮,推薦使用“+”拼接字符串。

2.循環拼接

循環拼接一個長字符串,建議使用StringBuilder,雖然“+”拼接字符串編譯后也會變成StringBuilder,但是每次循環處理都會new一個StringBuilder對象,耗時會大大增加。而直接使用StringBuilder,new一次就可以了,效率相對高。

新增2個Junit測試用例,循環拼接10000次拼接一個字符串(次數少于上面的用例,因為拼接的是一個字符串,如果拼接次數太多,可能引發內存溢出):

/**
 * 循環使用+拼接字符串
 */
@Test
public void testLoopStringConcatenation03ByPlus() {
    long startTime = System.currentTimeMillis();
    int count = 10000;
    String str = "testLoopStringConcatenation03ByPlus:";
    for (int i = 0; i < count; i++) {
        str = str + "-" + i;
    }
    System.out.println(str);
    long endTime = System.currentTimeMillis();
    System.out.println("testLoopStringConcatenation03ByPlus,拼接字符串" + count + "次,花費" + (endTime - startTime) + "秒");
}

/**
 * 測試循環使用StringBuilder拼接字符串耗時
 */
@Test
public void testLoopStringConcatenation04ByStringBuilder() {
    long startTime = System.currentTimeMillis();
    int count = 100000;
    StringBuilder stringBuilder = new StringBuilder("testLoopStringConcatenation04ByStringBuilder:");
    for (int i = 0; i < count; i++) {
        stringBuilder.append("-");
        stringBuilder.append(i);
    }
    String str = stringBuilder.toString();
    System.out.println(str);
    long endTime = System.currentTimeMillis();
    System.out.println("testLoopStringConcatenation04ByStringBuilder,拼接字符串" + count + "次,花費" + (endTime - startTime) + "秒");
}

執行Junit用例,看耗時統計輸出:

testLoopStringConcatenation03ByPlus,拼接字符串10000次,花費463秒
testLoopStringConcatenation04ByStringBuilder,拼接字符串10000次,花費13秒

可以看出,差異明顯,不在一個量級了。

總結

  • 單純的字符串拼接使用“+”,更快更簡潔。
  • 循環拼接時使用“+”拼接字符串效率較低,推薦使用 StringBuilder。
責任編輯:趙寧寧 來源: 醉魚Java
相關推薦

2025-02-27 08:18:40

2017-01-19 11:26:55

Java 8StringBuild

2016-12-27 09:46:55

Java 8StringBuild

2020-05-13 12:17:33

RedisC字符C語言

2019-02-27 09:00:13

阿里巴巴for循環Java

2019-01-29 10:30:32

阿里巴巴Java字符串

2024-11-26 08:52:34

SQL優化Kafka

2021-11-03 09:03:09

面試鏈接http

2014-11-21 10:50:26

JavaString

2011-03-08 12:59:38

proftpd

2017-07-03 13:33:42

AndroidItemDecorat

2024-10-09 09:12:11

2011-04-14 09:30:15

集合框架

2010-05-11 10:29:06

Unix awk

2014-05-19 15:52:57

Apache StraApache

2024-05-28 08:09:27

2024-01-03 08:15:35

Executors線程池線程

2014-04-25 10:05:42

OpenStack私有云公共云

2024-01-24 11:24:03

C++編程異常處理

2013-09-27 11:33:57

交換機技術Vlan技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色婷婷影院 | 日韩国产欧美 | 久久久久久影院 | 亚洲www | 日本涩涩视频 | 农村妇女毛片精品久久久 | 精品一区二区三区免费毛片 | 欧美日韩在线一区二区三区 | 亚洲精品18 | 免费观看av| 国产成人99 | 欧美乱码精品一区二区三区 | 日韩综合在线 | 有码一区 | 久久免费视频在线 | 一区二区免费在线 | 久久国产精品一区二区三区 | 久久精品国产久精国产 | 九九热在线免费视频 | 性欧美hd | 成人影音| h在线 | 久久久久久国产一区二区三区 | 1000部精品久久久久久久久 | 久久久久电影 | 日韩在线中文字幕 | 国产午夜在线 | www精品美女久久久tv | 国产日韩精品视频 | 免费天天干 | 国产有码 | www.五月天婷婷.com | 欧洲精品一区 | 日本特黄特色aaa大片免费 | 看a网站| 欧洲视频一区二区 | 777777777亚洲妇女 | 国产一区二区在线91 | 亚洲精视频 | 国产精品自产av一区二区三区 | 日韩精品在线免费观看视频 |