HashMap的实现:
1存储方式的不足:
数组:插入删除困难
链表:查询困难 新增删除操作只需要操作当前节点,时间复杂度1;查找操作,遍历整个表,时间复杂度为n
注:
数组:给定下表查找,时间复杂度1;给定值查找,时间复杂度为n;插入删除操作,设计元素的移动,时间复杂度为n
链表:除了第一个和最后一个元素,每一个元素都有一个前驱和后继,
组成:
单链表(当前节点,下一个节点,最后一个节点指向null)
循环单链表(最后一个节点的指针指向头结点)
双向链表(一个前驱,当前节点,一个后继)
循环双向链表(头结点的前驱设置为尾节点,而尾节点的后继设置为头结点)
二叉树:插入、删除平均复杂度为n
哈希表:不考虑冲突的情况下,一次定位就可以实现增删改
哈希表的主干就是数组,查找通过hash函数计算出实际的存储地址,然后将需要的值和对应存储地址的值进行比对,相等就从数组中取出就可以;不相等就和链表的下一个值比对,直到取出相等的值为止
插入操作通过hash函数找到对应的地址,如果已经存在数值,则在链表中的下一个位置
哈希冲突:
2解决方案:
提出hashmap,使用数组+链表的方法,用了链地址法
hashmap:
数组;
主干是一个entry数组,链表则是主要为了解决哈希冲突而存在,每个entry对应的是key-value的键值对
链表:
3hashmap的实现方法:
拉链法(链表的数组)
继承实现:
继承abstractMap
实现map
构造函数:
初始容量:
创建哈希表时的容量
加载因子:
容量满的程度
太大:查找效率低
太低:稀疏空间浪费
存储结构:
数组:
模拟指针:
实现过程:
key=null
putForNullKey
!=null
计算key的hash值,搜索table数组
有元素:
比较key:
相同覆盖
不投放链头部
没元素:
直接保存
数组:
占用内存严重,空间复杂度较高
寻址容易,插入和删除困难
链表:
寻址容易,插入和删除困难
hashMap和hashtable的不同: