HashMap和HashTable主要的区别在哪?
HashTable的方法上面带有同步锁
HashMap里面的key能不能是null? HashTable呢?
hashMap能,可以发现不会报错
HashTable不行
是在这里报的错
HashMap的历史
链表
链表加数组
链表加数组加红黑树
单纯链表的HashMap是如何实现的
package com.shiyi.controller;
import java.util.ArrayList;
public class ArrayListHashMap<K,V> {
private ArrayList<Entry> arrayList = new ArrayList<Entry>();
class Entry<K,V>{
private K k;
private V v;
public Entry(K k, V v) {
this.k = k;
this.v = v;
}
}
public void put(K k,V v){
Entry entry = new Entry(k,v);
arrayList.add(entry);
}
public V get(K k){
for (Entry entry : arrayList) {
if (entry.k.equals(k)){
return (V) entry.v;
}
}
return null;
}
public static void main(String[] args) {
ArrayListHashMap<Object, Object> arrayListHashMap = new ArrayListHashMap<>();
arrayListHashMap.put("a","97");
arrayListHashMap.put("b",null);
System.out.println(arrayListHashMap.get("a"));
System.out.println(arrayListHashMap.get("b"));
}
}
单纯链表存在的问题
如果Map中的entry对象特别多,就会像这样
这时候去get的话,就要遍历特别多次才能遍历到
HashMap源码中一些常量都是干嘛的
//默认的初始容量
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//数组的最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
//默认的负载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//树化阈值(链表长度超过这个才能变成树)
static final int TREEIFY_THRESHOLD = 8;
//树降级成为链表的节点
static final int UNTREEIFY_THRESHOLD = 6;
//最小的树化容量(不仅仅要达到树化阈值,总量还要达到这个,才能树化)
static final int MIN_TREEIFY_CAPACITY = 64;