74.HashMap
-
Map接口常用实现类:HashMap、Hashtable和Properties
-
HashMap是Map接口使用频率最高的实现类
-
HashMap是以key-value对的方式来存储数据
-
key不能重复,但是值可以重复,允许使用null健和null值
-
如果添加相同的key,会覆盖原来的key
-
与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的
-
HashMap没有实现同步,因此线程是不安全的,方法没有做同步互斥的操作,没有synchronized
HashMap底层扩容机制:
-
HashMap底层维护了Nod类型的数组table,默认为null
-
当创建对象时,将加载因子(loadfactor)初始化为0.75
-
当添加key-val时,通过key的哈希值得到在table的索引。然后判断该索引处是否有元素,如果没有元素直接添加。如果该索引处有元素,继续判断该元素的key是否和准入加入的key相等,如果相等,直接替换val;如果不相等需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不够,需要扩容
-
第1次添加,则需要扩容table容量为16,临界值为12
-
以后再扩容,则需要扩容table为原来的2倍,临界值为原来的2倍,既24,以此类推
模拟HashMap触发扩容,树化情况
public class HelloJava { public static void main(String[] args) { HashMap hashMap = new HashMap(); for (int i = 1;i <= 12;i++){ hashMap.put(new A(i),"hello"); } hashMap.put("aaa","bbb"); System.out.println("hashMap=" + hashMap); } } class A{ private int num; public A(int num) { this.num = num; } //所有的A对象的HashCode都是100 @Override public int hashCode() { return 100; } @Override public String toString() { return "A{" + "num=" + num + '}'; } }
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Java高级Day23-HashMap
发表评论 取消回复