1、map的特点:key只有一个,而一个key可以有多个value,并且key值不可以出现重复项。就好比,一个孩子只有一个亲生父亲,而一个父亲可以派生出多个亲生孩子。他继承了AbstractMap类。
2、hashMap可以序列化(即实现了Serializable接口,推荐打开源码看一下,141行),所以线程不安全。如果再线程中一般情况下使用ConcurrentHashMap来操作。在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而 HashMap 没有锁机制,不是线程安全的。
3、hashMap的底层在jdk1.8之前主要是数组和链表组成,jdk1.8之后新增了红黑树的特性。数组是hashMap的主体,而链表是为了解决哈希冲突(下方有对hash冲突的解释)。.HashMap中主要是通过key的hashCode来计算hash值(查看每一个map的哈希值下方标注),然后通过hash值选择不同的数组来存储。
只要hashCode相同,计算出来的hash值就一样,如果存储对象多了,就有可能不同的对象计算出来的hash值是相同的,这就出现了所谓的hash冲突,HashMap的底层是通过链表来解决hash冲突的。
具体就是把相同hash值的HashMap,通过链表的形式进行存储,相当于存储的数组就是哈希表,数组的每个元素都是一个单链表的头结点,链表是用来解决hash冲突的,如果不同的key映射到了数组的同一位置,那么就将其放入单链表中。
4、插入元素的方式有jdk1.8之前的头插法,转换成了尾插法
5、HashMap的默认大小为16,并且一 定是2的指数,每次扩容都为old*2。