關於常量池

關於常量池

    首先要知道JVM運行時數據劃分爲六種:程序計數器、JAVA棧、方法區、JAVA堆、本地方法區,運行時常量池。其中,運行時常量池也在方法區中!而且我們通常所說的常量池就是運行時常量池。

先看下面的代碼:

String s1 = "a";
		String s2 = "b";
		s1 = s1+s2;

    內存結構圖如下:

    
    String 對像是不可變的對像,如果對字符串作出修改,將創建新的對像。

    只要採用雙引號賦值的字符串,在編譯期都會被放到方法區中的字符串的常量池中。運行期如果對字符串進行相加減則會放到堆中(放之前會先驗證方法區中是否含有相同的字符串常量,如果存在,把地址返回,如果不存在,先將字符串放到常量池中,然後再返回該對像的地址)


    再看如下代碼:   

String s1 = "abc";
		String s2 = "abc";
		String s3 = new String("abc");


    1. 如果是採用雙引號引起來的字符串常量,首先會到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的數據是在編譯期賦值的,也就是生成class文件時就把它放到常量池裏了,所以s1和s2都指向常量池中的同一個字符串“abc”。
    2. 因爲s3採用的是new的方式,在new的時候存在雙引號,所以他會到常量區中查找“abc”,而常量區中存在“abc”,所以常量區中將不再放置字符串,而new關鍵字在堆中分配內存,所以在堆中創建一個對像abc,s3指向這個對像。


    面試題:下面的代碼創建幾個對像?

String s1 = new String("abc");
		String s2 = new String("abc");

    答案:三個,內存分配如下:

    


    通過以上分析:

    1. String類常量不建議採用new來分配,因爲new會分配兩個對像。

    2. 對字符串拼接來講,會產生很多中間對像,所以性能降低。


發佈了105 篇原創文章 · 獲贊 34 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章