Map接口类的介绍
- HashMap:map接口中最常用的类,线程不安全的,效率高,可以在key或value上存储null
- LinkedHashMap:在HashMap上基础上新增了两个变量,用于指向前一个元素或后一个元素,在遍历操作比较频繁的时候,LinkedHashMap效率比HashMap高
- TreeMap:保证按照添加(key-value)的顺序进行排序,使用自然排序或者定制排序,底层实现原理:红黑树
- Hashtable:map接口中最古老的类,线程安全,效率低,不能在key或value上存储null
- Properties:常用来处理配置文件,key和value储存类型为String
Map接口结构的理解
- 与y=f(x)做比较,key相当于x,是唯一的,而value相当于y,是可重复的
- key:无序的,不可重复的,用set来存储 -------使用自定义类时需要重写equals()和hashcode()
- value:无序的,可重复的,使用Collection来存储 -------使用自定义类时需要重写equals()
- 键值对:(key - value)构成一个Entry对象
- entry:无序的,不可重复的,使用set来存储所有的entry
分析HashMap的实现原理
- DEFAULT_INITIAL_CAPACITY:HashMap默认容量:16
- DEFAULT_LOAD_FACTOR:HashMap默认加载因子:0.75
- threshold:扩容的临界值,容量*加载因子:12
- TREEIFY_THRESHOLD:链表中的长度大于该默认值,转化为红黑树:8
- MIN_TREEIFY_CAPACITY:数组的长度大于该默认值,转化为红黑树:64
JDK7:数组+链表
JDK8:数组+链表+红黑数
LinkHashMap实现原理
- 重写了HashMap中newNode方法
- 新建一个Entry内部类继承Node
- 新增了before、after两个变量用于存储前一个对象和后一个对象
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
如何遍历Map(以HashMap为例)
- keySet():遍历key值
- values():遍历value值
- entrySet():遍历key-value
@Test
public void test01(){
HashMap map = new HashMap();
map.put("name","大白");
map.put("age",21);
map.put("sex",true);
//遍历key值
Set set = map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println();
//遍历value值
Collection coll = map.values();
for (Object obj: coll) {
System.out.println(obj);
}
System.out.println();
//遍历key-value
Set entrySet = map.entrySet();
Iterator iterator1 = entrySet.iterator();
while (iterator1.hasNext()){
System.out.println(iterator1.next());
}
}