目次 | |

21. パッケージjava.util


パッケージ java.util は,種々のユーティリティクラス及びインタフェースを含む。

ユーティリティの中で特徴的なものには,インタフェース Enumeration がある。このインタフェースを実装したオブジェクトは,項目の列を生成し,必要に応じて一つずつ項目を渡す。Dictionary 及び Vector などのコンテナクラスは Enumeration を返す一つ以上のメソッドを提供する。

BitSet は,非負整数を表現するのに使用可能なビットのインデクス付きの集まりを含む。

クラス Date は,日時情報を表現し操作するのに便利な方法を提供する。日時情報は,年,月,日,時,分及び秒によって構成でき,これら六つの要素は,曜日とともに日時情報から取り出すことができる。時間帯及び夏時間も適切に考慮する。

抽象クラスの Dictionary は,索引キーと値との対の集まりであり,索引キーを与えて値を取り出せる。クラス Hashtable は,Dictionary の一つの具体的な実装とする。クラス Properties は,Hashtable の拡張とし,あるテーブルが他のテーブルにデフォルト値を与えることを可能にし,ファイルからのエントリの読出し及びファイルへのエントリの書出しの標準的手段を提供する。

クラス Observable は,オブジェクト Observable が変化するときに,“観測者”と呼ぶ他のオブジェクトに通知する機構を提供する。観測者オブジェクトは,インタフェース Observer を実装する任意のオブジェクトあってよい。(この通知機構は,クラス Object (20.1)のメソッド wait 及びメソッド notify が提供するものとは違い,スレッドスケジューリング機構とは結び付いていない。)

クラス Random は,種々のプリミティブ型の数値を種々の分散で疑似乱数的に発生する手法の拡張集合を提供する。クラス Random のインスタンスは,独立した疑似乱数発生器とする。

StringTokenizer は,列を分けてトークンとする簡単な方法を提供する。トークンを区切る文字の集合は,設定可能とする。トークン切り出しメソッドは,クラス java.io.StreamTokenizer で使用されているメソッドよりもはるかに簡単なものを用いている。例えば StringTokenizer は,識別子,数及び引用文字列を区別せず,注釈の認識及びスキップを行わない。

クラス Vector 及び Stack は,Java配列を拡張する単純なコンテナクラスとする。Vector は,Java配列とは違って,そのサイズを変えることができ,追加,削除及び項目の検索などをするために多くの便利なメソッドを提供する。Stack は,push 及び pop などの付加的な操作をもつ Vector とする。

パッケージ java.util で定義するクラス階層を次に示す。(ここで名前が太字で示されるクラスがパッケージ java.util 内に存在する。それ以外はパッケージ java.lang に存在し,サブクラス関係を明確にするために示す。)

Object                                                     20.1
    interface Enumeration                                  21.1
    BitSet                                                 21.2
    Date                                                   21.3
    Dictionary                                             21.4
        Hashtable                                          21.5
            Properties                                     21.6
    Observable                                             21.7
    interface Observer                                     21.8
    Random                                                 21.9
    StringTokenizer                                        21.10
    Vector                                                 21.11
        Stack                                              21.12
    Throwable                                              20.22
        Exception
            RuntimeException
                EmptyStackException                        21.13
                NoSuchElementException                     21.14

21.1 インタフェース java.util.Enumeration

インタフェース Enumeration を実装するオブジェクトは,1度に一つの要素列を生成する。メソッド nextElement を繰り返し呼び出すことによって,列中の各要素を順次返す。

public interface Enumeration {
    public boolean hasMoreElements();
    public Object nextElement() throws NoSuchElementException;
}

21.1.1 public boolean hasMoreElements()

列挙(enumeration)オブジェクトが,少なくとももう一つの提供する要素をもつときに限って,結果を true とする。

21.1.2 public Object nextElement()
throws NoSuchElementException

列挙オブジェクトが,少なくとももう一つの提供する要素をもつならば,その要素を返す。それ以外の場合には,NoSuchElementException が投げられる。

ハッシュテーブル ht 内のすべてのキー及びキーの長さを表示するコード例を次に示す。メソッド keys は,すべてのキーを配布する列挙を返す。この例では,キーを文字列とした場合を示す。


Enumeration e = ht.keys();
while (e.hasMoreElements()) {
    String key = (String)e.nextElement();
    System.out.println(key + " " + key.length());
}

21.2 クラス java.util.BitSet

オブジェクト BitSet は,必要に応じて拡張されるビットの集合とする。BitSet のビットは非負整数によってインデクス付けする。各ビットは各々,チェック,設定又は解除を可能とする。一つの BitSet のAND,OR及びXORの各演算によって,もう一つ BitSet の内容を修正する。

public final class BitSet implements Cloneable {
    public BitSet();
    public BitSet(int nbits);
    public String toString();
    public boolean equals(Object obj)
    public int hashCode();
    public Object clone();
    public boolean get(int bitIndex);
    public void set(int bitIndex);
    public void clear(int bitIndex);
    public void and(BitSet set);
    public void or(BitSet set);
    public void xor(BitSet set);
    public int size();
}

21.2.1 public BitSet()

このコンストラクタは,新たに生成した BitSet を初期化し,すべてのビットをクリアする。

21.2.2 public BitSet(int nbits)

このコンストラクタは,新たに生成した BitSet を初期化し,すべてのビットをクリアする。0 から nbits-1 までの範囲のインデクスで,明示的にビットを表現するために十分な領域を確保する。

21.2.3 public String toString()

BitSet の設定状態にあるビットをもつインデクスすべてに対して,そのインデクスの10進表現を結果に含む。インデクスは小さな値から並ぶものとし,", "(コンマ及びスペース)で区切り,波括弧で囲む。その結果,整数集合の通常の数学記法を返す。

このメソッドは,Object (20.1.2)の メソッド toString を置き換える。

例:

BitSet drPepper = new BitSet();

ここで,drPepper.toString()"{}" を返す。

drPepper.set(2);

ここで,drPepper.toString()"{2}" を返す。


drPepper.set(4);
drPepper.set(10);
ここで,drPepper.toString()"{2, 4, 10}" を返す。

21.2.4 public boolean equals(Object obj)

引数が null でなく,すべての非負 int インデクス k に対し次の条件を満たす,オブジェクト BitSet であるときに限って,結果を true とする。

((BitSet)obj).get(k) == this.get(k)
このメソッドは,Object(20.1.3)のメソッド equals を置き換える。

21.2.5 public int hashCode()

ハッシュコードは,どのビットが BitSet 内で設定されていたかだけに依存する。この計算に使用するアルゴリムを次に示す。

BitSet 内のビットを,例えば bits と呼ぶ long 整数の配列内に記録する。ただし,次の表現が正しいときに限り, BitSet 内のビット kk の値は非負)を設定する。


((k>>6) < bits.length) &&
                ((bits[k>>6] & (1L << (bit &
 0x3F))) != 0)
このとき,次のメソッド hashCode の定義を実際のアルゴリズムの正しい実装とする。


public synchronized int hashCode() {
    long h = 1234;
    for (int i = bits.length; --i >= 0; ) {
        h ^= bits[i] * (i + 1);
    }
    return (int)((h >> 32) ^ h);
}
ビットの集合が変化すればハッシュコード値が変化することに注意。

このメソッドは,Object(20.1.4)のメソッド hashCode を置き換える。

21.2.6 public Object clone()

BitSet のクローニングは,その BitSet に等しい新しい BitSet を生成する。

このメソッドは,Object(20.1.5)のメソッド clone を置き換える。

21.2.7 public boolean get(int bitIndex)

インデクス bitIndex をもつビットが,現在この BitSet に設定されているならば,結果を true とする。それ以外の場合には,false とする。

bitIndex が負ならば,IndexOutOfBoundsException が投げられる。

21.2.8 public void set(int bitIndex)

