<概要>配列を学びます。C++言語の動的配列にこれまた似ていらっしゃる(笑)!
●例題9-1 配列の宣言・代入・参照。
○プログラム
public class Heikin3{
public static void main(String[] args){
int[] ten;
int sum;
double heikin;
ten=new int[3];
ten[0]=63;
ten[1]=91;
ten[2]=75;
sum=0;
for(int i=0;i<3;i++){
sum+=ten[i];
}
heikin=sum/3.0;
System.out.println("国語は"+ten[0]+"点");
System.out.println("数学は"+ten[1]+"点");
System.out.println("英語は"+ten[2]+"点");
System.out.println("平均点は"+heikin+"点");
}
}
○実行結果
D:\atsushi\Java\List9-3>java Heikin3
国語は63点
数学は91点
英語は75点
平均点は76.33333333333333点
-- Press any key to exit (Input "c" to continue) --
○解説
3. int[] ten;
配列は参照型です。
したがって、変数はポインタです。
int[] なんて書かれると、こんな型があるかのような気さえしますが、
イメージとしては悪くありません。
Java言語の配列は変数が並んだものではなく、
どちらかというとクラスに近いのです。
この時点では、まだメモリ領域が確保されていないので、配列を使うことは出来ません。
7. ten=new int[3];
new は、新しくメモリ領域を確保するときに使う予約語です。
int 型変数 3 つ分の領域をメモリ上に確保しています。
そして、その領域を指すポインタを返し、ten がそれを保存しています。
要素の個数に 0 未満の値を指定することは出来ません。
0 を指定した場合、宣言としては正しい(コンパイルエラー無し)ですが、
配列を使うことは出来ません(使うと実行時に例外発生)。
C++言語の動的配列に似ていると思いませんか?
○補足
delete 演算子は存在しません。
ガーベッジコレクションが処理してくれます。
○補足2
実行結果の平均点をご覧下さい。
小数点以下 14 桁まで表示されています。
これだけの精度は保証しますよ、という意味なんでしょうかね?
●例題9-2 配列の長さを取得する。
○プログラム
public class Heikin4{
public static void main(String[] args){
int[] ten;
int sum;
double heikin;
ten=new int[5];
ten[0]=63;
ten[1]=91;
ten[2]=75;
ten[3]=45;
ten[4]=80;
sum=0;
for(int i=0;i<ten.length;i++){
sum+=ten[i];
}
heikin=(double)sum/ten.length;
System.out.println("国語は"+ten[0]+"点");
System.out.println("数学は"+ten[1]+"点");
System.out.println("英語は"+ten[2]+"点");
System.out.println("理科は"+ten[3]+"点");
System.out.println("社会は"+ten[4]+"点");
System.out.println("平均点は"+heikin+"点");
}
}
○実行結果
D:\atsushi\Java\List9-4>java Heikin4
国語は63点
数学は91点
英語は75点
理科は45点
社会は80点
平均点は70.8点
-- Press any key to exit (Input "c" to continue) --
○解説
ten.length は、int 型配列 ten の要素の個数(長さ、サイズ)を表しています。
(double)sum は、int 型変数 sum を double 型にキャストしています。
キャストの方法はC言語、C++言語と一緒ですね。
○補足
ten.length は、配列 ten のフィールドです。
●例題9-3 配列を初期化する。
○プログラム
public class Heikin5{
public static void main(String[] args){
int[] ten={63,91,75,45,80};
int sum;
double heikin;
sum=0;
for(int i=0;i<ten.length;i++){
sum+=ten[i];
}
heikin=(double)sum/ten.length;
System.out.println("国語は"+ten[0]+"点");
System.out.println("数学は"+ten[1]+"点");
System.out.println("英語は"+ten[2]+"点");
System.out.println("理科は"+ten[3]+"点");
System.out.println("社会は"+ten[4]+"点");
System.out.println("平均点は"+heikin+"点");
}
}
○実行結果
D:\atsushi\Java\List9-5>java Heikin5
国語は63点
数学は91点
英語は75点
理科は45点
社会は80点
平均点は70.8点
-- Press any key to exit (Input "c" to continue) --
○解説
3. int[] ten={63,91,75,45,80};
int 型配列を指すポインタを宣言すると同時に初期化しています。
注目すべきは、new 演算子を用いて明示的にメモリ領域を確保していないことですね。
●例題9-4 配列のサイズを動的に変更する。
○プログラム
public class Heikin5a{
public static void main(String[] args){
int[] ten=new int[1];
int sum=0;
double heikin;
ten=new int[4];
ten=new int[]{63,91,75,45,80};
ten=new int[]{10,20,30};
for(int i=0;i<ten.length;i++){
sum+=ten[i];
}
heikin=(double)sum/ten.length;
for(int i=0;i<ten.length;i++){
System.out.println("ten["+i+"]="+ten[i]);
}
System.out.println("heikin="+heikin);
}
}
○実行結果
D:\atsushi\Java\p217>java Heikin5a
ten[0]=10
ten[1]=20
ten[2]=30
heikin=20.0
-- Press any key to exit (Input "c" to continue) --
○解説
3. int[] ten=new int[1];
こうやって書くと、ますますC++言語の動的配列にソックリですね。
int 型配列を指すポインタの宣言とメモリ領域の確保を行っています。
次の二文を一つにまとめたものであり、まとめて書いた方が一般形でしょう。
int[] ten;
ten=new int[1];
ten.length は 1 を表しています。
7. ten=new int[4];
先に確保したメモリ領域を解放することなく、新しいメモリ領域を確保しています。
実は配列のサイズを変更したのではなく、別のメモリ領域を確保しています。
先に確保した領域はガーベッジ(ごみ)となりましたが、まだ存在しています。
ten は新しいメモリ領域を指すことになります。
ten.length は 4 を表しています。
8. ten=new int[]{63,91,75,45,80};
更に別のメモリ領域を確保しています。
ten は新しいメモリ領域を指すことになります。
ten.length は 5 を表しています。
このような書き方に対応したのは JDK1.1 からです。
9. ten=new int[]{10,20,30};
更に別のメモリ領域を確保しています。
ten は新しいメモリ領域を指すことになります。
ten.length は 3 を表しています。
C++言語で動的配列のサイズを変更する為には、
delete してから、new する必要がありましたが、
Java言語では new するだけで(見かけ上の)配列のサイズを変更できるのです。
と言うより、C++言語で delete せずに、new したも同然ですけどねー。
だって、delete はガーベッジコレクションがやってくれるんですから。
○補足
あまり意味はありませんが、
int[] ten=new int[]{1,2,3,4,5};
といった書き方も出来ます。
int 型配列を指すポインタを宣言すると同時に初期化しているのですね。
○補足2
C++言語でも delete せずに、new し続けることが出来ます。
明らかに間違いですが、エラーも警告も出ません。
でもやっぱり、メモリ領域は自分でちゃんと解放しましょうね。
//プログラム
#include<iostream.h>
int main()
{
int *p;
p=new int[3];
p[2]=10;
p=new int[5];
p[4]=20;
for(int i=0;i<5;i++)
cout<<p[i]<<endl;
return 0;
}
//実行結果
-842150451
-842150451
-842150451
-842150451
20
Press any key to continue