HashMap学习:链表数组,初始长度16,扩容因子0.75,代表每次容量为0.75的时候,就扩容为当前长度的2倍。同时实现了equals方法和hashcode方法,可以规避相同的K值存储一个,否则会放置多个。key可以为null。线程不安全,某些情况下会造成死锁
静态内部类:定义了一个entry类,用来保存键值对,同时next用来指向下一个entry,表示是一个链表
在扩容的时候涉及到数据搬迁,原来entry碰撞位置的指向是1-2-3的话,搬迁过后顺序为3-2-1,这个过程中有多线程的话,可能会造成循环链表1-2-1。http://www.importnew.com/22011.html
put方法,更具hashcode值确定元素的下标位置。会返回老的K对应的Value,更新新的Value
另:如果一个元素只实现lequals方法,没有实现hashcode方法的话,会造成K的预期错误,2个K值相等的元素会放入到hashmap中,想要的结果是k值一样,元素覆盖。对于HashMap,hash相等和K值相等的话才认为是同一个K。
以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突,才能使链表长度尽可能短,理想状态为1。因此可以得出结论:HashMap的查找时间复杂度只有在最理想的情况下才会为O(1),而要保证这个理想状态不是我们开发者控制的。