BitSet 内のインデクス bitIndex のビットを“セット”(true)状態に変える。

bitIndex が負ならば,IndexOutOfBoundsException が投げられる。

bitIndex がメソッド size (21.2.13)が返す値よりも小さくないならば,この BitSet のサイズを bitIndex よりも大きくする。

21.2.9 public void clear(int bitIndex)

BitSet 内のインデクス bitIndex のビットを“クリア”(false)状態に変える。

bitIndex が負ならば,IndexOutOfBoundsException が投げられる。

bitIndex が,メソッド size (21.2.13)が返す値よりも小さくないならば,この BitSet のサイズを bitIndex よりも大きくする。

21.2.10 public void and(BitSet set)

いくつかのビットをクリアすることによって BitSet を修正できる。すべての非負 int インデクス k に対し,set のビット k をクリアしているならば,BitSet のビット k をクリアする。

21.2.11 public void or(BitSet set)

いくつかのビットを設定することによって BitSet を修正できる。すべての非負 int インデクス k に対し,set のビット k が設定されているならば,BitSet のビット k を設定する。

21.2.12 public void xor(BitSet set)

いくつかのビットを反転することによって BitSet を修正できる。すべての非負 int インデクス k に対し,set のビット k が設定されているならば,BitSet のビット k を反転する。

21.2.13 public int size()

このメソッドは,ビット値の表現のためにこの BitSet が実際に使用する領域のビット数を返す。

21.3 クラス java.util.Date

クラス Date は,システム独立な抽象表現の日時情報をミリ秒の精度で提供する。日時情報は,年,月,日(何月何日の日),時,分及び秒で構成する。この6個の要素と曜日を取り出せる。日時情報は比較可能とし,可読文字列に変換可能とする。

public class Date {
    public Date();
    public Date(long time);
    public Date(int year, int month, int date);
    public Date(int year, int month, int date, int hours, int minutes);
    public Date(int year, int month, int date,
                int hours, int minutes, int seconds);
    public Date(String s) throws IllegalArgumentException;
    public String toString();
    public boolean equals(Object obj);
    public int hashCode();
    public int getYear();
    public void setYear(int year);
    public int getMonth();
    public void setMonth(int month);
    public int getDate();
    public void setDate(int date);
    public int getDay();
    public int getHours();
    public void setHours(int hours);
    public int getMinutes();
    public void setMinutes(int minutes);
    public int getSeconds();
    public void setSeconds(int seconds);
    public long getTime();
    public void setTime(long time);
    public boolean before(Date when);
    public boolean after(Date when);
    public String toLocaleString();
    public String toGMTString();
    public int getTimezoneOffset();
    public static long UTC(int year, int month, int date,
                           int hours, int minutes, int seconds);
    public static long parse(String s)
        throws IllegalArgumentException;
}
例:

クラス Date は協定世界時UTC(Coordinated Universal Time)を反映するが,Javaシステムのホスト環境に依存し,必ずしも正確でなくともよい。最近のほとんどすべてのオペレーティングシステムは,いかなる場合でも,1日 == 86400 s としている。しかしUTCでは,約1年又は2年に1度,“うるう秒”と言う余分な1秒が存在する。うるう秒は,常に1日の,それも殆んど常に12月31日又は6月30日の,最後の1秒に付け加える。例えば,1995年の最後の1分は,うるう秒を付け加えて61秒とした。 ほとんどの現在のコンピュータクロックは,うるう秒の違いを反映できるほど十分には正確ではない。世界時 UT(Universal Time)と等価なグリニッチ平均時 GMT(Greenwich Mean Time)によって定義されるコンピュータ規格も存在する。その規格では,“通俗な”名前を GMT,“科学的な”名前を UT としている。UTC 及び UT の違いは,原子時計に基づくものを UTC とし,天文観測に基づくものを UT とする。実用目的ではその差はほとんどない。地球の回転は一様ではなく,複雑な方法で遅く又は速くなるので,UT は常に一様には流れていない。うるう秒は,ある修正を施した UT の版であるUT1の 0.9 秒内に UTC を収めるために必要で導入した。

参考 これ以外の日時システムも存在する。例えば,GPS(the satellite-based Global Positioning System)で使用する時間スケールは,UTC と同期するが,うるう秒の調整はない。これ以外の興味深い情報には,“the U. S. Naval Observatory”,特に次のWWWサイトからアクセス可能な“the Directorate of Time”がある。

http://tycho.usno.navy.mil
次のWWWサイトからアクセス可能な“Systems of Time”の定義も興味深い。

http://tycho.usno.navy.mil/systime.html

年,月,日(何月何日の日)時,分及び秒の値を受け取るクラス又は返すクラス Date のすべてのメソッドは,次の表現を使用する。

すべての場合において,上記の目的のためにメソッドに与えられる引数が指定された範囲に入る必要はない。例えば,日時情報を1月32日と指定してもよい。これは2月1日の意味と解釈する。

21.3.1 public Date()

このコンストラクタは,新しく生成したオブジェクト Date を初期化し,ミリ秒単位で測って生成時刻に最も近い瞬間を表現する。

21.3.2 public Date(long time)

このコンストラクタは,新しく生成したオブジェクト Date を初期化し,“エポック”として知られる基準時刻,つまり,グリニッチ平均時1970年1月1日00:00:00,から time ms 後の時刻の瞬間を表現する。クラス System のメソッド currentTimeMillis (20.18.6)も参照のこと。

21.3.3 public Date(int year, int month, int date)

このコンストラクタは,新しく生成したオブジェクト Date を初期化し,地域時間帯における year 引数,month 引数及び date 引数によって指定する日の午前零時を表現する。これは,次のコンストラクタ呼び出しと同じ効果をもつ。 (21.3.5)

Date(year, month, date, 0, 0, 0) 

21.3.4 public Date(int year, int month, int date,
int hours, int minutes)

このコンストラクタは,新しく生成したオブジェクト Date を初期化し,地域時間帯における yearmonthdatehours 及び minutes の引数によって指定する分の最初の瞬間を表現する。これは,次のコンストラクタ呼び出しと同じ効果をもつ。 (21.3.5)

Date(year, month, date, hours, minutes, 0)

21.3.5 public Date(int year, int month, int date, int hours, int minutes, int seconds)

このコンストラクタは,新しく生成したオブジェクト Date を初期化し,yearmonthdatehoursminutes 及び seconds の引数によって指定する地域時間帯における秒の最初の瞬間を表現する。

21.3.6 public Date(String s)
throws IllegalArgumentException

このコンストラクタは,新しく生成したオブジェクト Date を初期化し,文字列 sによって指定する日時をメソッド parse(21.3.31)を使ったかのように解釈して,その日時を表現する。

21.3.7 public String toString()

オブジェクト Date を,次の形式の String に変換する。

"dow mon dd hh:mm:ss zzz yyyy"
ここで,各表現は次のとおりとする。

メソッド toLocaleString(21.3.27)及び toGMTString(21.3.28)も参照のこと。

このメソッドは,Object(20.1.2)の メソッド toString を置き換える。

21.3.8 public boolean equals(Object obj)

引数が null でなく,このメソッドをもつオブジェクト Date とミリ秒まで同じ時刻のオブジェクト Date であるときに限り,結果を true とする。このように,二つのオブジェクト Date は,メソッド getTime(21.3.23)で両方が同じ long 値を返すときに限り,等しいとする。

このメソッドは,Object (20.1.3) のメソッド equals を置き換える。

21.3.9 public int hashCode()

結果は,メソッド getTime(21.3.23) が返す long 値を32ビットづつ半分にした二つの値のXORとする。つまり,ハッシュコードは次の式の値とする。

(int)(this.getTime()^(this.getTime()>>>32))
このメソッドは,Object(20.1.4)のメソッド hashCode を置き換える。

21.3.10 public int getYear()

