欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java中substring()的工作原理是什么

本篇文章給大家分享的是有關(guān)Java 中substring()的工作原理是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了新邱免費(fèi)建站歡迎大家使用!

1、substring() 是干嘛的

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

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

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

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

沉默王二

為什么呢?我來(lái)簡(jiǎn)單解釋一下。

Java 的下標(biāo)都是從 0 開(kāi)始編號(hào)的(我不確定有沒(méi)有從 1 開(kāi)始的編程語(yǔ)言),這和我們平常生活中從 1 開(kāi)始編號(hào)的習(xí)慣不同。Java  這樣做的原因如下:

Java 是基于 C 語(yǔ)言實(shí)現(xiàn)的,而 C 語(yǔ)言的下標(biāo)是從 0  開(kāi)始的——這聽(tīng)起來(lái)好像是一句廢話。真正的原因是下標(biāo)并不是下標(biāo),在指針(C)語(yǔ)言中,它實(shí)際上是一個(gè)偏移量,距離開(kāi)始位置的一個(gè)偏移量。第一個(gè)元素在開(kāi)頭,因此它的偏移量就為  0。

此外,還有另外一種說(shuō)法。早期的計(jì)算機(jī)資源比較匱乏,0 作為起始下標(biāo)相比較于 1 作為起始下標(biāo),編譯的效率更高。

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

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

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

Java 中substring()的工作原理是什么

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

public String(char value[], int offset, int count) {     //check boundary     this.value = Arrays.copyOfRange(value, offset, offset + count); }   public String substring(int beginIndex, int endIndex) {     //check boundary     int subLen = endIndex - beginIndex;     return new String(value, beginIndex, subLen); }

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

但 JDK 6 就有所不同。說(shuō)到 JDK 6,可能有些讀者表示不服,JDK 6?什么年代了,JDK 13 都出來(lái)了好不好?但我想告訴大家的是,對(duì)比著剖析  JDK 的源碼,對(duì)學(xué)習(xí)大有裨益。

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

就請(qǐng)隨我來(lái),看看 JDK 6 中的 substring() 的源碼吧。

//JDK 6 String(int offset, int count, char value[]) {     this.value = value;     this.offset = offset;     this.count = count; }   public String substring(int beginIndex, int endIndex) {     //check boundary     return  new String(offset + beginIndex, endIndex - beginIndex, value); }

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

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

這意味著什么呢?

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

Java 中substring()的工作原理是什么

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

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

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

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

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

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

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

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

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

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

以上就是Java 中substring()的工作原理是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞標(biāo)題:Java中substring()的工作原理是什么
文章路徑:http://aaarwkj.com/article4/pegeie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、虛擬主機(jī)云服務(wù)器、搜索引擎優(yōu)化網(wǎng)站設(shè)計(jì)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
久久精品国语少妇对白| 日韩精品一区二区av在线| 亚洲国产精品一区二区三区在线 | 成人性生活视频免费中文版| 激情影院在线观看福利| 亚洲精品成人免费电影| 亚洲乱人伦一区二区三区| 欧美国产大片一区视频| av天堂午夜精品蜜臀| 日本写真视频一区二区三区| 日本99精品视频10| 日本少妇一区二区99| 午夜福利成人在线免费观看| 亚洲另类综合日韩一区| 成人国产av一区二区三区| 日本高清一区二区高清| 欧美精品国产一区二区免费| 日韩深夜成人在线视频| 欧美一区二区三区东京热| 打开网址国语一级黄色片| 亚洲日本韩国视频久久精品| 国产三级精品三级在线播放| 亚洲欧美日韩高清一区二区| 青青草成人一区二区三区| 加勒比东京热视频在线| 欧美制服丝袜亚洲自拍偷拍| 青青草原在线视频一区| 99热精品这里只有精品| 熟女肥臀一区二区三区| 亚洲一区二区三区精品日韩| 亚洲欧美激情专区在线| 日韩欧美一区精品在线观看| 欧美国产激情一区二区| 国产一级精品自拍视频| 高清国语对白刺激av在线播放| 国产精品美女丝袜久久久| 亚洲av午夜福利麻豆av| 黄片视频免费在线观看播放| 中文字幕伦理一区二区三区| 中文字幕乱码日韩在线| 另类国产人妖免费视频网站大全|