默认情况下,HashMap 初始容量是16,负载因子为 0.75
当两个对象的hashcode相同会发生什么,?如果两个键的hashcode相同,你如何获取值对象?
hash碰撞
HashMaP会先用key对象的hashcode找到bucket位置,之后调用keys.equals()<equals()方法仅仅在获取值对象的时候才出现>方法,去找到LinkedList中正确的结点。
重新调整HashMap大小存在什么问题?
多线程的情况下会出现竞争(多个线程发现需要扩容),【在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket时,HashMap并不会将链表放在尾部而是头部,
这是避免尾部遍历<tail traversing:这是为了避免在新列表插入数据时,遍历队尾的位置,因为直接插入的效率更高,但是如果插入队尾,还得遍历出队尾的位置,这是一种损耗>。
https://blog.csdn.net/xiaohui127/article/details/11928865
队头插入方式,导致HashMao在多线程的情况下,死循环的问题。<JDK1.8的优化了这个问题,通过增加tail指针,既避免了死循环问题(让数据直接插入到队尾),又避免了尾部遍历。>】
【ps如果在多线程的情况下可以反问,为什me还要用HashMap】
为什么String, Interger这样的wrapper类适合作为键?
String类不可变,它是final修饰的,而且重写了hashcode 和equals 。其他wrapper类类似,
其他可以参考:
https://segmentfault.com/a/1190000012926722
http://tracylihui.github.io/2015/07/01/Java%E9%9B%86%E5%90%88%E5%AD%A6%E4%B9%A01%EF%BC%9AHashMap%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/