返却値は,地域時間帯におけるオブジェクト Date が表現する時刻の瞬間を含む年,又はその時刻の瞬間で始まる年から1900を引いた値とする。

21.3.11 public void setYear(int year)

オブジェクト Date を修正して,地域時間帯における,指定した年の,変更前と同じ月,日,時,分及び秒の時刻を表現する。(もちろん,例えば日付が2月29日で年がうるう年でないならば,新しい日付は3月1日として処理する。)

21.3.12 public int getMonth()

返却値は,地域時間帯におけるオブジェクト Date が表現する時刻の瞬間を含む月,又はその時刻の瞬間で始まる月を表現する数字(0 から 11 まで)とする。

21.3.13 public void setMonth(int month)

オブジェクト Date を修正して,地域時間帯における,指定した月の,変更前と同じ年,日,時,分及び秒の時刻を表現する。例えば日付を10月31日とし月を6月と設定したならば,6月は30日だけなので,新しい日付は7月1日として処理する。

21.3.14 public int getDate()

返却値は,地域時間帯におけるオブジェクト Date が表現する時刻の瞬間を含む月の日付,又はその時刻の瞬間で始まる月の日付を表現する数字(1 から 31 まで)とする。

21.3.15 public void setDate(int date)

オブジェクト Date を修正して,地域時間帯における,指定した日の,変更前と同じ年,月,時,分及び秒の時刻を表現する。例えば日付が4月30日で,しかも日を31に設定したならば,4月は30日だけなので,新しい日付は5月1日として処理する。

21.3.16 public int getDay()

返却値(0 = 日曜日,1 = 月曜日,2 = 火曜日,3 = 水曜日,4 = 木曜日,5 = 金曜日,6 = 土曜日)は,地域時間帯におけるオブジェクト Date が表現する時刻の瞬間を含む曜日の表現,又はその時刻の瞬間で始まる曜日の表現とする。

21.3.17 public int getHours()

返却値は,地域時間帯におけるオブジェクト Date が表現する時刻の瞬間を含む日の時,又はその時刻の瞬間で始まる日の時を表現する数字(0 から 23 まで)とする。

21.3.18 public void setHours(int hours)

オブジェクト Date を修正して,地域時間帯における,指定した時の,変更前と同じ年,月,日,分及び秒の時刻を表現する。

21.3.19 public int getMinutes()

返却値は,地域時間帯におけるオブジェクト Date が表現する時刻の瞬間を含む時の分,又はその時刻の瞬間で始まる時の分を表現する数字(0 から 59 まで)とする。

21.3.20 public void setMinutes(int minutes)

オブジェクト Date を修正して,地域時間帯における,指定した分の,変更前と同じ年,月,日,時及び秒の時刻を表現する。

21.3.21 public int getSeconds()

返却値は,地域時間帯におけるオブジェクト Date が表現する時刻の瞬間を含む分の秒,又はその時刻の瞬間で始まる分の秒を表現する数字(0 から 61 まで)とする。

21.3.22 public void setSeconds(int seconds)

オブジェクト Date を修正して,地域時間帯における,指定した秒の,変更前と同じ年,月,日,時及び分の時刻を表現する。

21.3.23 public long getTime()

このメソッドは,特定の時点(グリニッチ平均時1970年1月1日00:00:00)から Date のもっている時刻までの,ミリ秒で測った差の時間を返す。

21.3.24 public void setTime(long time)

オブジェクト Date を修正して,特定の時点(グリニッチ平均時1970年1月1日 00:00:00)から time ミリ秒経た時刻を表現する。

21.3.25 public boolean before(Date when)

オブジェクト Date が表現する時刻の瞬間が,when が表現する時刻の瞬間よりも厳密に時間的に前のときに限り,結果を true とする。

21.3.26 public boolean after(Date when)

オブジェクト Date が表現する時刻の瞬間が when が表現する時刻の瞬間よりも厳密に時間的に後のときに限り,結果を true とする。

21.3.27 public String toLocaleString()

オブジェクト Date を実装に依存した形式の String に変換する。Java アプリケーションの動作中には,利用者に馴染みのある形式に変換されるものとする。ISO C言語の strftime 関数がサポートする %c 形式と比較可能とする。

メソッド toString (21.3.7)及び toGMTString (21.3.28)も参照のこと。

21.3.28 public String toGMTString()

オブジェクト Date を,次の長さ23又は24の String に変換する。

"d mon yyyy
 hh:mm:ss GMT"
ここで,各表現は次のとおりとする。

結果は地域時間帯に依存しない。

メソッド toString (21.3.7)及び toLocaleString (21.3.27)も参照のこと。

21.3.29 public int getTimezoneOffset()

このメソッドは,オブジェクト Date が表現する時刻に対応する,UTC と地域時間帯との分単位で測った差を返す。

例えば,マサチューセッツはグリニッチから5時間だけ西のため,次のとおりとする。

new Date(96, 2, 14).getTimezoneOffset() は 300を返す
1996年2月14日には標準時間(東部標準時間)を使用しているため,このとおりとする。この標準時間は UTC から5時間ずれている。しかし,
new Date(96, 5, 1).getTimezoneOffset() を 240 を返す
1996年5月1日には夏時間(東部夏時間)を使用しているため,このとおりとする。この夏時間は UTC と4時間しかずれていない。 このメソッドは次の計算をしたものと同じ結果を与える。

(this.getTime() - UTC(this.getYear(),
            this.getMonth(),
            this.getDate(),
            this.getHours(),
            this.getMinutes(),
            this.getSeconds())) / (60 * 1000)

21.3.30 public static long UTC(int year, int month, int date,
int hours, int minutes, int seconds)

6個の引数(21.3.5)をもった Date コンストラクタと同様に,年,月,日,時,分及び秒として引数を解釈するが,地域時間帯ではなく UTC として解釈する。指定した時刻を,特定の時点(グリニッチ平均時 1970年1月1日 00:00:00)からミリ秒単位で測った差を表現し返す。

21.3.31 public static long parse(String s)
throws IllegalArgumentException

文字列 s を日時情報として解釈する。解釈が成功した場合には,特定の時点(グリニッチ平均時 1970年1月1日 00:00:00)からミリ秒単位で測った差を返す。解釈が失敗した場合には,IllegalArgumentException が投げられる。

文字列 s は,関心のあるデータを探しながら,左から右へと処理される。 s 内にある ASCII文字の丸括弧 ( 及び ) 内は無視する。それ以外の s 内で許される文字は,次の ASCII 文字及び空白類(20.5.19)だけとする。


abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789,+-:/

連続する10進数字は一つの10進数として処理する。

文字の連続列は単語と見なし,次のとおりに処理する。

1度全文字列 s を検査したら,次の二つのいずれかの方法で時刻に変換する。時間帯又は時間帯オフセットを認識したら,年,月,日,時,分及び秒は UTC (21.3.30)で解釈し,時間帯オフセットを適用する。それ以外の場合には,年,月,日,時,分及び秒は地域時間帯で解釈する。

21.4 クラス java.util.Dictionary

クラス Dictionary は,キー(keys) を要素 (elements) に関連づけるオブジェクトとする。すべてのキー及び要素はオブジェクトとする。どの一つの Dictionary においても,すべてのキーは多くとも一つの要素と関連付けられる。Dictionary 及びキーを与えれば,対応する要素を探すことができる。

public abstract class Dictionary {
    abstract public int size();
    abstract public boolean isEmpty();
    abstract public Object get(Object key)
        throws NullPointerException;
    abstract public Object put(Object key, Object element)
        throws NullPointerException;
    abstract public Object remove(Object key)
        throws NullPointerException;
    abstract public Enumeration keys();
    abstract public Enumeration elements();
}
equals (20.1.3) Dictionary

21.4.1 abstract public int size()

メソッド size は,この辞書内のエントリ(相異なるキー)の数を返す。

21.4.2 abstract public boolean isEmpty()

