Javaの配列の挙動を調べてみた
JavaにはCとかC++のようなポインタと言われるものは存在しません。メモリの開放であったりはガベージコレクタがやってくれてしまうので、基本的にJavaではメモリを気にせずにプログラムを書くことができます。しかし、オブジェクトを別の変数に代入したりするときに参照渡しをしていて、同じ実体を複数の変数から参照することがあります。その時の挙動に自信がなかったため配列でその挙動を確かめてみました。
JavaではC、C++のように参照値を直接取得することができないため、ObjectクラスのhashCodeメソッドを用いて参照値を取得します。hashCodeを用いて参照値を取得するプログラムを以下のように書きました。
public class Main { public static void main(String[] args) { int[] num1 = {1,2,3}; System.out.println(num1.hashCode()); int[] num2 = num1; System.out.println(num2.hashCode()); int[] num3 = test(num1); System.out.println(num3.hashCode()); } private static int[] test(int[] num){ System.out.println(num.hashCode()); return num; } }
実行結果
366712642 366712642 366712642 366712642
結果として、配列を他の変数に渡したり、メソッドの引数、返り値として受け取っても参照値は変わりませんでした。このことから基本的にJavaでは配列の受け渡しには参照値を受け渡していることがわかりました。