Java中堆和棧是非常重要的兩個概念,堆主要存儲對象(在內(nèi)存泄漏討論時會非常明顯),棧主要用于存儲局部變量和方法參數(shù)。
下面是幾個Java堆和棧的面試題:
//1. 下列代碼的輸出結(jié)果為什么? public static void main(String[] args) { String a = "hello"; String b = "world"; String c = a + b; String d = "helloworld"; System.out.println(c == d); } //輸出結(jié)果為false,因為c不是使用字面值拼接出來的,而是通過 + 拼接的兩個變量,所以c和d在堆中的位置并不相同,即它們的引用地址不一樣。
//2. 下列代碼的輸出結(jié)果是什么? public static void main(String[] args) { Object object = new Object(); object.toString(); } //輸出結(jié)果為 java.lang.Object@hashCode,toString() 方法輸出的是 Object 類的哈希值,默認實現(xiàn)是 @hashcode。在內(nèi)存中,對象被存放在堆內(nèi)存中,所以 object 的地址是在堆中。
//3. 下列代碼的輸出結(jié)果是什么? public static void main(String[] args) { int a = 1; int b = change(a); System.out.println(b); } private static int change(int a) { a = 2; return a; } //輸出結(jié)果為2,change() 方法并未改變原變量 a,而是創(chuàng)建了一個新的變量 a,a=2,接著返回了 a,即2,賦值給了變量 b。
總之,在Java中,堆和棧是兩個非常重要的概念,在編寫代碼時需要注意對它們的使用,避免出現(xiàn)不必要的錯誤。