JAVAのheapとstack

JAVAのheapとstackがよく理解できていませんでしたので、サンプルコードを参考にどうなっているかを説明します。間違いがありましたら、指摘をお願いしたいですね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class SpamAndEgg{
    public static void main(String[] params){
        String s = "stringggggg";
        int i = Integer.MAX_VALUE;
        // 関数呼び出し
        spam(s, i);
        // 結果出力
        System.out.println("main: s=" + s); // 3.何が出力される?
        System.out.println("main: i=" + i); // 4.何が出力される?
    }
    public static void spam(String s, int i){
        s = "eggggggggggg";
        i = Integer.MIN_VALUE;
        // 結果出力
        System.out.println("spam: s=" + s); // 1.何が出力される?
        System.out.println("spam: i=" + i); // 2.何が出力される?
    }
}

spam: s=eggggggggggg
spam: i=-2147483648
main: s=stringggggg
main: i=2147483647

図解

箇条書き

  • JAVAは、プリミティブでもオブジェクトでも値渡し。
  • オブジェクトの場合、heapのアドレス値を値渡しする。
    • immutableのStringで確かめました。
  • 関数が呼び出されるたびに、STACKが生成する。
  • JVMには、String定数プールがある。

muttableのStringbufferでやると、こうなる

class SpamAndEgg2{
    public static void main(String[] params){
        StringBuffer sb = new StringBuffer("stringggggg");
        spam(sb);
        System.out.println("main: sb=" + sb.toString());
    }
    public static void spam(final StringBuffer sb){
        sb.append("eggggggggggg");
        System.out.println("spam: sb=" + sb.toString()); 
    }
}

spam: sb=stringgggggeggggggggggg
main: sb=stringgggggeggggggggggg
Read and Post Comments

« Previous Page