HashMap学习笔记01 (此篇主要分析HashMap的功能优势和基本属性)
常见的数据结构:集合,线性结构,树形结构,图形结构
ArrayList基于数组,便于查找不便于增加删除
单向链表 class Node{Object data;Node next}
LinkedList基于双向链表 class Node{Object data;Node next;Node pre} 便于删除增加不便于查找
HashMap则是结合了数组和链表
存储单位为: Node{hash; key; value; Node next}
存储数组: Node<K,V>[] table
key-value数量 size ,也是之后常用到的hashMap.size的来源
阈值: threshold (当table为空时,该值初始容量默认为12;当table被填充了,也就是为table分配内存空间后,threshold一般为 capacity(初始容量默认为16)*loadFactory。HashMap在进行扩容时需要参考threshold)
负载因子 : loadFactor 代表了table的填充度有多少,默认是0.75 (在HashMap构建的时候赋值)
操作数 : modCount 用于快速失败,由于HashMap非线程安全,在对HashMap进行迭代时,如果期间其他线程的参与导致HashMap的结构发生变化了(比如put,remove等操作),需要抛出异常ConcurrentModificationException
数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前Node的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。