亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2020年05月01日 10:36:41   作者:Hello_xzy_World  
這篇文章主要介紹了Java substring方法實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

String是Java中一個(gè)比較基礎(chǔ)的類,每一個(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è)全新的字符串:

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

JDK 6中的subString

tring是通過(guò)字符數(shù)組實(shí)現(xiàn)的。在jdk 6 中,String類包含三個(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 的值是不同的。

源碼

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

存在的問(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里面了:

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

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

JDK 7 中的substring

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

源碼

  //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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 類動(dòng)態(tài)添加屬性字段的操作

    Java 類動(dòng)態(tài)添加屬性字段的操作

    這篇文章主要介紹了Java 類動(dòng)態(tài)添加屬性字段的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • 基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解

    基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解

    這篇文章主要介紹了基于SpringBoot集成測(cè)試遠(yuǎn)程連接的Redis服務(wù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot整合Redis的示例

    SpringBoot整合Redis的示例

    這篇文章主要介紹了SpringBoot整合Redis的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • Java中2個(gè)對(duì)象字段值比較是否相同

    Java中2個(gè)對(duì)象字段值比較是否相同

    本文主要介紹了Java中2個(gè)對(duì)象字段值比較是否相同,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java中如何正確定義字符串

    Java中如何正確定義字符串

    這篇文章主要給大家介紹了關(guān)于Java中如何正確定義字符串的相關(guān)資料,在Java中定義一個(gè)字符串最簡(jiǎn)單的方法是用雙引號(hào)把它包圍起來(lái),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • idea雙擊圖標(biāo)打不開(kāi),無(wú)反應(yīng)的解決

    idea雙擊圖標(biāo)打不開(kāi),無(wú)反應(yīng)的解決

    這篇文章主要介紹了idea雙擊圖標(biāo)打不開(kāi),無(wú)反應(yīng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Springboot集成swagger實(shí)現(xiàn)方式

    Springboot集成swagger實(shí)現(xiàn)方式

    這篇文章主要介紹了Springboot集成swagger實(shí)現(xiàn)方式,通過(guò)簡(jiǎn)單的示例代碼詳細(xì)描述了實(shí)現(xiàn)過(guò)程步驟,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-08-08
  • Java提示解析時(shí)已到達(dá)文件結(jié)尾的解決方法

    Java提示解析時(shí)已到達(dá)文件結(jié)尾的解決方法

    在本篇文章中小編給大家分享了關(guān)于Java提示解析時(shí)已到達(dá)文件結(jié)尾的解決方法,需要的朋友們學(xué)習(xí)下。
    2019-07-07
  • JAVA設(shè)計(jì)模式---原型模式你了解嗎

    JAVA設(shè)計(jì)模式---原型模式你了解嗎

    這篇文章主要介紹了JAVA 原型模式的的相關(guān)資料,文中講解非常細(xì)致,實(shí)例幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • SpringBoot整合WebService服務(wù)的實(shí)現(xiàn)代碼

    SpringBoot整合WebService服務(wù)的實(shí)現(xiàn)代碼

    WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語(yǔ)言,不依賴于平臺(tái),可以實(shí)現(xiàn)不同的語(yǔ)言間的相互調(diào)用,通過(guò)Internet進(jìn)行基于Http協(xié)議的網(wǎng)絡(luò)應(yīng)用間的交互,這篇文章主要介紹了SpringBoot整合WebService服務(wù)的實(shí)例代碼,需要的朋友可以參考下
    2022-02-02

最新評(píng)論