メソッド isEmpty は,この辞書が一つもエントリをもっていないときに限り,true を返す。

21.4.3 abstract public Object get(Object key)
throws NullPointerException

メソッド get は,この辞書が指定した key に対するエントリを含めば,関連する要素を返す。それ以外の場合には,null を返す。

keynull ならば,NullPointerException が投げられる。

21.4.4 abstract public Object put(Object key, Object element)
throws NullPointerException

メソッド put は,辞書に一つのエントリを加える。

辞書が指定した key のエントリを既に含んでいれば,そのエントリを新しい element を含むように修正し,辞書中の key に対応する以前の要素を返す。

辞書が指定した key のエントリを含まなければ,その key 及び element のためのエントリを作成し,null を返す。

key 又は elementnull ならば,NullPointerException が投げられる。

21.4.5 abstract public Object remove(Object key)
throws NullPointerException

メソッド remove は,辞書から一つのエントリを取り除く。

辞書が指定した key のエントリを含めば,エントリを辞書から取り除き,その後に key に対応した要素を返す。

辞書が指定した key に対応するエントリを含まなければ,null を返す。

keynull ならば,NullPointerException が投げられる。

21.4.6 abstract public Enumeration keys()

メソッド keys は,辞書が含むエントリに対するすべての key を生成する Enumeration(21.1)を返す。

21.4.7 abstract public Enumeration elements()

メソッド elements は,辞書内のエントリに含まれるすべての要素を生成する Enumeration(21.1)を返す。

21.5 クラス java.util.Hashtable

クラス Hashtable は,抽象クラス Dictionary(21.4)の実装とし,いくつかの機能を追加する。

public class Hashtable extends Dictionary implements Cloneable {
    public Hashtable(int initialCapacity, float loadFactor);
    public Hashtable(int initialCapacity);
    public Hashtable();
    public String toString();
    public Object clone();
    public int size();
    public boolean isEmpty();
    public Object get(Object key)
        throws NullPointerException;
    public Object put(Object key, Object value)
        throws NullPointerException;
    public Object remove(Object key)
        throws NullPointerException;
    public Enumeration keys();
    public Enumeration elements();
    public boolean contains(Object value);
    public boolean containsKey(Object key);
    protected void rehash();
    public void clear();
}
Hashtable は効率に影響を与える二つのパラメータ,容量(capacity) 及び 負荷係数(load factor) をもつ。負荷係数は,0.0 から 1.0 までの間にあることが望ましい。ハッシュ表のエントリ数が負荷係数及び現在の容量の積を超えたとき,ハッシュ表の容量をメソッド rehash を使って増加する。負荷係数が大きいほど,1度の参照にかかる予想時間は大きくなるが,メモリの効率的使用を可能とする。多くのエントリを Hashtable に作成する必要があれば,十分な容量を取って表を作成しておくことによって,表を大きくするのに必要となる自動再ハッシュの実行を表に任せるよりも効率的にエントリを挿入することが可能となる。

21.5.1 public Hashtable(int initialCapacity, float loadFactor)

このコンストラクタは,新たに生成したオブジェクト Hashtable を初期化し,容量を initialCapacity とし,負荷係数を loadFactor とする。最初は,ハッシュ表にエントリは存在しない。

21.5.2 public Hashtable(int initialCapacity)

このコンストラクタは,新たに生成したオブジェクト Hashtable を初期化し,容量を initialCapacity とし,負荷係数を 0.75 とする。最初は,ハッシュ表にエントリは存在しない。

21.5.3 public Hashtable()

このコンストラクタは,新たに生成したオブジェクト Hashtable を初期化し,負荷係数を 0.75 とする。最初は,ハッシュ表にエントリは存在しない。

21.5.4 public String toString()

クラス Hashtable は,波括弧で囲まれ,ASCII 文字“, ”(コンマと空白)で区切られたエントリ集合としての文字列形式で表現する。各々のエントリは,キー,等号及び関連する要素として表現する。メソッド toString は,キー及び要素を文字列に変換するために使用する。

このメソッドは,Object のメソッド toString(21.2.3)を置き換える。

21.5.5 public Object clone()

Hashtable のコピーを作成し,返す。ハッシュ表のすべての構造そのものをコピーし,キー及び要素はコピーされない。

このメソッドは,Object のメソッド clone(21.2.6)を置き換える。

21.5.6 public int size()

クラス Dictionary のメソッド size(21.4.1)を実装する。

21.5.7 public boolean isEmpty()

クラス Dictionary のメソッド isEmpty (21.4.2)を実装する。

21.5.8 public Object get(Object key)

クラス Dictionary のメソッド get(21.4.3)を実装する。

21.5.9 public Object put(Object key, Object value)

クラス Dictionary のメソッド put(21.4.4)を実装する。

21.5.10 public Object remove(Object key)

クラス Dictionary のメソッド remove (21.4.5)を実装する。

21.5.11 public Enumeration keys()

クラス Dictionary のメソッド keys(21.4.6)を実装する。

21.5.12 public Enumeration elements()

クラス Dictionary のメソッド elements(21.4.7)を実装する。

21.5.13 public boolean contains(Object value)

この Hashtable が,メソッド equals(20.1.3)によって,その要素が value と等しいと判定される少なくとも一つのエントリを含むときに限り,結果を true とする。

21.5.14 public boolean containsKey(Object key)

Hashtable が,メソッド equals(20.1.3)によって,キーを key と等しいと判定するエントリを含むときに限り,結果を true とする。つまり,このメソッドは,次の式と同じ結果を返すものとする。

get(key) != null

21.5.15 protected void rehash()

Hashtable がエントリに適応し,より効果的にアクセスを行なうために,容量の増加及び内部構造の再構成を行うものとする。

21.5.16 public void clear()

メソッド clear は,すべてのエントリをこの Hashtable から取り除く。

21.6 クラス java.util.Properties

Properties 表は,二つの機能拡張をもち,キー及び要素を文字列とするという制約をもつ,Hashtable の一種とする。まず,入力ストリームからエントリを表に読み込むメソッドが存在し,表内のすべてのエントリを出力ストリームへ書き出すためのメソッドが存在する。次に,Properties 表は,デフォルト値を提供する他の Properties 表を参照してもよい。メソッド getProperty は,メソッド get(21.4.3)とよく似ているが,あるエントリが表中に見つからない場合,デフォルト表を探す(そのデフォルト表そのものは,他のデフォルト表を参照してよく,順次再帰的に参照してもよい)。

public class Properties extends Hashtable {
    protected Properties defaults;
    public Properties();
    public Properties(Properties defaults);
    public String getProperty(String key);
    public String getProperty(String key, String defaultValue);
    public Enumeration propertyNames();
    public void load(InputStream in) throws IOException;
    public void save(OutputStream out, String header);
    public void list(PrintStream out);
}

21.6.1 protected Properties defaults;

defaults フィールドが null でなければ,この Properties 表に対してデフォルト値を提供するのは他の Properties 表とする。

21.6.2 public Properties()

このコンストラクタは,新しく生成する Properties 表を初期化し,デフォルト表をもたない。最初は新しく生成した表には,エントリが存在しないものとする。

21.6.3 public Properties(Properties defaults)

このコンストラクタは,新しく生成する Properties を初期化し,デフォルト表を defaults とする。引数 defaultsnull であってもよい。この場合には,新しく生成した Properties 表はデフォルト表をもたない。最初は新しく生成した表には,エントリが存在しない。

21.6.4 public String getProperty(String key)

Properties 表内にキーとして key をもつエントリが存在すれば,それに関連する要素を返す。それ以外の場合には,この Properties 表がデフォルト表をもてば,そのデフォルト表のメソッド getProperty が返す値を返す。それ以外の場合には null を返す。

21.6.5 public String getProperty(String key,
String defaultValue)

