上一篇我們講了Java中的陣列,其實是為本章的內容做準備的,String這個類是我們在寫Java程式碼中用得最多的一個類,沒有之一,今天我們就講講它,我們開啟String這個類的原始碼:
宣告瞭一個char[]陣列,變數名value,宣告瞭一個int型別的變數hash(hash的作用我們後續會講),話不多說,上程式碼:
我們點開建構函式看一下:
多年以前,我看到這段程式碼時我是懵逼的,沒錯,我現正在準備構造一個String的物件,那original這個物件又是從何而來?是什麼時候構造的呢?
在Java中,當值被雙引號引起來(如本示例中的"abc"),JVM會去先檢檢視一看常量池裡有沒有abc這個物件,如果沒有,把abc初始化為物件放入常量池,如果有,直接返回常量池內容。下圖是預先處理String str = new String("abc")的引數"abc"
接下來處理new關鍵字,在堆記憶體中開闢空間,由於hash這個欄位是int型別的,成員變數初始化預設值為0。
處理建構函式邏輯,hash是值型別,直接賦值,陣列為引用型別,直接指向地址。
繼續上圖
最後執行String str2 = new String("abc"),結果如下圖:
利用IDE的debug功能看一下,char陣列裡已經有了'a','b','c'這些值。
下面我們來看一下String這個類下面這些常用的API是如何實現的:
很簡單對吧,可怕的不是原始碼難讀,而是不想,害怕去讀原始碼的心。如果文章得到了你的認可,請為我的文章點贊,你的贊同是我繼續下去的動力。
注:文中的圖,只是畫物件在JVM中大致的樣子,以方便大家理解。如果大家想更深層次的研究JVM,推薦大家看深入理解java虛擬機器一書。
如果喜歡本系列文章,請為我點贊或順手分享,您的支援是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最後別忘了關注一下我。
下一篇:Java基本資料型別和引用型別 - Java那些事兒
轉載無限歡迎,但請註明「作者」和「原文地址」。轉載請在文中保留此段,感謝您對作者版權的尊重。如需商業轉載或刊登,請聯絡作者獲得授權。