目录
(1)k-v存储,最后是存储在HashMap$Node=newNode(hash,key,value,null);
(2)k-v为方便遍历,还会创建EntrySet集合,该集合存放Entry,一个Entry对象就有k-v;
(3)当把HashMap$Node对象存放到entrySet就方便我们遍历,因为Map.Entry提供了getKey()方法和getValue()方法

(4)map中,key相同,值覆盖,如下方法:
①记录旧值;
②值替换为新加入的值

(5)HashMap没有实现同步,不是线程安全,底层是以hash表来存储(数组+链表+红黑树)
(1)执行构造器,初始化加载因子loadfactor=0.75

(2)执行put()方法

(3)计算key的hash值

(4)执行putVal()方法
①判断表是否为空,为空

②判断该hash位置是否为空,为null,将添加值放入

③判断table的索引位置的key的hash值和新的key的hash值相同相同,并且满足现有的节点的key和准备添加节点的key是同一个对象||equals相同,就只能替换key-value;

④如果当前table的节点已经是红黑树,就按照红黑树方法处理

⑤如果找到的节点后面是链表,就循环比较:
A、若整个链表没有和他相同,加到该链表的最后,加入后,判断当前链表个数是否已经8个,超过后进行红黑树树化treeifBin();
B、如果在循环比较中,发现有相同,不添加break,只是替换value

树化,若表为空或表长小于64,就不会树化,而是进行扩容

⑥增加修改次数和数组大小,判断是否需要扩容

(1)特点:
①键和值不能为null;

②是线程安全;

③底层是一个数组,HashTable$Entry,初始化大小为11;
(2)底层:
执行addEntry()添加k-v封装到Entry

rehash()方法扩容,按照两倍+1扩容


把传入的实现Comparator接口的匿名内部类,传给TreeMap

添加的元素