Properties 表の中に key に対応するエントリが存在すれば,対応する要素を返す。それ以外の場合には,この Properties 表がデフォルト表をもてば,メソッド getProperty の返却値を返す。それ以外の場合には,defaultValue を返す。

21.6.6 public Enumeration propertyNames()

この Properties 表が関連する要素を提供できるすべてのキーを生成する Enumeration(21.1)を返す。この Properties が,デフォルト表(21.6.1)をもてば,デフォルト表がもつエントリのキーも Enumeration が提供し,さらにデフォルト表が他のデフォルト表をもつ場合にも再帰的になっているものとする。ただし,いかなるキーも1度以上 Enumeration が提供することはない。

21.6.7 public void load(InputStream in) throws IOException

属性(キーと要素との対)を入力ストリームから次のように読み込み,この Properties 表に追加する。

Runtime.getRuntime().getLocalizedInputStream(in)
Runtime のメソッド getLocalizedInputStream(20.16.15)を参照のこと。

すべての属性は,入力ストリームの一行を占める。各行は,行終端記号で区切られる(\n\r 又は \r\n)。入力ストリームからの行は,その入力ストリーム上でファイルの最後に到達するまで処理される。

空白類(20.5.19) だけを含む行,又は最初の非空白類がASCIIの # 若しくは ! とする行は,無視する(つまり,# 又は ! は注釈行を示す)。

空行又は注釈行を除くすべての行は,表に加える一つの属性を記述する(ただし,行が \ で終っている場合は,次に示すとおりその行の次の行を連続行として扱う)。キーは,最初の非空白類から最初のASCII文字の =: 又は空白類の直前までの行中のすべての文字によって構成する。キーの後の空白類は,スキップする。キーの後の最初の非空白類が = 又は : ならば,この文字は無視し,その後の任意の空白類もスキップする。その行の残りすべての文字が,関連する要素列の一部となる。要素列中(ただし,キーではない)のASCIIエスケープ列 \t\n\r\\\"\'\ (バックスラッシュ及びスペース)及び \uxxxx は認識し,一つの文字に変換する。さらに,行の最後の文字が \ である場合,次の行は現在の行の続きとする。\ 及び行終端記后w) f$! OC1$K 例を示す。次の4行はすべてキーとして "Truth" を,関連する要素として "Beauty" を表す。

Truth Beauty
Truth = Beauty
        Truth:Beauty
Truth                :Beauty
次の3行は一つの属性を表す。


fruits          apple, banana, pear, \
                cantaloupe, watermelon, \
                kiwi, mango
キーを "fruit" とし,関連する要素を次のとおりとする。

"apple, banana, pear, cantaloupe, watermelon, kiwi, mango" 
各々の \ の前に一つのスペースが出現し,最終的な結果には各コンマの後に一つの空白が出現する点に注意すること。\ 記号,行終端記号及び行頭の空白類は単に捨て,一つ又はそれ以上の他の文字に置き換わることは ない(not)

さらに次に例を示す。

cheeses
キーを "cheeses" とし,関連する要素は空文字列とする。

21.6.8 public void save(OutputStream out, String header)

この Properties 表のすべての属性(キー及び要素の対)を次の出力ストリームへ書き出す。

Runtime.getRuntime().getLocalizedOutputStream(out)
その際の出力形式は Properties 表にメソッド load(21.6.7)を使って,読み込むのに適した形式とする。Runtime のメソッド getLocalizedOutputStream(20.16.16)を参照のこと。

Properties 表の,デフォルト表からの属性はこのメソッドでは書き出さ ない(not) ものとする。

ヘッダ引数が null でなければ,最初にASCII# 文字,ヘッダの文字列及び改行を出力ストリームに書き出す。このように header は特定の注釈として利用できる。

次に,ASCII# 文字,(現在時刻を Date のメソッド toString(21.3.7)により生成したかのような)現在の日付と時刻及び改行からなる注釈行を常に書き出す。

さらにこの Properties 表のすべてのエントリを1行ずつ書き出す。各々のエントリに対してキー文字列を書き,ASCII= 文字を書き,さらに関連する要素文字列を書く。要素文字列の各々の文字をエスケープシーケンスとして記述すべきかどうか調べる。ASCII\ 文字,タブ,改行,復帰は,各々\\\t\n\r と書く。\u0020 より小さい文字及び \u007E より大きい文字は,(局所化された出力ストリームの必要性に依存して)\uxxxx として書く。ただし,xxxx は適切な16進値とする。途中及び行末の空白ではなく,行頭の空白文字は,前に \ を付けて書き出す。

21.6.9 public void list(PrintStream out)

この Properties 表の属性(キー及び要素の対)を,メソッド save の出力よりもデバグで便利となるように,幾分省略した形で出力ストリーム out へ書き出す。ヘッダは書き出さず,40文字より長い要素値は最初の37文字に切り捨て,"..."を付け加える。これにより,キーの名前がそれほど長くなければ,各々の属性を物理的な出力装置の1行の領域に合わせる可能性が生ずる。

21.7 クラス java.util.Observable

クラス Observable の各インスタンスはすべて,オブジェクト Observable に重要な変化があった場合にはいつも通知を受ける“観測者”と呼ぶ集合を保持している。観測者は,インタフェース Observer(21.8)を実装する任意のオブジェクトであってよい。

この通知機構はスレッド(20.20)の処理とは何の関係もなく,クラス Object(20.1)wait 及び notify の機構とは完全に異なることに注意すること。

public class Observable {
    public void addObserver(Observer o);
    public void deletteObserver(Observe o);
    public void deleteObservers();
    public int countObservers();
    public void notifyObservers();
    public void notifyObservers(Object arg);
    protected void setChanged();
    protected void clearChanged();
    public boolean hasChanged();
}
観測可能なオブジェクトを新しく生成するとき,その観測者の集合は空とする。

二つの観測者はメソッド equals(20.1.3)true を返すときに限り,同じとみなす。

21.7.1 public void addObserver(Observer o)

観測者 o が,このオブジェクト Observable の観測者の集合内に既に存在している観測者と同じでないならば,その集合に追加する。

21.7.2 public void deleteObserver(Observer o)

観測者 o をこのオブジェクト Observable の観測者集合から取り除く。

21.7.3 public void deleteObservers()

すべての観測者をこのオブジェクト Observable の観測者集合から取り除く。

21.7.4 public int countObservers()

このオブジェクト Observable の観測者集合内の観測者数を返す。

21.7.5 public void notifyObservers()

オブジェクト Observable が変化したとマークされたら,このメソッドは第2の(?)の引数を null としてすべての観測者に通知する。つまり,このメソッドは次と同じとする。

notifyObservers(null)

21.7.6 public void notifyObservers(Object arg)

オブジェクト Observable が変化したとマークされた (21.7.9)ら,このメソッドは第2の引数を arg としてすべての観測者に通知する。二つの引数,このオブジェクト Observable 及び arg,をもった観測者のメソッド update(21.8.1)を呼び出すことによって観測者は通知を受ける。このとき,このオブジェクトのマークは消去される(21.7.8)

21.7.7 protected void setChanged()

このオブジェクト Observable が変化したとしてマークを付ける。メソッド hasChangedtrue を返す。

21.7.8 protected void clearChanged()

このオブジェクト Observable は変化していないとしてマークをつける。メソッド hasChangedfalse を返す。

21.7.9 public boolean hasChanged()

このオブジェクト Observable に対して,メソッド clearChanged 又はメソッド notifyObservers より後にメソッド setChanged が呼ばれたときに限り true を返す。

21.8 インタフェース java.util.Observer

あるクラスがオブジェクト Observable が変化したときに通知されるためには,インタフェース Observer を実装することが望ましい。オブジェクト Observer がどのように通知されるかについては,クラス Observable(21.7)を参照のこと。

public interface Observer {
    public void update(Observable o, Object arg);
}

21.8.1 public void update(Observable o, Object arg)

