Help us understand the problem. What is going on with this article?

Javaの配列変数は参照型

Javaの配列変数は参照型。

当たり前な基礎的なことだと思いますが、元々PHPをしていたので、
自身の備忘録のため、少しまとめてみました。

例えば、下記のようなコードの場合には100が出力される。

int[] a = { 1, 2, 3 };
int[] b = a;
b[0] = 100;
System.out.println(a[0]);
// a[0]は100が出力される。

これは、Javaの配列変数が参照型なので、int[] a には配列が作られた
メモリアドレスが格納されるため。

例えば、int[] a で作成された配列のメモリアドレスがABC123(実際はこんなメモリアドレスはないと思います)だとすれば、
このABC123というメモリアドレス(場所)に配列aが記録されている。

そしてint[] b に入っているのは配列変数int[] a のメモリアドレスであるABC123が入るので、要は同じ配列ということになる。
そのため、 b[0]=100 は a[0]=100 と同じことになる。

これがPHPで同様の下記コードを書いてみると、100ではなく1が出力される。

$a = [1,2,3];
$b = $a;
$b[0] = 100;
echo $a[0];
// 1が出力される

これはPHPの場合は参照型ではなく、値渡しになるため、
\$bには\$aのメモリアドレスではなく、\$aの配列そのものがコピーして渡されているため。

PHPでは参照型にするためには、下記のように&をつけてあげる必要がある。

$a = [1,2,3];
$b = &$a;
// ↑$aの前に&をつける
$b[0] = 100;
echo $a[0];
// 100が出力される

こうすることで参照型になり、\$bには\$aで作成された配列のメモリアドレスが
格納されるため、上記のJavaの場合と同様の動作になる。

k_p_g
前職では、GCPを用いた動態管理のWEBアプリケーションの開発に携わっていました。 現在は離職中ですが、php、JavaScript、HTML、CSSなどをちびちび勉強中です!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away