1はじめに
私たちは、それが知っているMap
、それは様々な実装を持っている、ちょうどインタフェースで、Javaが最も一般的に使用されていますHashMap
。この記事について考える別の実現であります:EnumMap
。これは、列挙型がありMap
、そのキーの値が列挙型でなければなりませんが必要です。
2あなたのEnumMapを作成します。
それは列挙型地図についてですので、我々は最初のその後の使用のために、列挙型を作成します。
public enum Directions {
NORTH, SOUTH, EAST, WEST
}
3つの方法の2.1創造EnumMap
作成JDKを提供しEnumMap
、次のように、3の方法を:
//new EnumMap
EnumMap<Direction, String> enumMap = new EnumMap<>(Direction.class);
enumMap.put(Direction.EAST, "东");
enumMap.put(Direction.SOUTH, "南");
//从EnumMap复制
EnumMap<Direction, String> enumMapCopyEnumMap = new EnumMap<>(enumMap);
assertEquals(enumMap, enumMapCopyEnumMap);
//从Map复制
Map<Direction, String> hashMap = Maps.newHashMap();
hashMap.put(Direction.EAST, "东");
hashMap.put(Direction.SOUTH, "南");
EnumMap<Direction, String> enumMapCopyHashMap = new EnumMap<>(hashMap);
assertEquals(enumMap, enumMapCopyHashMap);
(1)使用
new EnumMap()
時間法を、そしてHashMap
異なる、それがオブジェクトを作成するために、列挙型を通過しなければなりません。(2)から
EnumMap
コピー、パラメータが渡されますEnumMap
。(3)
Map
コピー、入ってくるパラメータMap
が、それはキータイプの列挙型を要求する必要があります。
2.2スマートグアバ
実際には、3例の上に組み合わせることができ、実際には二つの方法であります:
(1)使用
new EnumMap(Class<K> keyType)
(2)使用
new EnumMap(Map<K, ? extends V> m)
スマートは、Guava
次のようにのみ、これらの2つの方法を提供します:
//使用Guava创建
EnumMap<Direction, String> enumMapGuava = Maps.newEnumMap(Direction.class);
enumMapGuava.put(Direction.SOUTH, "南");
assertEquals(1, enumMapGuava.size());
enumMapGuava = Maps.newEnumMap(enumMap);
assertEquals(enumMap, enumMapGuava);
3基本操作
以下のように、動作するように簡単、もちろん同じ地図を提供する方法:
@Test
public void operations() {
EnumMap<Direction, String> map = Maps.newEnumMap(Direction.class);
//增加
map.put(Direction.EAST, "东");
map.put(Direction.SOUTH, "南");
map.put(Direction.WEST, "西");
//查询
assertTrue(map.containsKey(Direction.EAST));
assertFalse(map.containsKey(Direction.NORTH));
//删除
map.remove(Direction.EAST);
assertFalse(map.containsKey(Direction.EAST));
assertFalse(map.remove(Direction.WEST, "北"));
assertTrue(map.remove(Direction.WEST, "西"));
//清空
map.clear();
assertEquals(0, map.size());
}
Deleteメソッドで特に注目すべきなのは、キーと値は、2つのパラメータを渡すことができmap.remove(Direction.WEST, "西")
、キーと値のペアが一致したとき、あなたは成功を削除することができ、map.remove(Direction.WEST, "北")
マッチは失敗し、それが削除されません。
4コレクションビュー
4.1秩序
提供さマップ関数インタフェースと同じように、EnumMap
それはその値、キーおよびエントリなどのすべてを返すことができます。しかし、HashMap
違いがあることであるEnumMap
ビューのリターンがこの順序が順番に挿入されていない、ためにですが、列挙定義の順。コードは以下の通りであります:
EnumMap<Direction, String> map = Maps.newEnumMap(Direction.class);
map.put(Direction.EAST, "东");
map.put(Direction.SOUTH, "南");
map.put(Direction.WEST, "西");
map.put(Direction.NORTH, "北");
//返回所有Value
Collection<String> values = map.values();
values.forEach(System.out::println);
//返回所有Key
Set<Direction> keySet = map.keySet();
keySet.forEach(System.out::println);
//返回所有<Key,Value>
Set<Map.Entry<Direction, String>> entrySet = map.entrySet();
entrySet.forEach(entry -> {
System.out.println(entry.getKey() + ":" + entry.getValue());
});
次のように出力結果は以下のとおりです。
北
南
东
西
NORTH
SOUTH
EAST
WEST
NORTH:北
SOUTH:南
EAST:东
WEST:西
確かにこのシーケンス、我々は列挙順序を定義するには関わらず、追加オーダーの、同じです。
4.2リンケージ
発注に加えて、EnumMap
返されるコレクションは、違いのもう一つのポイントは、実際に体全体に影響を与えることリンケージで表示します。前記続く変更は、さらに変更します。あなたが理解するコードを見てください:
//Values、keySet、entrySet改变会影响其它
values.remove("东");
assertEquals(3, map.size());
assertEquals(3, keySet.size());
assertEquals(3, entrySet.size());
keySet.remove(Direction.WEST);
assertEquals(2, map.size());
assertEquals(2, values.size());
assertEquals(2, entrySet.size());
entrySet.removeIf(entry -> Objects.equals(entry.getValue(), "北"));
assertEquals(1, map.size());
assertEquals(1, keySet.size());
assertEquals(1, values.size());
//Map的改变会影响其它视图
map.clear();
assertEquals(0, values.size());
assertEquals(0, keySet.size());
assertEquals(0, entrySet.size());
5パフォーマンス
パフォーマンスは、我々が選んだのであるEnumMap
、それがより良い性能よりだろう、なぜ、主な理由の一つHashMap
であっても良いですか?これは、ソースコードを見て、学ぶことができます。
(1)底部層は、二つの配列、排出キー、放電値のいずれかによってデータを格納することです。
(2)キー値がそう作成、要素の数を決定するために始めている列挙型であるためEnumMap
、その後の膨張によるパフォーマンスの問題を考慮せずに、決定された配列のサイズにデータを格納する、時間。
(3)列挙自体により、固定された配列でEnum.ordinal()
はなく、コンピューティングよりも、注文を得るための方法であって、これはインデックスにクエリとして挿入されHashCode
、パフォーマンスが速くなります。この順序は、配列のインデックスです。これはまた、あるEnumMap
コレクションのビューは、注文の理由です。
(4)固定サイズのためには関係なく、負荷率の、ハッシュ衝突、小スペースの複雑さの問題はありません。
6.結論
この記事では説明しEnumMap
てMap
作成、使用の特別な実現、およびパフォーマンス分析のコレクションを表示し、それは本当に他の人より優れていることがわかりました。私たちの主な値が列挙された場合、あなたは試してみたいことがEnumMap
、パフォーマンスはああ良くなります。
社会的関心番号へようこそ< 遅いカボチャは、言ったあなたが更新していきます、> ...
より多くの書籍、より多くの共有であり、より書き込み、以上の仕上げより。