精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

靈魂拷問:Java 的 substring() 是如何工作的?

開發(fā) 后端
在逛 programcreek 的時候,我發(fā)現(xiàn)了一些小而精悍的主題。比如說:Java 的 substring() 方法是如何工作的?像這類靈魂拷問的主題,非常值得深入地研究一下。

 在逛 programcreek 的時候,我發(fā)現(xiàn)了一些小而精悍的主題。比如說:Java 的 substring() 方法是如何工作的?像這類靈魂拷問的主題,非常值得深入地研究一下。

[[282826]]

另外,我想要告訴大家的是,研究的過程非常的有趣,就好像在迷宮里探寶一樣,起初有些不知所措,但經(jīng)過一番用心的摸索后,不但會找到寶藏,還會有一種茅塞頓開的感覺,非常棒。

對于絕大多數(shù)的初級程序員或者說不重視“內(nèi)功”的老鳥來說,往往停留在“知其然不知其所以然”的層面上——會用,但要說底層的原理,可就只能撓撓頭雙手一攤一張問號臉了。

很長一段時間內(nèi),我也一直處于這種層面上。但我決定改變了,因為“內(nèi)功”就好像是在打地基,只有把地基打好了,才能蓋起經(jīng)得住考驗的高樓大廈。借此機會,我就和大家一起,對“Java 的 substring() 是如何工作的”進行一次深入地研究。注意了,準備打怪升級了!

1、substring() 是干嘛的

sub是 subtract 的縮寫,因此 substring 的字面意思就是“把字符串做個減法”。這樣一分析,是不是感覺方法的命名還是蠻有講究的?

substring() 的完整寫法是 substring(int beginIndex, int endIndex)。該方法返回一個新的字符串,介于原有字符串的起始下標 beginIndex 和結(jié)尾下標 endIndex-1 之間。

 

  1. String cmower = "沉默王二,一枚有趣的程序員"
  2. cmower = cmower.substring(0, 4); 
  3. System.out.println(cmower); 

程序輸出的結(jié)果為:

沉默王二

為什么呢?我來簡單解釋一下。

Java 的下標都是從 0 開始編號的(我不確定有沒有從 1 開始的編程語言),這和我們平常生活中從 1 開始編號的習慣不同。Java 這樣做的原因如下:

Java 是基于 C 語言實現(xiàn)的,而 C 語言的下標是從 0 開始的——這聽起來好像是一句廢話。真正的原因是下標并不是下標,在指針(C)語言中,它實際上是一個偏移量,距離開始位置的一個偏移量。第一個元素在開頭,因此它的偏移量就為 0。

此外,還有另外一種說法。早期的計算機資源比較匱乏,0 作為起始下標相比較于 1 作為起始下標,編譯的效率更高。

知道了這層原因后,再來看上面這段代碼,就會豁然開朗。對于“沉默王二,一枚有趣的程序員”這串字符來說,“沉”的下標為 0,“默”的下標為 1,“王”的下標為 2,“二”的下標為 3,所以 cmower.substring(0, 4) 返回的字符串是“沉默王二”——包括起始下標但不包括結(jié)尾下標。

2、substring() 在被調(diào)用的時候究竟發(fā)生了什么?

在此之前,我們已經(jīng)了解到:字符串是不可變的,因此當調(diào)用 substring() 方法的時候,返回的其實是一個新的字符串。那么變量 cmower 的地址引用就會發(fā)生如下圖所示的變化。

 

 

 

 

