今天上午在CSDN的论坛里看到有朋友提的问题如下:

  1. /** @param maxSize Maximum sum of the sizes of the Bitmaps in this cache */
  2. public LruMemoryCache(int maxSize) {
  3. if (maxSize <= 0) {
  4. throw new IllegalArgumentException("maxSize <= 0");
  5. }
  6. this.maxSize = maxSize;
  7. this.map = new LinkedHashMap<String, Bitmap>(0, 0.75f, true);
  8. }

上面这段代码是github上面一个比较有名的开源项目中的一段,大概就是一个用LinkedHashMap来实现lru,我的问题LinkedHashMap构造函数的前2个参数,初始容量竟然是0?那加载因子0.75有何意义?据我所知,扩展容量时,是用初始容量*加载因子,这样的话,这个扩展的容量不是始终都是0了吗,初始也为0,扩展也为0,那这个hashmap还有何意义?不知道哪里理解错了

第一个网友的回答如下:

你再看看HashMap的源代码,看看是怎么扩容的。
       上面这段代码没有什么特别的地方,只是初始化了一个长度为0的HashMap,顺便设置了LinkedHashMap的访问顺序(第三个参数),  这种情况一般是创建时不确定Map中是否会有值及几个值,比较保守的写法,不想浪费空间。
        默认的构造方法是长度为16, 如果你不确定map中是否能放够16个键值,那么16的长度就浪费了。这样写也有不利的地方,多了几次运行时的扩容操作,作者可能认为空间更重要吧。

第二个网友的回答如下:

看看源码就知道了

其实第一个参数是你要设置的初始大小;而程序内部实际的初始大小是1;
       如果你设置的初始大小(initialCapacity)小于1, 那么map大小就是默认的1;
       否则会不断左移(乘2)直到capacity大于你设置的initialCapacity;

  1. public LinkedHashMap(int initialCapacity,
  2. float loadFactor,
  3. boolean accessOrder) {
  4. super(initialCapacity, loadFactor);//这里调用父类HashMap的构造方法;
  5. this.accessOrder = accessOrder;
  6. }
  7. public HashMap(int initialCapacity, float loadFactor) {
  8. if (initialCapacity < 0)
  9. throw new IllegalArgumentException("Illegal initial capacity: " +
  10. initialCapacity);
  11. if (initialCapacity > MAXIMUM_CAPACITY)
  12. initialCapacity = MAXIMUM_CAPACITY;
  13. if (loadFactor <= 0 || Float.isNaN(loadFactor))
  14. throw new IllegalArgumentException("Illegal load factor: " +
  15. loadFactor);
  16. // Find a power of 2 >= initialCapacity
  17. int capacity = 1;  // 默认是1
  18. while (capacity < initialCapacity)//不断翻倍直到大于人为设置的大小
  19. capacity <<= 1;
  20. this.loadFactor = loadFactor;
  21. threshold = (int)(capacity * loadFactor);//的确如你所言,后面如果需要增大长度,按照capacity*loadFactor取整后增长;
  22. table = new Entry[capacity];
  23. init();
  24. }

