常用Map集合包括:HashMap,HashTable,LinkedHashMap,TreeMap
HashMap与HashTable:
HashTable是线程安全的,它的key与value不允许为null值。HashMap则允许key或value为null,HashMap与HashTable对key的hash算法和hash值到内存的映射算法不同。
HashMap的数据结构:HashMap底层使用数组实现,数组内存储Entry对象,这也是Map迭代时可以使用Map.Entry的原因。Entry对象包含了key,value,hash,next。next指向另外一个Entry,因此HashMap实际上是一个链表的数组。当Map的put()方法产生冲突时,新的值会替换旧值,同时next指向旧值,这样在一个数组索引空间存放多个值。
HashMap的构造方式:HashMap构造时可以指定其数组的容量参数,和负载因子,默认情况其容量为16,负载因子为0.75,同时内部维护一个thresHold阈值,为负载因子*当前数组容量,当实际存入的元素个数超过阈值时,HashMap会进行扩容,因此HashMap的填充比不会超过负载因子,合理的指定容量与负载因子,减少hash冲突,可以提高HashMap的操作效率。
有序的HashMap---LinkedHashMap:
LinkedHashMap在继承HashMap基础上,维护了一个链表,依据构造函数参数LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder),维护两种内部元素的顺序,加入时的顺序和最近一次使用顺序即get()使用的顺序。当使用accesssOrder 为true时,记录get取得的数据顺序,但是在迭代时使用get会报错,在这种情况下get操作会修改元素位置,导致并发的异常,需要注意使用。
可排序的Map---TreeMap:
TreeMap功能强大,实现了SortedMap接口,具备排序功能。TreeMap排序是基于元素本身的顺序排序,即元素的Comparator方法或Comparable,来确定元素顺序。TreeM