1、hashmap和hashtable基本定义
hashmap:允许key和value都为空,线程不安全;
hashtable:不允许空值,线程安全;
hashmap :数组+链表+哈希算法(MD5);
2、基本数据结构:数组、链表、红黑树
程序 = 数据结构 + 算法
-
数组:一段连续的存储单位,在创建时指定大小。查询快,新增删除慢;如ArrayList;
-
链表:查询慢、新增删除快;pre指向前一个,next指向后一个;如LinkedList双向链表;
-
红黑树:左中右的结构,查询快、新增删除慢;TreeNode;
3、hashmap的底层实现
hashmap : key、value;
put:hash(key)计算key的哈希值(假设469),之后取模(mod,假设%10),得出存储位置9;此时将新建一个数组,假设大小为9,此时arr[9] =value1;若出现hash冲突,则将该数据扩充为链表,此时arr[9]=value2,next指向value1;当取模超出数组大小时,会进行数组扩容,将原来的数据放到新的大数组中;hashmap默认使用链表,当链表长度大于8(默认)时,会将链表转为红黑树;
get:hash(key)求出哈希值,之后取模找到存储位置,比较哈希值是否相等,若不相等则查找next是否相等,递归调用一直查找到对应的value;