上面的两位网友的答复其实都已解答了发帖网友的疑问,第一位回复的网友显然是翻看过LinkedHashMap类的源码的。我写这篇博文目的在于记录分享,因为我之前在翻看Android 开源框架Universal-Image-Loader(在github上的地址:https://github.com/nostra13/Android-Universal-Image-Loader)里的那段源码时,也是不太明白作者意欲何为?当时没深究,今天上午在论坛里看到发帖的网友的提问及两位网友的答复,觉得这个问题有必要记录下。

LinkedHashMap<String, Bitmap>(0, 0.75f, true) LinkedHashMap的加载因子和初始容量分配的更多相关文章

  1. HashMap默认加载因子为什么选择0.75?(阿里)

    Hashtable 初始容量是11 ,扩容 方式为2N+1; HashMap 初始容量是16,扩容方式为2N; 阿里的人突然问我为啥扩容因子是0.75,回来总结了一下: 提高空间利用率和 减少查询成本 ...

  2. 使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载

    一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.NET 运行时无法回收它们,如果我们要实现插件热加载 (例如 Razor 或 Aspx 模版的热 ...

  3. [转]为什么Java中的HashMap默认加载因子是0.75

    前几天在一个群里看到有人讨论hashmap中的加载因子为什么是默认0.75. HashMap源码中的加载因子 static final float DEFAULT_LOAD_FACTOR = 0.75 ...

  4. setUserVisibleHint的使用.执行顺序和viewPager.setOffscreenPageLimit(0)不管用还是默认会加载第二个fragment

    处理问题一:viewPager.setOffscreenPageLimit(0)不管用还是默认会加载第二个fragment的原因(源码解读); 处理问题二:setUserVisibleHint的使用场 ...

  5. 为什么HashMap初始大小为16,为什么加载因子大小为0.75,这两个值的选取有什么特点?

    先看HashMap的定义: public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V> ...

  6. 为什么HashMap的加载因子是0.75?

    说在前面 ​ 在HashMap中,默认创建的数组长度是16,也就是哈希桶个数为16,当添加key-value的时候,会先计算出他们的哈希值(h = hash),然后用return h & (l ...

  7. pytorch1.0神经网络保存、提取、加载

    pytorch1.0网络保存.提取.加载 import torch import torch.nn.functional as F # 包含激励函数 import matplotlib.pyplot ...

  8. React Router 4.0 + webpack 实现组件按需加载

    网上关于React Router 4.0的按需加载文章有很多,大致的思路都一样,但是其实具体实现起来却要根据自己的实际情况来定,这里主要介绍一下我的实现方式. 主要方式是通过Route组件的rende ...

  9. Spring Boot 2.4.0正式发布,全新的配置文件加载机制(不向下兼容)

    千里之行,始于足下.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://www.you ...

随机推荐

  1. 47.使用 RequireJS 加载 AngularJS

    转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 目前的版本没有遵循 Javascript 约定的 AMD 模块化规范, 因此使用 Requ ...

  2. isInstanceOf,asInstanceOf,classOf[T]

    一.scala中把classOf[T]看成Java里的T.class, obj.isInstanceOf[T]看成 obj instanceof T, obj.asInstanceOf[T]看成(T) ...

  3. BZOJ 3130 二分+网络流

    思路: 不被题目忽悠就是思路 二分一下max 判一下等不等于最大流 搞定 7 9 1 1 2 3 1 3 3 2 3 3 3 4 2 3 5 2 3 6 1 4 7 2 5 7 2 6 7 2 这里有 ...

  4. jquery on event

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  5. NodeJS代码调试

    1.在Chrome打开chrome://flags/#enable-devtools-experiments 2.激活Developer Tools experiments 3.重启Chrome 4. ...

  6. [ZJOI2012]旅游(树的直径)

    [ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示 ...

  7. python中一些有用的函数------持续更新中

    strip() 函数 用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. str2 = " Runoob " # 去除首尾空格 print (str2.strip()) ...

  8. 【Codeforces Round #422 (Div. 2) A】I'm bored with life

    [题目链接]:http://codeforces.com/contest/822/problem/A [题意] 让你求a!和b!的gcd min(a,b)<=12 [题解] 哪个小就输出那个数的 ...

  9. 【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理

    敌方飞机应该不定时的出现,有自己的生命周期.运动轨迹.这个类用来管理敌机的产生.移动.爆炸.销毁等. 敌机管理类主要函数例如以下 //绑定控制器(更新分数) void bindController(C ...

  10. Codeforces 528A Glass Carving STL模拟

    题目链接:点击打开链接 题意: 给定n*m的矩阵.k个操作 2种操作: 1.H x 横向在x位置切一刀 2.V y 竖直在y位置切一刀 每次操作后输出最大的矩阵面积 思路: 由于行列是不相干的,所以仅 ...