天天看点

HashMap源码分析 jdk1.7 个人理解总结

HashMap源码分析 jdk1.7 个人理解总结

写博客是因为之前本地的笔记老是容易丢失,所以现在抽空把能找到的搬运到博客上,也是为了日后便于查看。个人理解,很可能有错误,大家批判着看

HashMap源码分析

1.数据结构:数组加链表

2.构造方法:初始化容量,加载因子

3.put方法:

1)第一次put的时候,初始化数组,数组大小是2的幂次方,默认16(算index的时候先算key的hash值,再用&的方法取index值)

2)扩容resize,新建一个数组,新数组的大小是旧数组的两倍;复制数据使用头插法,这就决定了HashMap不是线程安全的

节点Entry

key和value都可以为null,key为null的时候放在table[0]处,新的(null,value)会在table[0]处覆盖旧的value;table的每个节点是entity对象

其他小知识点

map的key最好用Integer或者String类型,因为这两种数据类型是final的,不会被修改,每次算出来的hash的值不会变。

如果换成object,object中的属性修改了,这个object就已经改变了,而object的地址可能不变,hashcode可能也不会变。

ArrayList:数组实现,默认初始容量10,扩容加50%

LinkList:双向链表实现,尾插法,没有初始化大小,没有扩容,直接追加

Vector:数组实现,跟ArrayList一样,只是加了synchronized,保证线程安全,扩容翻倍

HashTable:跟HashMap一样,只是每个方法加了synchronized,key不能为null

继续阅读