学習のJava:Javaコンテナ--mapインターフェース(下層の実装コードは、HashMapをシミュレートするために)

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のハッシュテーブルの違いは?

公開された57元の記事 ウォン称賛13 ビュー1124

おすすめ

転載: blog.csdn.net/weixin_42924812/article/details/105130451