オブジェクト Observable が変化したとき及びそのメソッド notifyObservers(21.7.6)が呼び出されるとき,observers の集合内のすべてのオブジェクト Observer は,二つの引数オブジェクト Observable 及びメソッド notifyObservers への呼び出しにより指定された引数を渡し,メソッド update を起動することで通知される。

21.9 クラス java.util.Random

クラス Random の各インスタンスは,別々の独立な,互いに無関係のプリミティブ型の値の疑似乱数発生器とする。

public class Random {
    protected long seed;
    protected double nextNextGaussian;
    protected boolean haveNextNextGaussian = false;
    public Random();
    public Random(long seed);
    public void setSeed(long seed);
    protected int next(int bits);
    public int nextInt();
    public long nextLong();
    public float nextFloat();
    public double nextDouble();
    public double nextGaussian();
}
二つのオブジェクト Random が同じ生成源(seed)で生成され,しかも各々に対して一連の同じメソッド呼出しがなされたならば,すべてのJava実装において同じ数字の列を生成しそれを返す。この性質を保証するため, クラス Random に対して特別のアルゴリズムを規定する。Javaコードの完全な移植性を実現するために,Java実装はクラス Random に対して,以下に示すすべてのアルゴリズムを使用しなければならない。しかし,クラス Random のサブクラスは,すべてのメソッドに対する一般的な規則を守る範囲内で他のアルゴリズムを使うことが許される。

クラス Random が実装するアルゴリズムは、protected な三つの状態変数を使用する。アルゴリズムはまた,各起動に関して,32個までの擬似乱数的に発生したビットに提供する protected なユーティリティメソッドを使用する。

21.9.1 protected long seed;

擬似乱数発生器の状態を保持するために,メソッド next(21.9.7)で使用する変数。

21.9.2 protected double nextNextGaussian;

次にメソッド nextGaussian(21.9.12)が呼び出されたときに配布する,あらかじめ計算された値を保持するために使用する変数。

21.9.3 protected boolean haveNextNextGaussian = false;

メソッド nextGaussian(21.9.12)で配布する次の値をあらかじめ計算し,かつ捨て去ったかを追跡するために使用する変数。

21.9.4 public Random()

このコンストラクタは,新しく生成する Random 発生器を初期化し,現在時刻(20.18.6)を生成源とする。

public Random() {
 this(System.currentTimeMillis()); }

21.9.5 public Random(long seed)

このコンストラクタは,新しく生成した作られた Random 発生器を初期化し,引数 seed を生成源とする。


public Random(long seed) { setSeed(seed); }

21.9.6 public void setSeed(long seed)

setSeed が従わなければならない一般規則は,次のとおりとする。つまり,乱数発生器オブジェクトの状態を変更し,引数 seed を生成源とし,直前に生成したものと全く同じ状態にする。

メソッド setSeed はクラス Random で次のように実装する。


synchronized public void setSeed(long seed) {
    this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
    haveNextNextGaussian = false;
}
クラス Random による setSeed の実装は,偶然に与えられた生成源の48ビットしか使用しない。しかし,通常は,置き換わるメソッドは,生成源値としてlong引数の64ビットすべてを使用してもよい。

21.9.7 protected int next(int bits)

next が従わなければならない一般規則は,次のとおりとする。つまり,int の値を返し,引数ビットが 1 以上 32 以下ならば,返却値の下位ビットの多くは(近似的に)独立に選択されたビット値とし,(近似的に)等しい確率で 0 又は 1 とする。

クラス Random によって,メソッド next を次のとおりに実装する。

synchronized protected int next(int bits) {
    seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
    return (int)(seed >>> (48 - bits));
}
これは線形合同法による疑似乱数発生器で,D. H. Lehmerにより定義され,Donald E. Knuth により The Art of Computer Programming の第2巻 Seminumerical Algorithms の 3.2.1.で記述されている。

21.9.8 public int nextInt()

nextInt が従わなければまらない一般規則は,次のとおりとする。つまり,一つの int 値を疑似乱数的に発生し返す。すべての個の可能な int 値を(近似的に)等確率で生成する。

メソッド setSeed をクラス Random によって,次のとおりに実装する。

public int nextInt() {  return next(32); }

21.9.9 public long nextLong()

nextInt が従わなければならない一般規則は,次のとおりとする。つまり,一つの long 値を疑似乱数的に発生し返す。すべての個の可能な long 値を(近似的に)等確率で生成する。

メソッド setSeed をクラス Random によって,次のとおりに実装する。

public long nextLong() {
    return ((long)next(32) << 32) + next(32);
}

21.9.10 public float nextFloat()

nextFloat が従わなければならない一般規則は,次のとおりとする。つまり,0.0f 以上 1.0f 未満の範囲から(近似的に)一様に選択される一つの float 値を疑似乱数的に発生し返す。すべての個の形式の可能な float 値を(近似的に)等確立で生成する。ここで,mより小さい正の整数とする。

メソッド setSeed をクラス Random によって,次のとおりに実装する。

public float nextFloat() {
    return next(24) / ((float)(1 << 24));
}
メソッド next は,独立に選択されたビットの近似的に偏りのない発生源であるために,“近似的に”という予防的表現を前述の記述に使用する。完全な発生源又は完全に乱数的に選択されたビットが存在するならば,示されたアルゴリズムは与えられた範囲から完全な均一性をもって float を選択する。

21.9.11 public double nextDouble()

nextDouble が従わなければならない一般規則は,次のとおりとする。つまり,0.0d 以上 1.0d 未満の範囲から選択される一つの double 値を疑似乱数的に発生し返す。すべての個の形式の可能な float 値を近似的に等確立で生成する。ただし,mより小さい正の整数とする。

メソッド setSeed をクラス Random によって,次のとおりに実装する。

public double nextDouble() { return (((long)next(26) << 27) + next(27)) / (double)(1L << 53); }

メソッド next は,独立に選択された近似的にビット偏りのない発生源であるために,“近似的に”という予防的表現を前述の記述に使用する。完全な発生源及び完全に乱数的なに選択されたビットが存在するならば,示されたアルゴリズムは与えられた範囲から完全な均一性をもって double 値を選択する。

21.9.12 public double nextGaussian()

nextGaussian が従わなければならない一般規則は,次のとおりとする。つまり,近似的に,平均 0.0,標準偏差 1.0 の通常の正規分布から選択された一つの double 値を疑似乱数的に発生し返す。

メソッド setSeed をクラス Random によって,次のとおりに実装する。

synchronized public double nextGaussian() {
    if (haveNextNextGaussian) {
        haveNextNextGaussian = false;
        return nextNextGaussian;
    } else {
        double v1, v2, s;
        do { 
            v1 = 2 * nextDouble() - 1;     // between -1.0 and 1.0
            v2 = 2 * nextDouble() - 1;     // between -1.0 and 1.0
            s = v1 * v1 + v2 * v2;
        } while (s >= 1);
        double norm = Math.sqrt(-2 * Math.log(s)/s);
        nextNextGaussian = v2 * norm;
        haveNextNextGaussian = true;
        return v1 * norm;
    }
}
ここでは,G.E.P.Box,M.E.Muller及びG.Marsagliaの極手法(polar method)を使用しており,The Art of Computer Programming, 2巻:Seminumerical Algorithms, 3.4.1, 小節 C,algorithm P内に Doonald E.Knuth によって記述されている。これは Math.log への一回の呼び出し及び Math.sqrt への一回の呼び出しにより二つの独立した値を生成することに注意すること。

21.10 クラス java.util.StringTokenizer

クラス StringTokenizer は,String をトークンに分割する手段を提供する。このクラスにより使用されるトークン切り出しメソッドは,クラス java.io.StreamTokenizer により使用されるメソッドよりもはるかに単純とする。例えば,StringTokenizer は,識別子,数及び引用列を区別しない。さらに,注釈の認識及び読み飛ばしをしない。

StringTokenizer は, Enumeration(21.1)として与えられる。

