Java为数据结构中的映射定义了一个接口java.util.Map,它有HashTable、HashMap、WeakHashMap、LinkedHashMap以及TreeMap等实现类。
Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
使用映射的技术要点如下:    
HashMap是一个最常用的Map,它根据键的hashCode值存入数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap是无序的,则由iterator迭代出来的值是无序排列。HashMap最多只允许一条记录的键为null,多插入空键记录,数据会出现问题;允许多条记录的值为null;HashMap不支持线程的同步。如果需要同步,可以用Collections的synchronized方法使HashMap具有同步能力;
hashmap 底层是由哈希表进行插入和删除以及遍历。哈希表 是由数组+链表组成;数组 查询方便,插入删除麻烦; 链表 插入删除方便,查询麻烦 。哈希表则可以查询插入删除都方便
  HashMap里面实现一个静态内部类Entry,其重要的属性有 key, value, next
// 存储时:
int hash = key.hashCode(); //
int index = hash % Entry[].length;
Entry[index] = value;
相同index的元素用next连接
HashTable实现一个映射,所有的键值必须非空,为了能高效地工作,定义键的类必须实现hashCode()方法和equals()方法。HashTable是无序的,但是运用迭代默认以倒序输出元素。HashTable支持线程同步,即任一时刻只能有一个线程能写hashtable,因此导致HashTable在写入时会比较慢;
TreeMap  TreeMap的实现是红黑树算法的实现,能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用迭代器Iterator遍历TreeMap时,得到的记录是排过序的。
同时LinkedHashMap也能够排序,按插入顺序排序。 LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。
HashMap,LinkedHashMap,TreeMap三种类型分别在什么时候使用
  1、一般情况下,我们用的最多的是HashMap。HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
  2、TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
  3、LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。
 该次笔记只是简单介绍一下映射类HashTable、HashMap和TreeMap,并对各映射类进行比较。
源代码:   

package corejava;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
/**
 * 
 * 测试Map
 * **/
public class TestMap {
	public static void showHashMap(){
		Map<String, String> hashMap=new HashMap<String, String>();
		hashMap.put("001", "藻类植物");
		hashMap.put("002", "菌类植物");
		hashMap.put("003", "地衣类植物");
		hashMap.put("004", "蕨类植物");
		hashMap.put("005", "种子植物");
		hashMap.put("006", null);//HashMap中允许多个value值为空
		hashMap.put(null, "苔藓植物");//HashMap只允许一个key为空,否则
		Iterator<String> it=hashMap.keySet().iterator();//把hashMap的key值集合放到迭代器里,获得key值集合的迭代器
		System.out.println("1.操作HashMap显示植物种类");
		while(it.hasNext()){
			Object key=it.next();//获取每个键KEY值
			System.out.print(hashMap.get(key)+"\t");
		}
		System.out.println("");
	}
	public static void showHashtable(){
		Hashtable<String, String> hashTable=new Hashtable<String, String>();
		hashTable.put("001", "藻类植物");
		hashTable.put("002", "菌类植物");
		hashTable.put("003", "地衣类植物");
		hashTable.put("004", "蕨类植物");
		hashTable.put("005", "种子植物");
		Iterator<String> it=hashTable.keySet().iterator();//把hashTable的key值集合放到迭代器里,获得key值集合的迭代器
		System.out.println("2.操作hashTable显示植物种类");
		while(it.hasNext()){;
			Object key=it.next();//获取每个键KEY值
			System.out.print(hashTable.get(key)+"\t");
		}
		System.out.println("");
	}
	public static void showTreeMap(){
		TreeMap<String, String> treeMap=new TreeMap<String, String>();
		treeMap.put("001", "藻类植物");
		treeMap.put("002", "菌类植物");
		treeMap.put("003", "地衣类植物");
		treeMap.put("004", "蕨类植物");
		treeMap.put("005", "种子植物");
		treeMap.put("006", null);//treeMap中允许value值为空
		treeMap.put("007", null);
		Iterator<String> it=treeMap.keySet().iterator();//把treeMap的key值集合放到迭代器里,获得key值集合的迭代器
		System.out.println("3.操作treeMap显示植物种类");
		while(it.hasNext()){;
			Object key=it.next();//获取每个键KEY值
			System.out.print(treeMap.get(key)+"\t");
		}
		System.out.println("");
	}
	public static void showArrayList()
	{
		ArrayList<String> arraylist=new ArrayList<String>();
		arraylist.add("001藻类植物");
		arraylist.add("003地衣类植物");
		arraylist.add("006苔藓植物");
		arraylist.add("004蕨类植物");
		arraylist.add("005种子植物");
		arraylist.add("002菌类植物");
		System.out.println("4.排序前植物种类");
		for (int i = 0; i < arraylist.size(); i++) {
			System.out.print(arraylist.get(i)+"\t");
		}
		System.out.println();
        Collections.sort(arraylist);//对列表集合进行排序
		System.out.println("5.排序后植物种类");
		for (int i = 0; i < arraylist.size(); i++) {
			System.out.print(arraylist.get(i)+"\t");
		}
		System.out.println();
        }
public static void main(String[] args) {
	showHashMap();//操作HashMap显示植物种类
	showHashtable();
	showTreeMap();
	showArrayList();//再次加入arraylist是与Map类做个比较
}
}