Map
一、HashMap
1、实际上是一个“链表散列”,就是链表和数组的结合体,底层是一个数据结构(Entry<K,V>[] table),数组每一项是一个链表
transient Entry<K,V>[] table;
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;</span>
int hash;
/**
* Creates new entry.
*/
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
public final K getKey() {
return key;
}
public final V getValue() {
return value;
}
.............
}
2、HashMap的性能参数
//默认初始容量,必须是2的倍数;
static final int DEFAULT_INITIAL_CAPACITY = 16;
//最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
//默认负载因子(HashMap中元素达到这个比例时,进行扩容)
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//capacity * load factor 当容器中元素个数到达这个值时,进行扩容resize
int threshold;
//用户设定的负载因子
final float loadFactor;
//For fast-fail机制:HashMap(非线程安全的)的修改次数,iterator遍历时,检测这个值,有变化,抛出//ConcurrentModificationException
transient int modCount;
//map中存储数据的数组,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry对象。
transient Entry<K,V>[] table;
a、负载因子衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。
b、因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。
c、默认的的负载因子0.75是对空间和时间效率的一个平衡选择。当容量超出此最大容量时,resize后的HashMap容量是容量的两倍。
3、HashMap的操作分析:
<1>、indexfor函数根据hash和length计算出元素位置,通过h&(length-1)返回,而length都是2的倍数,性能上的提高
<2>、hash增加高位运算
java8新增特性—lambda表达式
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getKey().compareTo(c2.getKey());
}
二、TreeMap
基于红黑树实现,源码分析得其属性包括根节点、结点数、排序器、fail-fast属性(快速失败机制),共有13个内部类
构造函数有四种:1、空的使用键的自然顺序;2、提供排序器;3、提供参数,自然顺序;4、提供参数,提供排序器;
三、LinkedHashMap
扩展了HashMap,依元素插入的顺序维持元素的映射链表,linked提供双向链表
四、IdentityHashMap类、EnumMap类不详