public class StringTokenizer implements Enumeration {
    public StringTokenizer(String str, String delim, boolean returnTokens);
    public StringTokenizer(String str, String delim);
    public StringTokenizer(String str);
    public boolean hasMoreTokens();
    public String nextToken();
    public String nextToken(String delim);
    public boolean hasMoreElements();
    public Object nextElement();
    public int countTokens();
}
StringTokenizer は,単に文字を区切り文字とそれ以外の文字のクラスとに分割する。トークン切出し子は,値 true をもつ returnTokens で生成されたか,false をもつ returnTokens で生成されたかに依存して,次のいずれかの動作をする。

returnTokensfalse ならば,区切り文字は,興味あるトークンを分離するためだけに使われる。この場合,トークンは,区切り文字でない連続する文字の最大列となる。

returnTokenstrue ならば,区切り文字そのものを興味あるトークンと考える。この場合,トークンは,一つの区切り文字か,区切り文字でない連続する文字の最大列かのいずれかとする。

StringTokenizer は,内部的に,トークンを切り出す String 内の現在位置を保持する。処理された文字の先に現在位置を進める操作が存在する。

StringTokenizer を生成するために使用した文字列の部分列(20.12.32)を得ることによってトークンを返す。

21.10.1 public StringTokenizer(String str, String delim,
boolean returnTokens)

このコンストラクタは,新しく生成した StringTokenizer を初期化し,与えられた列 str 内のトークンを認識する。列 delim 内のすべての文字を区切り文字とする。引数 returnTokens は,区切り文字そのものをトークンとするかどうかを指定する。

21.10.2 public StringTokenizer(String str, String delim)

このコンストラクタは,新しく生成した StringTokenizer を初期化し,与えられた列 str 内のトークンを認識する。列 delim 内のすべての文字を区切り文字とする。区切り文字そのものはトークンとして取り扱われない。

21.10.3 public StringTokenizer(String str)

このコンストラクタは,新しく生成した StringTokenizer を初期化し,与えられた列 str 内のトークンを認識する。すべての空白類(20.5.19)を区切り文字とする。区切り文字そのものはトークンとしては取り扱われない。

21.10.4 public boolean hasMoreTokens()

現在位置より先の列内に少なくとも一つのトークンが存在するときに限り,結果を true とする。このメソッドが true を返す場合,引数なしで nextToken を呼び出すと処理が成功してトークンを返す。

21.10.5 public String nextToken()

現在位置より先の列内の次のトークンを返す。現在位置は,認識されたトークンを越えて次に進む。

21.10.6 public String nextToken(String delim)

最初に,StringTokenizer で区切り文字と考えられている文字の集合を,列 delim 内の文字に換える。次に,現在位置より先の列内の次のトークンを返す。現在位置は,認識されたトークンを越えて次に進む。

21.10.7 public boolean hasMoreElements()

このメソッドは,hasMoreTokens(21.10.4)と全く同じ振舞いをする。StringTokenizerEnumeration(21.1)として使用可能とするために提供される。

21.10.8 public Object nextElement()

これは,nextToken(21.10.5)と全く同じ振舞いをする。StringTokenizerEnumeration(21.1) として使用可能とするために提供する。

21.10.9 public int countTokens()

現在の区切り文字の集合を使い,現在位置より先の列内のトークン数を返す。現在位置は進めない。

21.11 クラス java.util.Vector

Vector は,配列と同様に,整数インデクスを使い,アクセス可能な項目を含む。しかし,Vector 生成後の項目の追加及び削除に適応し,必要に応じて,Vector のサイズは増加又は減少する。

public class Vector implements Cloneable {
    protected Object[] elementData;
    protected int elementCount;
    protected int capacityIncrement;
    public Vector(int initialCapacity, int capacityIncrement);
    public Vector(int initialCapacity);
    public Vector();
    public final String toString();
    public Object clone();
    public final Object elementAt(int index)
        throws IndexOutOfBoundsException;
    public final void setElementAt(Object obj, int index)
        throws IndexOutOfBoundsException;
    public final Object firstElement()
        throws NoSuchElementException;
    public final Object lastElement()
        throws NoSuchElementException;
    public final void addElement(Object obj);
    public final void insertElementAt(Object obj, int index)
        throws IndexOutOfBoundsException;
    public final boolean removeElement(Object obj);
    public final void removeElementAt(int index)
        throws IndexOutOfBoundsException;
    public final void removeAllElements();
    public final boolean isEmpty();
    public final int size();
    public final void setSize(int newSize);
    public final int capacity();
    public final void ensureCapacity(int minCapacity);
    public final void trimToSize();
    public final void copyInto(Object anArray[])
        throws IndexOutOfBoundsException;
    public final Enumeration elements();
    public final boolean contains(Object elem);
    public final int indexOf(Object elem);
    public final int indexOf(Object elem, int index)
        throws IndexOutOfBoundsException;
    public final int lastIndexOf(Object elem);
    public final int lastIndexOf(Object elem, int index)
        throws IndexOutOfBoundsException;
}

21.11.1 protected Object[] elementData;

内部的に,Vector は,少なくともすべての要素を含む大きさの配列内に要素を保持する。

21.11.2 protected int elementCount;

このフィールドは,オブジェクト Vector の内の現在の項目数を保持する。要素 elementData[0] から elementData[elementCount-1] までを実際の項目とする。

21.11.3 protected int capacityIncrement;

メソッド ensureCapacity(21.11.22)が(新しい配列を生成することで)フィールド elementData 内のデータ配列のサイズを増加しなければならないとき,少なくとも capacityIncrement 内の量だけサイズを増加する。しかし,capacityIncrement が0であれば,少なくともデータ配列のサイズを2倍にする。

21.11.4 public Vector(int initialCapacity, int capacityIncrement)

このコンストラクタは,新しく生成した Vector を初期化し,その内部データ配列のサイズを initialCapacity とし,標準の容量増加量を capacityIncrement の値とする。最初,Vector はどんな項目も含まない。

21.11.5 public Vector(int initialCapacity)

このコンストラクタは,新しく生成した Vector を初期化し,その内部データ配列のサイズを initialCapacity とし,標準の容量増加量を0とする。最初,Vector はどんな項目も含まない。

21.11.6 public Vector()

このコンストラクタは,新しく生成した Vector を初期化し,その内部データ配列のサイズを 10 とし,標準の容量増加量を0とする。最初,Vector はどんな項目も含まない。

21.11.7 public final String toString()

この Vector は,ASCII形式の角括弧で囲まれ,ASCII形式の文字", "(コンマ及びスペース)で区切られた,項目のリストの列形式で表現する。メソッド toString は,項目を列に変換するために使用する。ヌル参照は,列 "null" として表現する。

次に例を示す。


Vector v = new Vector();
v.addElement("Canberra");
v.addElement("Cancun");
v.addElement("Canandaigua");
System.out.println(v.toString());

これは次の出力を生成する。

[Canberra, Cancun, Canandaigua]
このメソッドは,Object(20.1.2)のメソッド toString を置き換える。

21.11.8 public Object clone()

Vector のコピーを構成し,それを返す。コピーは,Vector の内部データ配列のクローンへの参照を含み,元の内部データ配列への参照は含まない。

このメソッドは,Object(20.1.5)のメソッド clone を置き換える。

21.11.9 public final Object elementAt(int index)
throws IndexOutOfBoundsException

特定の index をもった Vector の項目を返す。

index が負であるか,Vector の現在のサイズよりも大きければ,IndexOutOfBoundsException が投げられる。

21.11.10 public final void setElementAt(Object obj, int index)
throws IndexOutOfBoundsException

特定の index をもった Vector の項目を obj で置き換え,objVector 内の特定の index の項目とする。

index が負であるか,Vector の現在のサイズよりも大きければ,IndexOutOfBoundsException が投げられる。

