亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Java substring方法實現原理解析

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

substring實現原理

String是Java中一個比較基礎的類,每一個開發人員都會經常接觸到。而且,String也是面試中經常會考的知識點。String有很多方法,有些方法比較常用,有些方法不太常用。今天要介紹的subString就是一個比較常用的方法,而且圍繞subString也有很多面試題。

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

substring()的作用

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

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

輸出內容:

bc

調用substring時發生了什么?

你可能知道,因為x是不可變的,當使用x.substring(1,3)對x賦值的時候,它會指向一個全新的字符串:

Java substring方法實現原理解析

然而,這個圖不是完全正確的表示堆中發生的事情。因為在jdk6 和 jdk7中調用substring時發生的事情并不一樣。

JDK 6中的subString

tring是通過字符數組實現的。在jdk 6 中,String類包含三個成員變量:char value[], int offset,int count,他們分別用來:存儲真正的字符數組、存儲數組的第一個位置索引、存儲字符串中包含的字符個數。

當調用substring方法的時候,會創建一個新的string對象,但是這個string的值仍然指向堆中的同一個字符數組。這兩個對象中只有count和offset 的值是不同的。

Java substring方法實現原理解析

源碼

//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);}

存在的問題

如果有一個很長的字符串,但是你只需要使用很短的一段,于是你使用substring進行切割,但是由于你實際上引用了整個字符串,這個很長的字符串無法被回收。往小了說,造成了存儲空間的浪費,往大了說,可能造成內存泄漏。這個問題已經被官方記錄在Java Bug Database里面了:

Java substring方法實現原理解析

相應的解決辦法:

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

JDK 7 中的substring

上述問題在JDK 7中得到了解決。JDK 7中,substring方法會在堆中創建一個新的數組。

Java substring方法實現原理解析

源碼

//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); }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 国产日韩一区在线精品欧美玲 | 国产精彩对白综合视频 | 亚洲国产视频网站 | japanese国产在线中文 | 国产日产亚洲欧美综合另类 | 六月丁香深爱六月综合激情 | 曰本在线网| 美女拍拍拍爽爽爽爽爽爽 | 国产成+人欧美+综合在线观看 | 久久中国 | 色婷婷在线影院 | 国产日产欧产麻豆精品精品推荐 | 亚洲高清国产一线久久 | 国产精品v免费视频 | 私人影院毛片 | 青青在线精品2018国产 | 东京加勒比中文字幕波多野结衣 | 风流慈禧一级毛片在线播放 | 日本韩国欧美一区 | 久久久久久久久66精品片 | 奇米影视狠狠干 | 青青国产成人久久91网 | 久久久国产精品免费看 | 亚洲黄站| 成人亚洲视频 | 亚洲乱淫 | 国产不卡毛片 | 精品国产三级在线观看 | 日韩欧美第一区二区三区 | 中日韩欧美中文字幕毛片 | 国产性高清在线观看 | 麻豆成人传媒一区二区 | 欧美r级在线观看 | 做a的视频免费 | 啪啪91视频 | 蝌蚪视频91 | 国产精彩视频在线观看 | 国产一区二区三区四卡 | 国产在线视频欧美亚综合 | 视频二区 调教中字 知名国产 | 国产色婷婷精品免费视频 |