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定数プールがある。
- string literal poolこれを読んだ方が理解するが早そう。
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