Javaコンテナ--mapインタフェース
1、の概念
(1)地図要素はキーと値のペア(キー値)が格納されているであり、マッピング関係を提供し、マップ・オブジェクト・インスタンス内のキーと値のペアは、エントリのタイプの形で存在し、
(2)キー値が繰り返されません、値の値が繰り返されてもよいです。値と値の関係に対応する多くのキー値に形成することができ、各キーの値は、値にマッピングすることができます。
地図インタフェースの実装クラスは以下のとおりです。HashMapの、TreeMapの、のWeakHashMap、ConcurrentHashMapの、ハッシュテーブル。LinkedHashMapは、HashMapのサブクラスです。
2、HashMapの基礎となるアナログ(配列+鎖)
+配列リストの実装のHashMap。ここではHashMapの実装原理のJDK1.7類似体です。
/**
* 自定义map实现升级版 1、提升查询效率 2、底层结构就是:数组+链表
*
* @author Linlin Zhao
*
*/
public class map002 {
LinkedList[] arr = new LinkedList[999];
int size;
public void put(Object key, Object value) {
Entry e = new Entry(key, value);
int a = key.hashCode() % arr.length;
if (arr[a] == null) {
LinkedList<Entry> list = new LinkedList<Entry>();
arr[a] = list;
list.add(e);
} else {
LinkedList<Entry> list = arr[a];
for (int i = 0; i < list.size(); i++) {
Entry e2 = (Entry) list.get(i);
if (e2.key.equals(key)) {
e2.value=value;//键重复、直接覆盖
return;
}
}
arr[a].add(e);
}
}
public Object get(Object key) {
int a = key.hashCode() % arr.length;
if (arr[a] == null) {
return null;
} else {
// 遍历list
LinkedList<Entry> list = arr[a];
for (int i = 0; i < list.size(); i++) {
Entry e = (Entry) list.get(i);
if (e.key.equals(key)) {
return e.value;
}
}
}
return null;
}
public static void main(String[] args) {
map002 map = new map002();
map.put("001", "111");
map.put("002", "111");
map.put("002", "222");
map.put("003", "333");
System.out.println(map.get("002"));
}
}
class Entry {
Object key;
Object value;
public Entry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
}
単純な比較3、いくつかの実装クラスの地図
地図インタフェースの実装クラスは以下のとおりです。HashMapの、TreeMapの、のWeakHashMap、ConcurrentHashMapの、ハッシュテーブル。LinkedHashMapは、HashMapのサブクラスです。
(1)のHashMap:
基礎となる配列+リンクリストの実装、キーが格納され、ヌルヌル値、スレッドセーフされてもよいです。
(2)ハッシュテーブル:
元の配列+リンクリストの実装、キーまたは値が全体のハッシュテーブルのデータが変更され、低効率をロック達成するためにヌル、スレッドセーフ、スレッドセーフな方法であることができないかどうか、のConcurrentHashMapは、関連する最適化されません。
(3)のConcurrentHashMap:
リンクされたリストの実装+、スレッドセーフを使用してアレイの底部セグメント。ハッシュテーブルの効率よりも高いです。
全体マップは、N個のセグメントに分割されを通じて、我々は同じスレッドセーフを提供することができますが、N回、16回、デフォルトのアップグレードの効率を高めるために。(読み取り操作は、変数のHashEntry値が揮発性であるため、ロックされませんが、また、最新の値を読み取るために確保する。)
ハッシュテーブル全体ハッシュテーブルのために同期されている、あること、の各スレッドは、排他的に、テーブル全体をロックしますノードは、複数の修飾キーロック分離技術という点で、並行して行わせること、のみConcurrentHashMapのノードをロック。
(4)のTreeMap:
実装SortMapインターフェイス、それはソート済みキー対から取り出される保存キーの順序に従って記録することができます。
自然の秩序やカスタムオーダートラバーサルキーを必要とあれば、好ましいのTreeMapを使用しています。
(5)のLinkedHashMap:
HashMapのサブクラス。また、二重にリンクされたリストに配置キーと値のペア、ハッシュテーブルの各キーに位置する両方の内部秩序を維持するために、二重リンクリストもあります。挿入のため、アクセス順序:のLinkedHashMapは、オーダーの2種類をサポートしています。
+ LinkedListのHashMapのは、HashMapの操作、メンテナンス、使用LinkedListの挿入配列エレメントを使用して、両方のデータ構造、すなわち、と考えることができます。
(6)のWeakHashMap:
及びキー値があれば、キーがもはや外部参照されているように、ごみ収集されてもよい用いWeakMap「弱い参照」アプローチであることを除いて、HashMapの類似。
関連推奨:
HashMapのハッシュテーブルの違いは?