為了證明上圖是完全正確的,我們來看一下 JDK 7 中 substring() 的源碼。

 

  1. public String(char value[], int offset, int count) { 
  2.     //check boundary 
  3.     this.value = Arrays.copyOfRange(value, offset, offset + count); 
  4.   
  5. public String substring(int beginIndex, int endIndex) { 
  6.     //check boundary 
  7.     int subLen = endIndex - beginIndex; 
  8.     return new String(value, beginIndex, subLen); 

可以看得出,substring() 通過 new String() 返回了一個新的字符串對象,在創(chuàng)建新的對象時通過 Arrays.copyOfRange() 復(fù)制了一個新的字符數(shù)組。

但 JDK 6 就有所不同。說到 JDK 6,可能有些讀者表示不服,JDK 6?什么年代了,JDK 13 都出來了好不好?但我想告訴大家的是,對比著剖析 JDK 的源碼,對學習大有裨益。

不是有那么一句話嘛,要想了解一個成功人士,不能只關(guān)注他發(fā)跡以后的事,更要關(guān)注他之前做了什么。

就請隨我來,看看 JDK 6 中的 substring() 的源碼吧。

 

  1. //JDK 6 
  2. String(int offset, int countchar value[]) { 
  3.     this.value = value; 
  4.     this.offset = offset; 
  5.     this.count = count
  6.   
  7. public String substring(int beginIndex, int endIndex) { 
  8.     //check boundary 
  9.     return  new String(offset + beginIndex, endIndex - beginIndex, value); 

substring() 方法本身和 JDK 7 并沒有很大的差別,都通過 new String() 返回了一個新的字符串對象。但是 String() 這個構(gòu)造函數(shù)有很大的差別,JDK 6 只是簡單地更改了一下兩個屬性(offset 和 count)的值,value 并沒有變。

PS:value 是真正存儲字符的數(shù)組,offset 是數(shù)組中第一個元素的下標,count 是數(shù)組中字符的個數(shù)。

這意味著什么呢?

調(diào)用 substring() 的時候雖然創(chuàng)建了新的字符串,但字符串的值仍然指向的是內(nèi)存中的同一個數(shù)組,如下圖所示。

 

 

 

 

3、為什么 JDK 7 的構(gòu)造函數(shù)發(fā)生了變化

看了 JDK 6 和 JDK 7 源碼之后,大家可能產(chǎn)生這樣一個疑惑:為什么 JDK 7 要做出改變呢?大家共用同一個字符串數(shù)組不是挺好的嘛,省得占用新的內(nèi)存空間。事實上呢?

如果有一個很長很長的字符串,可以繞地球一周,當我們需要調(diào)用 substring() 截取其中很小一段字符串時,就有可能導(dǎo)致性能問題。由于這一小段字符串引用了整個很長很長的字符數(shù)組,就導(dǎo)致很長很長的這個字符數(shù)組無法被回收,內(nèi)存一直被占用著,就有可能引發(fā)內(nèi)存泄露。

PS:內(nèi)存泄露是指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。

那 JDK 7 出現(xiàn)之前,這個隱患怎么應(yīng)對呢?答案如下。

 

  1. cmower = cmower.substring(0, 4) + ""

為什么,為什么,為什么,多一個 “+ ""” 就能解決內(nèi)存泄漏的問題?有些讀者可能不太相信,我來帶大家分析一下。

首先呢,我們通過 JAD 對字節(jié)碼反編譯一下,上面這行代碼就變成了如下內(nèi)容。

 

  1. cmower = (new StringBuilder(String.valueOf(cmower.substring(0, 4)))).toString(); 

“+”號操作符就相當于一個語法糖,加上空的字符串后,會被 JDK 轉(zhuǎn)化為 StringBuilder 對象,該對象在處理字符串的時候會生成新的字符數(shù)組,所以 cmower = cmower.substring(0, 4) + ""; 這行代碼執(zhí)行后,cmower 就指向了和 substring() 調(diào)用之前不同的字符數(shù)組。

PS:如果不明白“+”號操作符的工作原理,請查閱我之前寫的文章《羞,Java 字符串拼接竟然有這么多姿勢》,這里就不再贅述,免得被老讀者捶。

4、最后

總結(jié)一下,JDK 7 和 JDK 6 的 substring() 方法本身并沒有多大的改變,但 String 類的構(gòu)造函數(shù)有了很大的區(qū)別,JDK 7 會重新復(fù)制一份字符數(shù)組,而 JDK 6 不會,因此 JDK 6 在執(zhí)行比較長的字符串 substring() 時可能會引發(fā)內(nèi)存泄露的問題。

責任編輯:華軒 來源: Java極客技術(shù)
相關(guān)推薦

2020-06-02 07:44:04

AQS JavaNode

2019-07-29 10:10:06

Java內(nèi)存線程安全

2020-05-29 11:48:01

安全運維信息安全網(wǎng)絡(luò)安全

2019-08-12 11:14:00

JVM垃圾對象

2019-08-01 10:20:10

2020-05-22 08:13:45

敏捷開發(fā)OKR

2022-12-12 08:46:11

2022-05-30 18:37:03

數(shù)據(jù)個人信息人工智能

2022-08-26 01:10:32

TCPSYNLinux

2022-03-16 18:27:39

開發(fā)低代碼軟件開發(fā)

2025-04-07 00:00:00

云原生架構(gòu)Kubernetes

2021-06-02 09:47:48

RSA2021

2017-11-17 09:13:31

Java注解

2021-05-26 05:22:48

SQL 數(shù)據(jù)庫SELECT

2023-06-16 14:10:00

TCPUDP網(wǎng)絡(luò)通信

2012-06-20 10:01:55

開源云計算

2021-05-10 17:20:55

AIOps開發(fā)人員人工智能

2011-08-08 13:45:58

jQuery

2021-03-12 09:24:58

Redis面試場景

2025-09-26 03:11:00

點贊
收藏

51CTO技術(shù)棧公眾號

国产精品无码电影在线观看| 成人午夜在线影院| 成人做爰69片免网站| 久久人体av| 亚洲午夜成aⅴ人片| 久久久久国产精品视频| 一级黄在线观看| 国产麻豆综合| 久久精品最新地址| 亚洲欧美在线不卡| а天堂中文最新一区二区三区| 亚洲3atv精品一区二区三区| 亚洲视频导航| 神马精品久久| 国产制服丝袜一区| 国产精品电影一区| 国产精品第一页在线观看| jizzjizz欧美69巨大| 日韩有码中文字幕在线| 亚洲美女一区二区三区| 欧美精品欧美精品| 精品国产无码一区二区三区| 日韩影院精彩在线| 高清一区二区三区四区五区| 殴美一级黄色片| 亚洲黄色录像| 亚洲精品在线观看网站| 天天干天天av| 成人性生活视频| 亚洲一二三四久久| 国产手机视频在线观看| aaa在线观看| 国产视频一区二区在线观看| 极品尤物一区二区三区| 性生交大片免费看女人按摩| 久久成人综合网| 国产成人亚洲综合| 亚洲天堂一区在线观看| 伊人久久婷婷| 欧美激情中文网| 99视频只有精品| 久久久久久久久丰满| 亚洲天堂网站在线观看视频| 成人h动漫精品一区| 国产精品流白浆在线观看| 欧美一级日韩不卡播放免费| 国产美女18xxxx免费视频| 亚洲电影有码| 欧美撒尿777hd撒尿| 日本三级免费观看| 筱崎爱全乳无删减在线观看 | 国产综合久久久久久久久久久久 | 日韩中文字幕高清| 一本色道久久综合亚洲精品不卡| 欧美极品少妇xxxxⅹ喷水| av激情在线观看| 在线中文字幕亚洲| 欧美成人精品一区二区| 日本一级二级视频| 欧美精品18| 久久久91精品国产一区二区三区| 亚洲欧美中文日韩在线v日本| 久久性爱视频网站| 精品欧美午夜寂寞影院| 日韩av在线一区二区| 成人网站免费观看| 你懂的一区二区三区| 欧美日本精品| 正在播放国产一区| 亚洲精品电影院| 欧美在线观看天堂一区二区三区| 欧美贵妇videos办公室| 日韩毛片在线视频| 久久一区亚洲| 国产欧美精品一区二区三区-老狼| 夜夜狠狠擅视频| 国产呦精品一区二区三区网站| 91在线免费看网站| 少妇喷水在线观看| 国产日韩欧美a| 亚洲三区视频| av福利在线导航| 色综合网站在线| 日本美女视频一区| 成人免费直播在线| 亚洲社区在线观看| 欧美人与禽zozzo禽性配| 亚洲免费成人| 国产精品揄拍一区二区| 黄色片一区二区三区| 久久人人爽人人爽| 午夜啪啪免费视频| 黄色在线免费观看网站| 91福利在线观看| 久久aaaa片一区二区| 欧美18免费视频| xxxxx91麻豆| 在线观看精品国产| 久草这里只有精品视频| 国产三级精品在线不卡| 性开放的欧美大片| 亚洲一区二区三区自拍| 欧美精品性生活| 91精品国产自产在线丝袜啪| 亚洲色图偷窥自拍| 日韩免费一二三区| 理论片日本一区| 久久亚裔精品欧美| 成人在线播放免费观看| 思热99re视热频这里只精品| 精品国产一区二区亚洲人成毛片| 亚洲AV无码成人精品区明星换面| 国产精品vip| 国产精品日韩一区| 亚洲日本在线播放| 亚洲欧美国产三级| 欧美日韩亚洲一二三| 91在线一区| 久久久精品美女| 成人黄色三级视频| 99久久精品国产观看| 日韩视频在线免费播放| 欧美电影免费观看| 亚洲精品wwww| 久久高清无码视频| 国内精品写真在线观看| 日韩精品一区二区三区外面| 成人黄色动漫| 精品国产污网站| 欧美爱爱小视频| 韩国欧美国产1区| 亚洲国产午夜伦理片大全在线观看网站 | 欧美亚洲国产成人| y111111国产精品久久久| 日韩亚洲欧美中文在线| 中文字幕人妻精品一区| 久久久三级国产网站| 国产老熟妇精品观看| 91蜜桃臀久久一区二区| 欧美久久久精品| 97成人在线观看| 国产精品女同互慰在线看| 国产精品无码专区av在线播放| 日韩成人动漫在线观看| 久久人人爽人人爽人人片av高请| www.天堂av.com| 一区二区三区小说| 韩国av中国字幕| 欧美午夜不卡| 国产精品一区二区你懂得| 青青青草视频在线| 日韩欧美激情四射| 国产乱国产乱老熟300| 国产精品一级在线| 蜜桃视频一区二区在线观看| 视频二区欧美| 久热综合在线亚洲精品| 欧美激情免费看| 亚洲精品一区二区三区四区| 一区二区三区欧美亚洲| 五月天丁香社区| 99av国产精品欲麻豆| 国内不卡一区二区三区| 蜜桃视频www网站在线观看| 精品香蕉在线观看视频一| 成人公开免费视频| 亚洲国产精品传媒在线观看| 奇米影音第四色| 2023国产精品久久久精品双| 91免费看蜜桃| 97在线超碰| 亚洲香蕉av在线一区二区三区| 久草视频在线免费| 中文字幕在线观看一区| 欧美日韩一区二区区别是什么 | 久久久久久久久久婷婷| 日本毛片在线观看| 色爱区综合激月婷婷| 亚洲一二三四视频| 国产精品一区在线观看你懂的| 精品无码国产一区二区三区av| 人体久久天天| 国产精品影片在线观看| 国产黄色大片在线观看| 亚洲欧洲国产精品| 国产婷婷在线视频| 午夜av一区二区三区| 黄免费在线观看| 国产一区二区成人久久免费影院| 国产精品久久..4399| 国产欧美日韩影院| 91精品国产高清久久久久久91裸体 | 国产欧美精品一区aⅴ影院| 91亚洲精品久久久蜜桃借种| 亚洲激情女人| 一区二区三区四区欧美日韩| 国产一区二区三区不卡av| 国产精品久久久久久久久久尿 | 日本在线天堂| 欧美精品一区二区在线播放 | 欧美大片一区二区| 波多野结衣视频网址| 99精品欧美| 欧美成人精品影院| 麻豆国产在线播放| 日韩一区二区电影| 中文字幕在线观看视频免费| 一区二区三区高清| 成人小视频免费看| 99精品视频一区| 欧美激情第一区| 天堂在线亚洲视频| 可以看毛片的网址| 91国语精品自产拍| 日韩欧美一区二区在线观看| 中文字幕一区二区三区中文字幕 | 亚洲一区网址| 国产精品免费一区豆花| 91九色porn在线资源| 久久久99久久精品女同性| 日韩a在线看| 精品播放一区二区| 99精品在线视频观看| 欧美性受xxxx| av图片在线观看| 亚洲成av人片在线| 免费人成年激情视频在线观看| 国产精品久久影院| 一区二区精品免费| 91视频国产观看| 国产伦理在线观看| 国产伦精品一区二区三区免费迷| 亚洲欧美偷拍另类| 日韩专区欧美专区| 国产精品涩涩涩视频网站| 国产欧美91| 免费无码av片在线观看| 夜夜嗨网站十八久久| 无码熟妇人妻av在线电影| 综合久久亚洲| 国产911在线观看| 一区二区三区在线电影| 五月天av影院| 香蕉av一区二区| 亚洲成年人专区| 一区二区三区在线| 成人小视频在线观看免费| 欧美日一区二区在线观看| www.日本在线视频| 亚洲激情成人| 美女av免费在线观看| 免费一区视频| 免费看a级黄色片| 免费成人av在线| 日本中文字幕影院| 国产精品一区在线观看乱码| 国产精品熟女一区二区不卡| 国产99久久久精品| 挪威xxxx性hd极品| 99re视频精品| 亚洲在线色站| 在线观看二区| 亚洲人在线视频| 国产高清视频在线观看| 一区二区欧美日韩视频| 午夜视频在线| 欧美精品免费在线| cao在线视频| 国产91免费观看| 青娱乐极品盛宴一区二区| 91影院在线免费观看视频| 久久久久九九精品影院| 国产精品加勒比| 视频一区欧美| 女女同性女同一区二区三区按摩| 欧美网站在线| 99草草国产熟女视频在线| 久久av中文字幕片| 亚洲乱妇老熟女爽到高潮的片| av一区二区不卡| 精品伦精品一区二区三区视频密桃| 中文字幕亚洲不卡| 亚洲激情视频一区| 欧美中文字幕一区| 精品久久久久久亚洲综合网站| 日韩电影免费观看中文字幕| 在线免费黄色| 高清欧美电影在线| 精品亚洲a∨| 国产在线一区二区三区播放| 成人久久一区| 国产免费黄色一级片| 青青草97国产精品免费观看| 国产精品91av| 国产精品天干天干在线综合| 久久精品www人人爽人人| 色综合色综合色综合| jizz国产视频| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 国产在线精品一区二区中文| 久久高清免费| av免费播放网址| 国产成人免费av在线| 青娱乐国产视频| 精品久久久国产精品999| 国产精品久久久久久久久毛片| 日韩久久免费视频| 国产视频在线播放| 国产精品678| 精品资源在线| 男人的天堂视频在线| 日本欧美一区二区| 一级特黄a大片免费| 亚洲男人的天堂在线观看| 青青草原在线免费观看视频| 一本色道久久综合精品竹菊| 午夜久久久久久噜噜噜噜| 日韩在线播放av| 婷婷综合六月| 久久综合久久综合这里只有精品| 午夜欧美精品| 国内自拍第二页| 中国av一区二区三区| 中文字幕免费在线观看视频| 久久网站免费观看| 无码人妻精品一区二区蜜桃百度| 免费一级片91| 免费看裸体网站| 欧美色图在线视频| 污视频网站免费观看| 欧美激情视频在线| 欧美久久亚洲| 六月婷婷激情网| 国产在线精品免费| 永久免费看片直接| 欧美日韩国产a| 色影视在线观看| 国产精品视频导航| 日韩不卡一区| 手机在线看福利| 国产嫩草影院久久久久| 国产99久久久久久免费看| 亚洲天堂视频在线观看| 亚洲精品国产嫩草在线观看| 欧美人xxxxx| 美女爽到呻吟久久久久| 中文字幕免费视频| 91精品1区2区| 在线日本视频| 91沈先生在线观看| 国产在线免费观看| 7777精品伊人久久久大香线蕉经典版下载| 国产系列在线观看| 国产精品久久久久久久久久久久久| 欧美日韩在线观看视频小说| www.天天射.com| 国产精品久久久久久久久免费桃花 | 永久免费在线看片视频| 精品亚洲国内自在自线福利| 91精品一区二区三区蜜桃| 日韩午夜激情电影| 国产白丝在线观看| 久久久久久久久一区二区| 亚洲欧美春色| 亚洲欧美日韩第一页| 337p亚洲精品色噜噜噜| 日本小视频在线免费观看| 精品国产免费人成电影在线观...| 国产农村妇女毛片精品久久莱园子| 蜜桃av免费看| 欧美男生操女生| 黄页在线观看免费| 久久久久久久有限公司| 蜜芽一区二区三区| 青青草手机在线视频| 日韩高清av在线| 国产精品无码久久久久| 亚洲国产精品女人| 成人av网站免费| 亚洲中文字幕无码爆乳av| 久久久精品中文字幕| 久久精品论坛| 亚洲最大天堂网| 亚洲va欧美va人人爽| 成年人在线视频免费观看| 亚洲一区二区三区毛片| 无码国产伦一区二区三区视频| 久久久久久久一区二区| 激情五月综合网| 蜜桃色一区二区三区| 在线观看中文字幕不卡| 日皮视频在线观看| 日本不卡在线观看| 国产精品 欧美精品| 免费看毛片网站| 欧美日本亚洲视频| 精品国产乱码| 四虎永久免费观看| 欧美日本国产视频| 深夜av在线|