成人免费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++編程異常處理

2021-01-07 09:20:08

SQL字符串Server
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩精品中文字幕 | 日日综合 | 婷婷中文在线 | 久久看看 | 日韩成人在线播放 | 国产一区二区av | 久草免费在线视频 | 日韩一级一区 | 黄频免费| 九九热这里 | 欧美性乱 | 欧美成人精品激情在线观看 | 日韩欧美手机在线 | 99在线免费视频 | 99热精品国产 | 少妇黄色 | 欧美激情 亚洲 | 中文字幕日韩一区 | 超碰免费观看 | 亚洲三区在线 | 国产在线观 | 亚洲精品中文字幕在线观看 | 亚洲九九 | 成人精品影院 | 99精品免费 | 成人免费高清 | 正在播放国产精品 | 丁香五月网久久综合 | 欧美精品一区二区三区在线播放 | 黄色网址在线免费播放 | 成人毛片在线观看 | 成人一级视频在线观看 | 一区二区三区中文字幕 | 香蕉视频91 | 在线观看www | 国产一区二区影院 | 在线视频国产一区 | 国产福利在线 | 欧美激情欧美激情在线五月 | 国产一区视频在线 | 成人在线免费网站 |