java.utilまとめ3 （HashTable,Enumeration）

今回書くこと：

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

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

```properties:temp.properties
key1 = value1
key2 = value2
key3 = value3
key4 = value4
```

```properties:test.properties
key11 = value11
key12 = value12
key13 = value13
```

```properties:enumeration_sample.properties
key1 = Java
key2 = JavaScript
key3 = Scala
key4 = Python2
key5 = Python3
```

を使う。

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

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

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

```java: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型に入れてそのキーの値を検索してそれをコンソールに出力するプログラム。

```java: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を返す。