探秘java中的substring

2020-12-25 軟體開發領路人

字符串截取是大家在開發過程中經常會用到的一個功能。要實現這個功能就會用到String類的substring方法。

那大家知道這個substring是怎麼實現的這個功能呢。

今天我們就來一探究竟。

我本機安裝的是java8。先看看java8的源碼裡,這個substring有什麼秘密吧。

我們可以看到在substring方法中先是進行一系列的驗證校驗,然後調用了new String新實例化一個對象。

在對應的構造方法中從原字符串對象的value屬性(char數組)複製出指定範圍的數據作為新字符串對象的value屬性。

可是你知道嗎?

這個substring並不是從來就是這樣的,在java6時它還是另外一副面孔哦。

上圖是java6中substring的部分代碼邏輯(因為下載java6的源碼幾次都沒有下載成功,沒辦法上java6的源碼圖了,後續下載成功後,我會把源碼圖粘貼到評論區,有興趣的朋友也可以自己去翻閱一下java6的源碼)。

可以看出來java6中的substring和我上面貼的java8中的是完全不一樣的。

java6之後的substring為什麼要做這樣的修改呢。

那是因為java6中那樣的邏輯是有問題的。

java6中截取後的字符串和原字符串公用了char數組。

比如從一個很長的字符串中截取很短的部分內容使用,即便原字符串在後面已經不再使用,但是因為截取後的字符串依舊引用了原字符串的數組。那這個只用了部分內容的很長的字符串數組就會很長時間不會被回收。

這樣就會造成資源的浪費,甚至可能會導致內存洩露。

今天算是扒了扒substring的前世今生了。

