LoginSignup
0
1

More than 5 years have passed since last update.

java.utilまとめ3 (HashTable,Enumeration)

Last updated at Posted at 2016-12-17

今回書くこと:

  • Hashtableクラス
  • Enumerationインターフェース

Hashtableなどにキーと値を入れるためのプロパティファイルは

temp.properties
key1 = value1
key2 = value2
key3 = value3
key4 = value4
test.properties
key11 = value11
key12 = value12
key13 = value13
enumeration_sample.properties
key1 = Java
key2 = JavaScript
key3 = Scala
key4 = Python2
key5 = Python3

を使う。

Hashtableクラス

ハッシュテーブルを実装するクラス。このクラスはJava1.0からある、いまだ現役(?)のクラスでConcurrentHashMapのご先祖様みたいなもの。
ハッシュテーブルは連想配列と呼ばれるもので、ハッシュマップとよく混合する。
ハッシュテーブルとハッシュマップの違いは以下のリンクを参照してほしい。
- 【Java】HashMapとHashtableの違い

要は、HashMapはHashMapで、HashtableはHashtableでいいところはあるということ。

次の例は、あらかじめデフォルトでプロパティを設定し、それをHashtableにコピーしてから新たに設定したいと思うプロパティを設定してそのプロパティに先ほどのデフォルトのプロパティをコピーしたHashtableを新たに設定したプロパティへ取り込むプログラム。

HashtableSample.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Properties;

public class HashtableSample {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws FileNotFoundException, IOException {
        Hashtable<String, String> hashTable = new Hashtable<String, String>();
        Properties properties = new Properties();

        properties.load(new FileInputStream("./Property/temp.properties")); 
        hashTable = (Hashtable<String, String>) properties.clone(); 

        System.out.println("Default Property: " + properties);

        properties.load(new FileInputStream("./Property/test.properties"));
        properties.putAll(hashTable);

        System.out.println("Second Property: " + properties);

        if(properties.containsKey("key4")){
            System.out.println("key4 is exist.");
        } else {
            System.out.println("key4 isn't exist.");
        }
    }
}

結果は

Default Property: {key4=value4, key3=value3, key2=value2, key1=value1}
key13 isn't exist.
Second Property: {key13=value13, key12=value12, key11=value11, key4=value4, key3=value3, key2=value2, key1=value1}
key13 is exist.

となる。ここで、key13はデフォルトではないキーを示す。

containsKeyメソッド

Mapインターフェースで定義されているメソッドで、引数で指定されたキーがHashtableにあるかどうか判定するメソッド。Hashtableにそのキーがあればtrueを返す。

putAllメソッド

Mapインターフェースで定義されているメソッドで、引数のマップをHashtableへすべてコピーするメソッド。

補足的な事

PropertiesクラスはHashtableクラスを継承しているのでHashtableのメソッドを使うことができる。

Enumerationインターフェース

こちらもJava1.0からあり、Iteratorのご先祖様みたいなもの。
動作もIteratorと同じ。じゃあIterator使えばいいんじゃないの?と思うが、そうもいかない。クラスによってはEnumeration型を返すメソッド(java.util.Hashtable#elements()、java.util.Hashtable#keys()、java.util.Properties#propertyNames()など)があるので、そこで使い分ける必要がある。

次の例はプロパティのキーのリストをEnumeration型に入れてそのキーの値を検索してそれをコンソールに出力するプログラム。

EnumerationSample.java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

public class EnumerationSample {

    public static void main(String[] args) throws FileNotFoundException, IOException{

        Properties properties = new Properties();
        properties.load(new FileInputStream("./Property/enumration_sample.properties"));

        for(Enumeration<Object> enumeration = properties.keys(); enumeration.hasMoreElements();){
            String name = (String) enumeration.nextElement();
            System.out.println(properties.getProperty(name));
        }
    }
}

結果は

Python3
Python2
Scala
JavaScript
Java

となる。

hasMoreElementsメソッド

Enumerationインターフェースに定義されているメソッド。このメソッドは列挙に次の要素があるかどうかを判定するメソッド。次のメソッドがあればtrueを返す。

nextElementメソッド

Enumerationインターフェースに定義されているメソッド。列挙に1つ以上の要素があれば次の要素を返すメソッド。要素がそれ以上なければNoSuchElementExceptionを返す。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1