String常量池如何理解?
String常量池問題,答主根據自己的理解來簡單說說吧!
為什么需要有String 的常量池原因其實就是因為String類是final修飾的,被final修飾的類各位小伙伴應該都知道是不能被基礎的,也就是說創建String類型的變量賦值,在從新給它賦值實際上在內存中是會再次開辟空間來存儲這個值。那么String類型和其它的引用類型一樣創建會消耗很大內存空間,從而會影響到程序的性能。所以jvm為了節約資源,給String開辟了一個字符串常量池,那么每次要創建新的Strig你對象的時候都會到字符串常量池中先去看看有沒有這個值,有的話那就直接引用,不需要創建。沒有的話創建完畢之后在放入到字符串常量池中。
什么是String常量池要理解什么是String常量池需要了解所謂的堆,棧,方法區。這里我就不做過多解釋,如果有不懂的小伙伴自己區查找資料去看看。這里我就簡單說說:
堆:一般放對象,那么也是GC常常光顧的地方
棧:一般放引用
方法區:一般放公共的資源,比如說被Static修飾的靜態成員,包括final修飾的成員;
那么知道了他們的作用,我們在來通過下面的代碼和內存分配圖來理解理解字符串的常量池:示例:String a="abc";
String b="abc";
String c=new String("abc");
根據上面的代碼答主自己畫的內存圖:
通過上面的這個圖我們來看看什么是常量池:
當我們創建了字符串變量a值為“abc”,當我們再次創建字符串變量b值和a一樣,那么這個時候字符串b會到常量池中區找有沒有“abc”這個值,有就直接引用;當我們在通過new方式再次創建一個對象c,它其實是在堆內存中創建了一個字符串對象,然后最后的值還是指向了字符串常量池中的已經存在的“abc”;
String常量池的作用是什么通過上面的說明相信大家應該知道了String常量池的作用了,就是為了增加程序性能,減少頻繁創建String對象帶來的不必要的內存消耗和線程資源。
String面試題會被問到嗎?一般情況現在的是很少問答關于String的面試題了。如果真的問到了的話其實多半面試官想了解了解你對Java的jvm理解了。可能在幾年前這種類似的問題還會問的稍微多那么一點點。所以題主還是多花點時間去了解jvm可能會更加好一點。
Java虛擬機內存結構圖總結:String常量池的存在就是為了增加程序效率的,那么它的內存圖也不難理解,并且現在的面試中一般也很少去問到這類問題,所以可以花點時間去多學習Java的jvm會比較好點。
以上是答主自己的理解,如果覺得幫到各位了,麻煩給個贊,或者有更好理解的小伙伴可以在下方評論區留言,點個關注我們一起探討探討。