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

配列数0の配列は作れる(Java)

More than 3 years have passed since last update.

 当たり前だ馬鹿野郎と思った方はすみませんな備忘録

配列に情報を追加したい

 例えばこんな感じのクラスがあるとします。

Book.java
class Book {       //本クラス
    private String hogehoge; //本の情報

    ----コンストラクタとかセッターとか----
}

このBookクラスを管理するBooksクラスがあるとします。

Books.java
class Books {
    private Book[] books; //本の配列

    public Books() {
        ----booksの初期化----
    }

    public void insert() { //本の情報を追加する
        -------- 
  }
}

 books配列にBook型の変数を追加する形です。insertした結果、配列数が1つ増えたものがbooksに代入されるとします。
 ここで1つ問題にぶち当たるわけです。

 「booksはどう初期化してやればよいのか?」

 初期では本の情報は何も入れてないと仮定すると、下手に配列を作成できないなと思うわけです。

nullで初期化

 最初に考えた方法は、booksにnullを与えてやろうと思いました

 books = null;

 ただこれだと、例えばbooks.lengthとかやるとヌルポが発生します。
 nullが入っているのでlengthを使ってもコンパイル通ります。辛い。
 しかし実際にここでbooks.lengthに出てほしい情報は0なわけです。何もないわけですから。
 nullを与えると、メインで回している方にツケが回ってくるわけですね。わざわざ例外処理書かなきゃならないし。
 

配列数0の配列で初期化

 主題です。
 配列数0の配列が作れるらしいですね。
 
 books = new Book[0];
 
 これにbooks.lengthをすると0が返ってきます。望んだ処理です。
 しかしこれどういう処理をしているんでしょうか。
 望んだ結果ですけども、この中身のない実体はなにをどう作っているのか気になります。
 誰か教えて下さい。
 

色々な方法で試してみた。

EmptyTable.java
public class EmptyTable {
    public static void main(String[] args) {
        int[] table1 = new int[0];
        System.out.println(table1.length); // -> 0

        System.out.println(table1[0]);     // -> ArrayIndexOutOfBoundsException

        int[] table2 = {};
        System.out.println(table2.length); // -> 0

        int[] table3 = null;
        System.out.println(table3.length); // -> ガッ

        int[] table4;
        System.out.println(table4.length); // -> コンパイルエラー
    }
}

最後に

 (リストを使えというのは禁止ワードです。)

Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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