最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀StringBuilder為何比String節(jié)省效率

 更新時(shí)間:2024年12月25日 09:05:24   作者:高錳酸鉀_  
StringBuilder比String節(jié)省效率的原因主要在于其可變性和性能開(kāi)銷的降低,StringBuilder在內(nèi)部維護(hù)一個(gè)字符數(shù)組,可以直接在原有基礎(chǔ)上修改,避免了每次拼接時(shí)的額外復(fù)制操作

StringBuilder為何比String節(jié)省效率

通常說(shuō)StringBuilder比String節(jié)省效率一般是指在對(duì)字符串進(jìn)行一定的操作,比如拼接、反轉(zhuǎn)等,那么究竟為什么節(jié)省效率呢,本篇將從字符串拼接的原理來(lái)講述

字符串拼接的兩種實(shí)現(xiàn)

在Java中用加號(hào)對(duì)字符串進(jìn)行拼接操作通常有兩種情況

1.沒(méi)有變量的字符串拼接

String s1 = "abc" + "123" + "xyz";

這種不涉及變量的字符串拼接是相當(dāng)簡(jiǎn)單的,在編譯階段,會(huì)觸發(fā)字符串的優(yōu)化機(jī)制,對(duì)于只是簡(jiǎn)單字符串常量之間的拼接,編譯過(guò)后的結(jié)果就是他的最終值,也就是說(shuō),上面的s1在編譯時(shí)的值就已經(jīng)是"abc123xyz"了“

String s1 = "abc123xyz";

2.帶有變量的字符串拼接

String s1 = "abc";
String s2 = s1 + "123";

這種帶有變量的字符串拼接操作的實(shí)現(xiàn)就相對(duì)來(lái)說(shuō)比較復(fù)雜一些,他的實(shí)現(xiàn)原理在JDK8前后也不同 

JDK8之前是創(chuàng)建一個(gè)StringBuilder進(jìn)行操作

當(dāng)給s1直接賦值”abc“時(shí),在內(nèi)存的字符串常量池中會(huì)生成一個(gè)”abc“,并且s1變量引用在串池中的地址,當(dāng)為s2賦值時(shí),由于拼接操作涉及到另一個(gè)變量,堆內(nèi)存中會(huì)自動(dòng)生成一個(gè)StringBuilder空對(duì)象,然后再將s1的內(nèi)容與”123“全部拼接到這個(gè)StringBuilder的對(duì)象中,串池中也會(huì)留下”123“,然后再調(diào)用這個(gè)StringBuilder對(duì)象的toString方法將其轉(zhuǎn)換為字符串并賦值給s2

大致的過(guò)程等價(jià)于:

String s2 = new StringBuilder().append(s1).append("123").toString();

那么他的實(shí)現(xiàn)都使用了StringBuilder,為什么還說(shuō)這種拼接方式效率不高呢?

假如說(shuō)我們?cè)O(shè)計(jì)了多次的字符串拼接操作:

String s1 = "abc";
String s2 = s1 + "123";
String s3 = s2 + "xyz";
String s4 = s3 + "111";
...

每次涉及到變量的拼接操作都會(huì)在堆內(nèi)存中生成一個(gè)StringBuilder對(duì)象和一個(gè)String對(duì)象來(lái)接收拼接后的字符串,如果連續(xù)使用這種拼接方式拼接10次,那么在內(nèi)存中就需要開(kāi)辟20個(gè)新的對(duì)象,顯然這種方式并不是我們想要的

在JDK8之后會(huì)使用預(yù)估字符串長(zhǎng)度的方式來(lái)完成拼接

String s1 = "a";
String s2 = "b";
String s3 = "c";
String result = s1 + s2 + s3;

在進(jìn)行字符串拼接之前,會(huì)先預(yù)估字符串拼接后的長(zhǎng)度,并為其開(kāi)辟一個(gè)等長(zhǎng)的數(shù)組,再依次把數(shù)據(jù)放入數(shù)組中,最后再完成拼接操作,把數(shù)組轉(zhuǎn)換為一個(gè)字符串:

雖然說(shuō)相比起JDK8之前,這種方法確實(shí)提高了拼接效率,但是同樣的問(wèn)題也出現(xiàn)了:

String s1 = "abc";
String s2 = s1 + "123";
String s3 = s2 + "xyz";
String s4 = s3 + "111";

當(dāng)設(shè)計(jì)到多次拼接時(shí),就要進(jìn)行多次預(yù)估長(zhǎng)度,并且產(chǎn)生多個(gè)數(shù)組,同樣極其浪費(fèi)空間

使用StringBuilder

