<<3.配列の目次
3.配列

問題1(難易度:1)                         2004年11月4日(木) 

次をコンパイル、実行後、a[0]、a[3]、a[4]の値はどうなりますか。それぞれ下から選びなさい。   

   1:   int[ ] a = new int[5];
   2:     for ( int i = 1; i < a.length - 1; i++) {
   3:        a[i] = i;
   4:   }

 
  A. 未定義
  B. null
  C. 0
  D. 1
  E. 2
  F.  3
  G. 4
  H. 5
  I.  2行目でコンパイルエラーになる。


解説
 1行目から、配列aは長さ5のint型の配列であることがわかります。よってa.lengthは5になります。

 繰り返しのiの値の変化を考えましょう。スタートは1ですね。条件「i<a.length−1」の右側は5−1=4になるので、「i<4」になります。つまりiは、1、2、3、と増えて4になったところで繰り返しを抜けます。iが4のときは「a[i]=i;」は行われません。よって、a[1]、a[2]、a[3]に、添字と同じ値が図のように代入されます。


 では何も代入されなかったa[0]とa[4]はどうなるのでしょう。未定義でしょうか?いいえ、配列は生成された時点で各配列要素に初期値が設定されています。配列の型によってその初期値は違ってくるのですが、数値を扱う型の場合0になります。よって図の黄色い部分には0が入っています。

 配列要素の初期値
   数値型(byte、short、int、long、float、double) は 0
   boolean は false
   char は ¥u0000
   参照型  は null

解答 a[0]はC  a[3]はF  a[4]はC

参考 読み物Java 第7章 一軒家よりアパート?

問題2(難易度:1)                             2004年11月20日
 長さ5のint型の配列aを宣言し、次のように値を設定したい。下の中から正しいものを
選択せよ。
    a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5

            A. int[] a;
                  a = {1, 2, 3, 4, 5};
                           
            B.  int[] a = {1, 2, 3, 4, 5};
    
            C.  int[5] a = {1, 2, 3, 4, 5};
      
            D.  int[] a;
                  a = new int[]{1, 2, 3, 4, 5};
  
解説
 配列は宣言時に{}を使って初期値の設定ができます。配列の長さは{}内に指定された値の数で決定されます。
 Aは宣言時に初期値を設定していないので、コンパイルエラーになります。
 Bが正しい設定の仕方です。
 Cは宣言の[]内に長さ指定をしてしまっているので、コンパイルエラーになります。
 Dは
   new int[]{1, 2, 3, 4, 5}
で名前のない配列を生成し、それをaに代入しているので、結果的に正しい設定になります。

解答 B D

参考 読み物Java 第7章 一軒家よりアパート?
問題3(難易度:2)                            2004年11月21日
 以下のクラスが、それぞれ別のソースファイルに定義されているものとします。クラスMainの
メソッドmainをコンパイル、実行しようとするとどうなるでしょうか。下から選びなさい。

  1: public class Main {
  2:
  3:        public static void main(String[] args) {
    4:              A obj = new A();
    5:              System.out.println(obj.m());
    6:      }
  7: }
  1: public class A {
    2:     int[] a = new int[3];
  3:
    4:     public int m() {
    5:             int[] b = new int[3];
    6:             int sum = 0;
    7:             for(int i = 0; i < b.length; i++) {
    8:                     if(a[i] == b[i]) {
    9:                             sum++;
  10:                      }
  11:              }
  12:              return sum;
  13:      }
 14: }

  A:クラスAの2行目でコンパイルエラーになる。
  B:クラスAの7行目でコンパイルエラーになる。
  C:クラスAの8行目でコンパイルエラーになる。
  D:「3」と出力される。
  E:「4」と出力される。
解説
 クラスAから見ていきましょう。配列aもbも、長さ3のint型の配列です。aはインスタンス変数、bは局所変数です。さてどちらも配列要素に値を入れていません。if文のところで、未定義のコンパイルエラーになるのでしょうか。
 
 問題1にあるように、配列は生成された段階で、各要素に初期値が設定されます。それはインスタンス変数でも局所変数でも同じです。初期値はint型の場合0ですから、a[0]〜a[2]、b[0]〜b[2]には、newで生成した段階ですべて0が入ります。

 for文での繰り返しでは、iの値が0から3−1=2まで変化するので、if文の条件の部分はすべて成立し、sumは毎回1ずつ増えます。よってsumは3になり、正解はDとなります。


解答 D

参照 読み物Java 第7章 一軒家よりアパート?
問題4(難易度:2)                                     2004年11月24日
次をコンパイル、実行するとどうなるでしょうか。下から選びなさい。
      1: String[] str = new String[4];
      2: str[0] = "abc";
      3:  str[1] = "de";
      4:  str[2] = "";
      5:  for(int i = 0; i < str.length; i++) {
      6:          System.out.println("*" + str[i].toUpperCase() + "*");
      7:  }
 A: *ABC*  と出力される
    *DE*
    **
    **

 B: *abc* と出力される
        *de*
        **
        **

 C: 6行目でコンパイルエラーになる
 D: 実行時に例外が発生する  
解説
 配列strはString型なので、参照型の配列になります。つまり各要素は何も設定されないと、「null」が入ることになります。strの長さは4なので、str[3]には何も代入されず、ここにはnullが入ります。

 次はStringのメソッドtoUpperCaseで、文字列の各文字を大文字に変換します。iが3のとき、str[i]はnullなので、例外(NullPointerException)が投げられます。よって正解はD。

解答 D

参照 読み物Java 第7章 一軒家よりアパート? 第11章 似て非なるもの
<<3.配列の目次次問題>>
Copyright (c) 2004 Nagi Imai All Rights Reserved..