HashMap<>(128)
128代表的是什么?
这是一个构造方法吗?
128代表key还是value?
hashMap的结构是数组加链表形式,其中你的128就是数组的初始长度,hashMap会有一套hash算法,将键进行hash算法之后,和数组的下标做一一对应,也就说,当你是hashMap(128),那么在hashMap被创建的那一刻起,就已经分配了128个位置,这128个位置可以存储128个不同hashcode的键,你可以认为就是可以存储128个不同的键,当128个不同的键存储满了之后,有一个新的键(第129)个键来了,并且hashcode还是第129个,也就是说hashCode是不同于前面的128个,那么此时就会进行数组扩容,扩容算法是 128 + 128>>1 === 128*1.5 ===192,依次类推.
新建一个HashMap的时候,可以通过initialCapacity设置HashMap长度的初始化值。如:Map<String, Object> resultMap = new HashMap<String, Object>(initialCapacity: 5);
在hashMap源码中initialCapacity的初始值为16,负载因子为0.75;所以一个hashMap中默认存储长度为16 * 0.75 = 12,也就是如果hashMap.put的键值对数量小于12的时候,hashMap位置够用;
但是当添加的键值对数超过12后,hashMap需要扩容,一倍,也就是长度从12扩容到24;例如键值对一共13个,这样剩余11个位置性能都浪费了,那么如果已知需要添加的键值对数量,就可以通过
设置initialMap的值,来避免hashMap扩容,减少性能消耗。我们需要往hashMap中添加6个键值对,6 / 0.75 = 8;那就可以把initialCapacity设置为9比较合适,节省性能。
还有疑问可以百度搜一下 HashMap 负载因子
开辟了128个大小的空间。
Map<String, String> m= new HashMap<>(3);// 不创建内部存储数组
m.put("k","v");// 内部空间开辟了 3(数组长度=3)
点进去看底层源码就知道了。
理解成数组,hashmap底层就是动态数组加链表的结构,128代表数组长度为128
点进去源码,看一下文档说明