使用 StringBuilder 拼接字符串比直接使用 String 更高效,主要是因?yàn)椋?/p>

  1. 可變性:而 StringBuilder 是可變的,它在內(nèi)部維護(hù)一個(gè)字符數(shù)組,可以在原有的基礎(chǔ)上進(jìn)行修改。
  2. 性能開(kāi)銷:使用 String 拼接時(shí),每次都要復(fù)制原有字符串和新添加的部分,這在多次拼接時(shí)會(huì)顯著增加時(shí)間復(fù)雜度。StringBuilder 通過(guò)直接在內(nèi)部數(shù)組中修改數(shù)據(jù),避免了這些額外的復(fù)制操作。

也就是說(shuō),無(wú)論進(jìn)行多少次拼接,他的操作永遠(yuǎn)在一個(gè)StringBuilder容器內(nèi)進(jìn)行直接操作,不會(huì)額外開(kāi)辟其他的空間

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java8傳函數(shù)方法圖文詳解

    java8傳函數(shù)方法圖文詳解

    在本篇文章中小編給大家整理了關(guān)于java8傳函數(shù)方法和相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-04-04
  • Java設(shè)計(jì)模式之策略模式示例詳解

    Java設(shè)計(jì)模式之策略模式示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java的策略模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Java數(shù)據(jù)存儲(chǔ)的“雙子星”對(duì)決(Map和Set的區(qū)別)

    Java數(shù)據(jù)存儲(chǔ)的“雙子星”對(duì)決(Map和Set的區(qū)別)

    文章主要介紹了Java中Map和Set兩種數(shù)據(jù)結(jié)構(gòu)的定義、實(shí)現(xiàn)、方法及應(yīng)用場(chǎng)景,Map用于存儲(chǔ)鍵值對(duì),鍵唯一,值可重復(fù);Set用于存儲(chǔ)唯一元素,無(wú)序,兩者都提供了豐富的操作方法,如添加、刪除、查找等,感興趣的朋友一起看看吧
    2025-02-02
  • 1秒實(shí)現(xiàn)Springboot 圖片添加水印功能

    1秒實(shí)現(xiàn)Springboot 圖片添加水印功能

    這篇文章主要介紹了1秒實(shí)現(xiàn)Springboot 圖片添加水印功能,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 學(xué)習(xí)Java的static與final關(guān)鍵字

    學(xué)習(xí)Java的static與final關(guān)鍵字

    本篇文章給大家詳細(xì)分析了Java的static與final關(guān)鍵字知識(shí)點(diǎn)以及相關(guān)代碼分享,有需要的讀者跟著學(xué)習(xí)下吧。
    2018-03-03
  • Java數(shù)組動(dòng)態(tài)增加容量過(guò)程解析

    Java數(shù)組動(dòng)態(tài)增加容量過(guò)程解析

    這篇文章主要介紹了Java數(shù)組動(dòng)態(tài)增加容量過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • java默認(rèn)方法sqrt實(shí)例用法

    java默認(rèn)方法sqrt實(shí)例用法

    在本篇文章里小編給大家分享的是一篇關(guān)于java默認(rèn)方法sqrt實(shí)例用法,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-03-03
  • Spring中bean對(duì)象的裝配方式、作用域及生命周期詳解

    Spring中bean對(duì)象的裝配方式、作用域及生命周期詳解

    這篇文章主要介紹了Spring中bean對(duì)象的裝配方式、作用域及生命周期詳解,SprignBoot中?@Bean?完美的替換了了上面的這種在xml中配置的方法,使用以下方法就能讓spring在需要自動(dòng)創(chuàng)建Info對(duì)象時(shí),自動(dòng)調(diào)用這個(gè)方法,需要的朋友可以參考下
    2023-11-11
  • 在lambda的foreach遍歷中break退出操作(lambda foreach break)

    在lambda的foreach遍歷中break退出操作(lambda foreach break)

    這篇文章主要介紹了在lambda的foreach遍歷中break退出操作(lambda foreach break),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • springboot配置https訪問(wèn)的方法

    springboot配置https訪問(wèn)的方法

    這篇文章主要介紹了springboot配置https訪問(wèn)的方法,需要的朋友可以參考下
    2018-11-11

最新評(píng)論

柘荣县| 信阳市| 思茅市| 东丽区| 云和县| 隆德县| 会泽县| 镇远县| 墨玉县| 衡阳市| 扎赉特旗| 邵东县| 衡南县| 香港 | 资溪县| 亚东县| 库车县| 搜索| 垦利县| 古田县| 庆阳市| 新昌县| 万荣县| 资源县| 郴州市| 牟定县| 桐乡市| 隆昌县| 莫力| 阿鲁科尔沁旗| 怀安县| 永川市| 会理县| 承德县| 长春市| 英山县| 旺苍县| 隆子县| 县级市| 玉树县| 南丹县|