21.11.11 public final Object firstElement()
throws NoSuchElementException

Vector が空ならば,NoSuchElementException が投げられる。それ以外の場合には,最初の項目(インデクス 0 の項目)を返す。

21.11.12 public final Object lastElement()
throws NoSuchElementException

Vector が空ならば,NoSuchElementException が投げられる。それ以外の場合には,最後の項目(インデクス size()-1 の項目)を返す。

21.11.13 public final void addElement(Object obj)

Vector のサイズを 1 だけ増加し,obj を新たな最後の項目とする。

21.11.14 public final void insertElementAt(Object obj, int index)
throws IndexOutOfBoundsException

Vector のサイズを 1 だけ増加し,obj を特定の index における新しい項目とする。インデクス kindex よりも大きいときに限り,以前 k に存在した Vector の項目は,すべて最初に k+1 に移動する。

21.11.15 public final boolean removeElement(Object obj)

Vectorobj の出現を含めば,メソッド removeElementAt(21.11.16)を使用したかのように最初の(最小のインデクスをもった)出現を削除し,true を返す。Vectorobj の出現を含まなければ,Vector を修正せず false を返す。

21.11.16 public final void removeElementAt(int index)
throws IndexOutOfBoundsException

Vector のサイズを 1 だけ減少し,特定の index における項目を Vector から取り除く。インデクス kindex よりも大きいときに限り,以前にインデクス k に存在していた Vector の項目を最初にインデクス k-1 に移動する。

21.11.17 public final void removeAllElements()

Vector からすべての要素を取り除き,Vector を空とする。

21.11.18 public final boolean isEmpty()

Vector が空であるとき,つまりそのサイズが0であるときに限り,true を返す。

21.11.19 public final int size()

Vector のサイズ(現在含まれている項目数)を返す。

21.11.20 public final void setSize(int newSize)

Vector のサイズを newSize に変える。新しいサイズが元のサイズよりも小さいならば,項目を後ろから順に取り除き捨てる。新しいサイズが元のサイズよりも大きいならば,新しい項目に null を設定する。

21.11.21 public final int capacity()

Vector の現在の容量(フィールド elementData に確保されている内部データ配列の長さ)を返す。

21.11.22 public final void ensureCapacity(int minCapacity)

Vector の現在の容量が minCapacity よりも小さければ,フィールド elementData(21.11.1)に確保している内部データ配列を大きい方で置き換えて,容量を増加する。新しいデータ配列のサイズは,capacityIncrement の値が正の値ならば,元のサイズと capacityIncrement (21.11.3)とを加えたものとする。capacityIncrement の値が正でない場合には,新しい容量は元の容量の2倍とする。しかしこの新しいサイズが相変わらず minCapacity より小さい場合には,この新しい容量を minCapacity とする。

21.11.23 public final void trimToSize()

Vector の容量が現在の size(21.11.19)よりも大きければ,フィールド elementData で確保している内部データ配列を小さい方に置き換え,容量を変えて現在のサイズに等しくする。

21.11.24 public final void copyInto(Object anArray[])
throws IndexOutOfBoundsException

Vector のすべての項目を配列 anArray にコピーする。Vector 内のインデクス k における項目を anArray の要素 k にコピーする。anArray の長さが Vector のサイズよりも小さければ,IndexOutOfBoundsException が投げられる。

21.11.25 public final Enumeration elements()

Vector 内のすべての要素を生成する Enumeration(21.1)を返す。生成される最初の項目をインデクス 0 の項目とし,次をインデクス 1 の項目とし,以降同様にインデクスを付ける。

21.11.26 public final boolean contains(Object elem)

Vector 内の項目が,メソッド equals(20.1.3)で決定されるelem と同じときに限り,true を返す。

21.11.27 public final int indexOf(Object elem)

elem に等しい項目が Vector 内に存在する場合,最初の出現のインデクス,つまり,次の式を true とする最小値 k を返す。

elem.equals(elementData[k])
Vector 内にこれらの項目が出現しなければ,-1 を返す。

21.11.28 public final int indexOf(Object elem, int index)
throws IndexOutOfBoundsException

elem に等しい項目が,Vector 内の位置 k 又はそれ以降に存在すれば,最初の出現のインデクス,つまり,次の式を true とする最小値 k を返す。

elem.equals(elementData[k]) && (k >= index)
Vector 内にこれらの項目が出現しなければ,-1 を返す。

21.11.29 public final int lastIndexOf(Object elem)

elem に等しい項目が Vector 内に存在すれば,最後の出現のインデクス,つまり,次の式を true とする最小値 k を返す。

elem.equals(elementData[k])
Vector 内にこれらの項目が出現しなければ,-1 を返す。

21.11.30 public final int lastIndexOf(Object elem, int index)
throws IndexOutOfBoundsException

elem に等しい項目が Vector 内の位置 k 又はそれ以前に存在すれば,最後の出現のインデクス,つまり,次の式を true とする最大値 k を消す。

elem.equals(elementData[k]) && (k <= index)
Vector 内にこれらの項目が存在しなければ,-1 を返す。

21.12 クラス java.util.Stack

クラス Stack は,ベクトルをスタックとして取り扱うために5個の操作を追加して Vector を拡張する。通常の push 及び pop 操作,スタック上の最上位の項目を取り出すメソッド peek,スタックが空かどうかを試験するメソッド empty 並びに項目を探しスタックを調べ項目のスタック最上位からの位置を見い出すメソッド search を提供する。

public class Stack extends Vector {
    public Object push(Object item);
    public Object pop() throws EmptyStackException;
    public Object peek() throws EmptyStackException;
    public boolean empty();
    public int search(Object o);
}
スタックを最初に作成するとき,スタックはどんな項目も含まない。

21.12.1 public Object push(Object item)

item をスタックの最上位に押し込む。これは,次と全く同じ効果をもつ。

addElement(item)
Vector(21.11.13)の メソッド addElement を参照すること。

21.12.2 public Object pop() throws EmptyStackException

スタックが空ならば,EmptyStackException が投げられる。それ以外の場合には,最上位の項目(Vector の最後の項目)を取り除き,それを返す。

21.12.3 public Object peek() throws EmptyStackException

スタックが空ならば,EmptyStackException が投げられる。それ以外の場合には,最上位の項目(Vector の最後の項目)を返すが,取り除かない。

21.12.4 public boolean empty()

スタックがいかなる項目も含まないときに限り,結果を true とする。

21.12.5 public int search(Object o)

オブジェクト oStack 内の項目であれば,このメソッドは,スタックの最上位から最も近い出現のスタック最上位からの距離を返す。スタックの最上位を距離 1 とする。oStack 内の項目と比較するために,メソッド equals(20.1.3)を使用する。

21.13 クラス java.util.EmptyStackException

EmptyStackException は,空のオブジェクト Stack に対して,pop(21.12.2)又は peek(21.12.3)を行なおうとしたことを示すために,投げられる 。

public class EmptyStackException extends RuntimeException {
    public EmptyStackException();
}

21.13.1 public EmptyStackException()

このコンストラクタは,新しく生成した EmptyStackException を初期化し,エラーメッセージを null とする。

21.14 クラス java.util.NoSuchElementException

NoSuchElementException は,それ以上供給する要素が存在しないオブジェクト Enumeration にさらに要素を要求したことを示すために,投げられる 。インタフェース Enumeration(21.1.2)のメソッド nextElement 参照。

public class NoSuchElementException extends RuntimeException {
    public NoSuchElementException();
    public NoSuchElementException(String s);
}

21.14.1 public NoSuchElementException()

このコンストラクタは,新しく生成した NoSuchElementException を初期化し,エラーメッセージを null とする。

21.14.2 public NoSuchElementException(String s)

このコンストラクタは,新しく生成した NoSuchElementException を初期化し,後にメソッド getMessage(20.22.3)で検索するエラーメッセージ列 s への参照を保存する。


目次 | |