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