久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java substring方法實(shí)現(xiàn)原理解析

瀏覽:32日期:2022-09-02 10:42:55

substring實(shí)現(xiàn)原理

String是Java中一個(gè)比較基礎(chǔ)的類(lèi),每一個(gè)開(kāi)發(fā)人員都會(huì)經(jīng)常接觸到。而且,String也是面試中經(jīng)常會(huì)考的知識(shí)點(diǎn)。String有很多方法,有些方法比較常用,有些方法不太常用。今天要介紹的subString就是一個(gè)比較常用的方法,而且圍繞subString也有很多面試題。

substring(int beginIndex, int endIndex)方法在不同版本的JDK中的實(shí)現(xiàn)是不同的。了解他們的區(qū)別可以幫助你更好的使用他。為簡(jiǎn)單起見(jiàn),后文中用substring()代表substring(int beginIndex, int endIndex)方法。

substring()的作用

substring(int beginIndex, int endIndex)方法截取字符串并返回其[beginIndex,endIndex-1]范圍內(nèi)的內(nèi)容。s

String x = 'abcdef';x = x.substring(1,3);System.out.println(x);

輸出內(nèi)容:

bc

調(diào)用substring時(shí)發(fā)生了什么?

你可能知道,因?yàn)閤是不可變的,當(dāng)使用x.substring(1,3)對(duì)x賦值的時(shí)候,它會(huì)指向一個(gè)全新的字符串:

Java substring方法實(shí)現(xiàn)原理解析

然而,這個(gè)圖不是完全正確的表示堆中發(fā)生的事情。因?yàn)樵趈dk6 和 jdk7中調(diào)用substring時(shí)發(fā)生的事情并不一樣。

JDK 6中的subString

tring是通過(guò)字符數(shù)組實(shí)現(xiàn)的。在jdk 6 中,String類(lèi)包含三個(gè)成員變量:char value[], int offset,int count,他們分別用來(lái):存儲(chǔ)真正的字符數(shù)組、存儲(chǔ)數(shù)組的第一個(gè)位置索引、存儲(chǔ)字符串中包含的字符個(gè)數(shù)。

當(dāng)調(diào)用substring方法的時(shí)候,會(huì)創(chuàng)建一個(gè)新的string對(duì)象,但是這個(gè)string的值仍然指向堆中的同一個(gè)字符數(shù)組。這兩個(gè)對(duì)象中只有count和offset 的值是不同的。

Java substring方法實(shí)現(xiàn)原理解析

源碼

//JDK 6String(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);}

存在的問(wèn)題

如果有一個(gè)很長(zhǎng)的字符串,但是你只需要使用很短的一段,于是你使用substring進(jìn)行切割,但是由于你實(shí)際上引用了整個(gè)字符串,這個(gè)很長(zhǎng)的字符串無(wú)法被回收。往小了說(shuō),造成了存儲(chǔ)空間的浪費(fèi),往大了說(shuō),可能造成內(nèi)存泄漏。這個(gè)問(wèn)題已經(jīng)被官方記錄在Java Bug Database里面了:

Java substring方法實(shí)現(xiàn)原理解析

相應(yīng)的解決辦法:

s1 = s1.substring(x,y) + '';

JDK 7 中的substring

上述問(wèn)題在JDK 7中得到了解決。JDK 7中,substring方法會(huì)在堆中創(chuàng)建一個(gè)新的數(shù)組。

Java substring方法實(shí)現(xiàn)原理解析

源碼

//JDK 7 /** * Allocates a new {@code String} that contains characters from a subarray * of the character array argument. The {@code offset} argument is the * index of the first character of the subarray and the {@code count} * argument specifies the length of the subarray. The contents of the * subarray are copied; subsequent modification of the character array does * not affect the newly created string. * * @param value Array that is the source of characters * @param offset The initial offset * @param count The length * @throws IndexOutOfBoundsException If the {@code offset} and {@code count} arguments index * characters outside the bounds of the {@code value} array */ public String(char value[], int offset, int count) { //check boundary this.value = Arrays.copyOfRange(value, offset, offset + count); } /** * Returns a string that is a substring of this string. The * substring begins at the specified {@code beginIndex} and * extends to the character at index {@code endIndex - 1}. * Thus the length of the substring is {@code endIndex-beginIndex}. * <p> * Examples: * <blockquote><pre> * 'hamburger'.substring(4, 8) returns 'urge' * 'smiles'.substring(1, 5) returns 'mile' * </pre></blockquote> * * @param beginIndex the beginning index, inclusive. * @param endIndex the ending index, exclusive. * @return the specified substring. * @throws IndexOutOfBoundsException if the * {@code beginIndex} is negative, or * {@code endIndex} is larger than the length of * this {@code String} object, or * {@code beginIndex} is larger than * {@code endIndex}. */ public String substring(int beginIndex, int endIndex) { //check boundary int subLen = endIndex - beginIndex; return ((beginIndex == 0) && (endIndex == value.length)) ?this :new String(value, beginIndex, subLen); }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 涡阳县| 林甸县| 旬邑县| 绥芬河市| 庆阳市| 宝坻区| 无锡市| 海阳市| 郓城县| 临清市| 昆山市| 河南省| 平山县| 平塘县| 三明市| 永宁县| 临颍县| 胶州市| 永靖县| 丰台区| 万宁市| 运城市| 监利县| 汶川县| 峨边| 集安市| 睢宁县| 淄博市| 江津市| 鄂伦春自治旗| 巨野县| 浦城县| 淮滨县| 安阳市| 嘉兴市| 乌拉特中旗| 大理市| 浦城县| 庐江县| 且末县| 英德市|