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

« 自分専用のニュース

さくらVPSからさくらクラウドへ移行している最中 »

blog comments powered by Disqus

Categories

Uncategorized (rss) (2) | blogofile (rss) (2) | designpettern (rss) (3) | flask (rss) (2) | fluxflex (rss) (3) | java (rss) (6) | nginx (rss) (6) | python (rss) (8) | sacloud (rss) (3) | spdy (rss) (2) | thistownneedsguns (rss) (2) | webService (rss) (2) | zabbix (rss) (3) | さくらVPS (rss) (4) | 芸術は爆発しろ (rss) (3) |