衡水精品网站建设价格,网站搬家 备案,国内做网站的企业,广州网站制作怎样HashMap是数组链表实现的#xff0c;既然用到hash散列#xff0c;那么肯定不可避免的会出现冲突问题#xff0c;HashMap解决冲突的方法是拉链法#xff0c;因为这里有用到数组#xff0c;那么当容量不足的时候就需要进行扩容操作了#xff0c;在HashMap中有个术语叫冲突链表实现的既然用到hash散列那么肯定不可避免的会出现冲突问题HashMap解决冲突的方法是拉链法因为这里有用到数组那么当容量不足的时候就需要进行扩容操作了在HashMap中有个术语叫冲突当冲突几率越来越高的时候就需要进行扩容操作了
那什么情况就叫冲突几率高呢就是当我们的数组元素个数超过了数组原先大小*装填因子默认情况下的装填因子是0.75扩容有个坏处就是每次扩容之后都必须重新计算原先数组中的元素在新数组中的存储位置这点比较消耗性能所以一般情况下如果你已经能够确定最大需要多大散列范围的数组的话建议还是能够指定大小
put操作和set操作进行操作的对象是主要是key如果你查看源码的话会发现value只是跟着key的步伐在走而已并没有实质性的进行操作对于put操作首先会计算出当前key对应的hash值接着找到计算出来的hash值在数组中的下标位置查看该下标位置处对应的链表是否为null为空的话直接将当前键值对插入到该链表首位不会执行当前key对象的equals方法
如果下标位置处对应的链表不为null的话会通过for循环来通过key的equals方法来查看这个链表中有没有与当前键值相等的键值对Entry存在有的话会用当前值替换原先这个键值对的value值遍历结束如果不存在的话会将当前键值对插入到链表的头部这个就是put过程了
get操作过程思想可以借助于put过程首先会计算出当前key值的hash值接着找到此hash值在数组中的位置找到这个位置对应的链表接着通过for循环遍历这个链表遍历过程中调用equals方法查看有没有等于当前key的键值对存在有的话直接返回这个键值对对应的value值即可
HashMap注意点
1、 HashMap是非线程安全的也就是说你在使用迭代器的过程中有其他线程修改了map的话你的程序可能会抛出ConcurrentModificationException异常这就是我们常见的fail-fast机制了原因在于我们在调用HashMap的迭代器里面的每个方法的时候都会通过判断原先map被修改次数和当前被修改次数是否相等不等的话直接就抛出了ConcurrentModificationException异常了这点在ArrayList里面使用迭代器也会出现具体解决方法就是使用ConcurrentHashMap代替HashMap了
2、HashMap是允许你的键或者值为null的
3、HashMap是不能保证随着时间的推移你里面元素之间的顺序不变原因就在于map中存放hash值的数组在扩容的时候会重新计算原先元素在新数组中位置的