相關焦點

  • java中包名不能以java開頭
    java中自己寫的類的包名為什麼不能以java開頭?這是因為jvm在加載類的時候,連接階段,會做安全校驗,包名startsWith("java.")在運行期會報錯。具體是在ClassLoader.java中的preDefineClass方法:if ((name != null) && name.startsWith("java."))
  • Java中的字符串常用方法
    public int indexOf(String str): 返回指定字符串在此字符串中第一次出現處的索引。public int indexOf(int ch,int fromIndex):返回指定字符在此字符串中從指定位置後第一次出現處的索引。
  • java算法——字符組合排序
    編輯特別推薦:  題目:用1、2、2、3、4、5這六個數字,用java
  • 【java概念】String的常用方法
    接收字符的數組由target指定,target中開始複製子串的下標值是targetStart。  例:String s="this is a demo of the getChars method."5、toCharArray()6、equals()和equalsIgnoreCase() 比較兩個字符串7、regionMatches() 用於比較一個字符串中特定區域與另一特定區域,它有一個重載的形式允許在比較中忽略大小寫。
  • java常用幾大類庫
    例如,以下代碼使用戶能夠從 System.in 中讀取一個數:備註:System.in 系統輸入指的是通過鍵盤錄入數據。Scanner sc = new Scanner(System.in);int i = sc.nextInt();2.2 引用類型使用步驟導包使用import關鍵字導包,在類的所有代碼之前導包,引入要使用的類型,java.lang包下的所有類無需導入。
  • 8千字java反射乾貨|java反射精講
    反射的應用示例反射機制的概念:在運行狀態中,對於任意一個類,都能夠獲取到這個類的所有屬性和方法,對於任意一個對象,都能夠調用它的任意一個方法和屬性(包括私有的方法和屬性),這種動態獲取的信息以及動態調用對象的方法的功能就稱為java語言的反射機制。反射被視為動態語言的關鍵。簡單來說反射就是java的各種成分映射成對應的java類。
  • 【懶人筆記】JavaScript中substring()和substr()之間的用法和區別
    在JavaScript中,substr()和substring()函數都用於獲取字符串的指定部分,但它們之間存在細微差別。
  • java開發工程師 javascript的字符串
    冰凍三尺非一日之寒,希望大家在學習java的日子裡一定一定要堅持不懈,嚴格要求。多練,多問,多百度。祝大家早日成為一名優秀的軟體工程師! 字符串是不管在java前端還是後臺中都是用的最多最多的一個數據類型,所有前後臺交互的數據都是字符串String類型。那麼如何來定義String字符串呢,注意,用雙引號或者單引號引起來的一切的數據都是字符串。
  • {{ live.createTimestamp.substring(0,10) }}
    {{ live.updateTimestamp.substring(0,10) }}  {{ live.sysAuthors }} 直播員 {{ live.createTimestamp.substring(11,16) }}  {{ live.aContent }}  1">
  • 每日一課 | 如何在Java中填充字符串?
    JavaPadString1.javapackage com.mkyong; public class JavaPadString1 {             if (pads == padLen) {            return padStr.concat(str);        } else if (pads < padLen) {            return padStr.substring
  • Java字符串地查找操作
    在一個字符串中查找字符或子串是經常使用的操作。String類提供了兩種查找字符串的方法,分別是indexOf()和lastIndexOf(),這兩種方法都返回待查找字符或子串在字符串的起始索引位置。代碼如下:/** * @Title: StringSearchSample.java * @Packageunit * @Description: Java基礎知識課程案例
  • Java中有這玩意?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫一:簡潔二:方法引用三:Optional 可選值一:簡潔方法引用分為三種,方法引用通過一對雙冒號:: 來表示,方法引用是一種函數式接口的另一種書寫方式靜態方法引用,通過類名::靜態方法名, 如 Integer::parseInt實例方法引用,通過實例對象::實例方法,如 str::substring
  • Java中有這玩意?
    三:Optional 可選值  一:簡潔  方法引用分為三種,方法引用通過一對雙冒號:: 來表示,方法引用是一種函數式接口的另一種書寫方式    靜態方法引用,通過類名::靜態方法名, 如 Integer::parseInt    實例方法引用,通過實例對象::實例方法,如 str::substring
  • Longest Substring Without Repeating Characters
    Given a string, find the length of the longest substring without repeating characters.For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
  • 【外文翻譯】外國友人寫得很不錯的Java Lambda表達式入門教程,我終於翻譯好給大家啦!!!
    在本文中, 我們將從簡單到複雜的示例中見識 lambda 表達式和 stream 的強悍。環境準備如果還沒有安裝 Java 8, 那麼你應該先安裝才能使用 lambda 和 stream(譯者建議在虛擬機中安裝, 測試使用)。
  • sql中替換函數replace及截取字符串函數substring的用法
    結果:201504/16/201504161149414479.jpgselect replace('a','a','a'+'b')結果:ab --從第1位開始,獲取3位字符select substring
  • Java從零開始學 - 第65篇:常用的幾十個函數詳解
    mysql> select concat('路人甲','java'),concat('路人甲',null,'java');+---+---+| concat('路人甲','java')    | concat('路人甲',null,'java')    |+---+---+| 路人甲java                 | NULL
  • Java字符串之性能優化
    = -1 )    {        res.add( str.substring( prev, pos ) );        prev = pos + m_separator.length();     }    res.add( str.substring( prev ) );    return res;
  • 談談 Java 開發中的對象拷貝
    例如DO、DTO、VO、DAO等,這些實體的意義請查看DDD中分層架構。本文主要介紹幾種對象拷貝的方法1. 對象拷貝對象拷貝分為深拷貝和淺拷貝。根據使用場景進行不同選擇。- {@link SqlDateConverter}     *     <li>java.sql.Time.class - {@link SqlTimeConverter}     *     <li>java.sql.Timestamp.class - {@link SqlTimestampConverter}     *
  • LeetCode Top 100 高頻算法題 03:Longest Substring
    小編和實驗室同學之前面試找工作,也只刷了劍指offer和這top 100算法題,在實際面試中也遇到了很多LeetCode上的原題。劍指offer算法最優解之前和大家分享了,LeetCode Top 100這100道算法題,每道題小編都刷了很多遍,並且總結了一種最適合面試時手撕算法的最優解法。後續每天和大家分享一道LeetCode top 100高頻算法題,以及小編總結的最優解法。