HashMap超默认初始容量导致shiro脾气爆发小记

HashMap扩容:

 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    static final int MAXIMUM_CAPACITY = 1 << 30;

 
    static final float DEFAULT_LOAD_FACTOR = 0.75f;


    static final int TREEIFY_THRESHOLD = 8;


    static final int UNTREEIFY_THRESHOLD = 6;


    static final int MIN_TREEIFY_CAPACITY = 64;

分析hashMap源码时可以看出 hashMap设置了初始的容量

DEFAULT_INITIAL_CAPACITY 默认初始容量16

DEFAULT_LOAD_FACTOR  负载系数 0.75

initailCapacity * loadFactor = 12

当hashMap容量超出12时,hashMap会进行扩容 就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,也就是说你所有内容会重新位置会重新按照一定顺序重新排列

      这里就不做过多赘述了哈,需要了解的可以看看这位大佬的博客 HashMap之扩容原理

HashMap超默认初始容量导致shiro脾气爆发小记_第1张图片

可以看到当hashMap内容刚好是12个的时候  /**是在最后

HashMap超默认初始容量导致shiro脾气爆发小记_第2张图片

而内容超过12的时候,hashMap会重新排列位置导致 /** 到了其它位置没有居最后

当然这集成到shiro里面,shiro会按照排列来进行拦截放行操作

/**在java目录里面是所有

 HashMap超默认初始容量导致shiro脾气爆发小记_第3张图片

我这里做的是jwt登录验证,放行swagger2的接口文档

之前一直没有事情,后来超过了12这个阈值,导致hashMap重新排列把/**提前了,导致接口文档等内容无法放行

解决办法 :

      想办法让这个map里面的内容按照正常的顺序排列

HashMap超默认初始容量导致shiro脾气爆发小记_第4张图片

 可以看到LinkedHashMap 可以完美达到我们的要求

完全按照我们put的顺序存放  

 

你可能感兴趣的:(java异常收集及解决方案,java,散列表,shiro,hashMap扩容,LinkedHashMap)