最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java substring方法實現原理解析

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

substring實現原理

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

substring(int beginIndex, int endIndex)方法在不同版本的JDK中的實現是不同的。了解他們的區(qū)別可以幫助你更好的使用他。為簡單起見,后文中用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時發(fā)生了什么?

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

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

JDK 6中的subString

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

當調用substring方法的時候,會創(chuàng)建一個新的string對象,但是這個string的值仍然指向堆中的同一個字符數組。這兩個對象中只有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);
}

存在的問題

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

相應的解決辦法:

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

JDK 7 中的substring

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

源碼

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

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

相關文章

  • SpringMVC+MyBatis 事務管理(實例)

    SpringMVC+MyBatis 事務管理(實例)

    本文先分析編程式注解事務和基于注解的聲明式事務。對SpringMVC+MyBatis 事務管理的相關知識感興趣的朋友一起學習吧
    2017-08-08
  • Javaweb實現郵件發(fā)送

    Javaweb實現郵件發(fā)送

    這篇文章主要為大家詳細介紹了Javaweb實現郵件發(fā)送,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • java數組、泛型、集合在多態(tài)中的使用及對比

    java數組、泛型、集合在多態(tài)中的使用及對比

    本文主要介紹了java數組、泛型、集合在多態(tài)中的使用及對比。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • 如何使用BufferedReader循環(huán)讀文件

    如何使用BufferedReader循環(huán)讀文件

    這篇文章主要介紹了如何使用BufferedReader循環(huán)讀文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 一篇文章帶你詳解Spring的概述

    一篇文章帶你詳解Spring的概述

    這篇文章主要為大家介紹了Spring的概述,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 排查Java應用內存泄漏問題的步驟

    排查Java應用內存泄漏問題的步驟

    這篇文章主要介紹了排查Java應用內存泄漏問題的步驟,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-11-11
  • java編程實現根據EXCEL列名求其索引的方法

    java編程實現根據EXCEL列名求其索引的方法

    這篇文章主要介紹了java編程實現根據EXCEL列名求其索引的方法,涉及Java元素遍歷與數學運算的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • java安全?ysoserial?CommonsCollections1示例解析

    java安全?ysoserial?CommonsCollections1示例解析

    這篇文章主要介紹了java安全?ysoserial?CommonsCollections1示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Java怎樣判斷堆區(qū)中的對象可以被回收了

    Java怎樣判斷堆區(qū)中的對象可以被回收了

    文章介紹了Java垃圾回收機制的工作原理,主要通過引用計數法和可達性分析法來判斷對象是否可以被回收,引用計數法存在循環(huán)引用問題,而可達性分析法則使用GCRoot對象來判斷對象是否可達,從而決定是否回收,這兩種方法各有優(yōu)缺點,但Java最終采用了可達性分析法來實現垃圾回收
    2024-12-12
  • java使用CompletableFuture分批處理任務實現

    java使用CompletableFuture分批處理任務實現

    本文主要介紹了java使用CompletableFuture分批處理任務實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07

最新評論

大连市| 滕州市| 丰顺县| 九江市| 双峰县| 永顺县| 鄢陵县| 津市市| 太和县| 耿马| 灵丘县| 博湖县| 城市| 哈巴河县| 宿松县| 华亭县| 宜春市| 卓尼县| 桐城市| 呼伦贝尔市| 横山县| 明溪县| 马尔康县| 利辛县| 阿克苏市| 民勤县| 嘉定区| 长垣县| 简阳市| 达孜县| 奎屯市| 古交市| 吴江市| 南阳市| 盐源县| 南华县| 平罗县| 巴里| 镇江市| 宁国市| 林甸县|