2019.7.16 java堆棧常量池

一.概念
棧:存放基本數據類型的變量和對象的引用
堆:存放new出來的對象(存放對象實例和數組,GC 管理的主要區域。)
常量池:顧名思義,存放字符串常量和基本數據類型常量(public static final
靜態域:顧名思義,存放靜態成員(static定義的)

  • 棧和常量池中的對象可以共享,堆中的對象不能共享。
  • 棧中的數據大小和生命週期是可以確定的,當沒有引用指向數據時,這個數據就會消失
  • 堆中的對象的由垃圾回收器負責回收,因此大小和生命週期不需要確定,具有很大的靈活性。
  • 對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。

二.圖示
String str = “abc"創建對象的過程
1 首先在常量池中查找是否存在內容爲"abc"字符串對象
2 如果不存在則在常量池中創建"abc”,並讓str引用該對象
3 如果存在則直接讓str引用該對象

也就是有道面試題: String s = new String(“abc”); 產生幾個對象?
一個或兩個。如果常量池中原來沒有 ”abc”, 就是兩個。如果原來的常量池中在“abc”時,就是一個。

String s1 = “china”;
String s2 = “china”;
String s3 = “china”;
String ss1 = new String(“china”);
String ss2 = new String(“china”);
String ss3 = new String(“china”);
在這裏插入圖片描述
最後,說明一道經典的面試題

public class Test {  
    public static void main(String[] args) {  
        String a = "abc";  
        String b = "abc";  
        String c = new String("abc");  
        String d = "ab" + "c";  
        System.out.println("a == b" + a == b); //true 
        System.out.println("a == c" + a == c); //false   
        System.out.println("a == d" + a == d); //true 
        System.out.println("b == c" + b == c); //false   
        System.out.println("b == d" + b == d); //true  
        System.out.println("c == d" + c == d); //false   
    }  
}  

==比較的是地址,a,b,c都是指向相同常量值的同一個地址,c是new出來的指向堆的地址

轉載:https://blog.csdn.net/lk274857347/article/details/77512555

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章