[強制]のJavaのHashMapの優れた性能?私はEnumMapを要求していません

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.結論

この記事では説明しEnumMapMap作成、使用の特別な実現、およびパフォーマンス分析のコレクションを表示し、それは本当に他の人より優れていることがわかりました。私たちの主な値が列挙された場合、あなたは試してみたいことがEnumMap、パフォーマンスはああ良くなります。


社会的関心番号へようこそ< 遅いカボチャは、言ったあなたが更新していきます、> ...

より多くの書籍、より多くの共有であり、より書き込み、以上の仕上げより。

おすすめ

転載: www.cnblogs.com/larrydpk/p/11815978.html