Android开源框架Universal-Image-Loader源码——关于LinkedHashMap的加载因子和初始容量分配
来源:互联网 发布:网络保密管理规定 编辑:程序博客网 时间:2024/06/16 22:13
今天上午在CSDN的论坛里看到有朋友提的问题如下:
/** @param maxSize Maximum sum of the sizes of the Bitmaps in this cache */public LruMemoryCache(int maxSize) {if (maxSize <= 0) {throw new IllegalArgumentException("maxSize <= 0");}this.maxSize = maxSize;this.map = new LinkedHashMap<String, Bitmap>(0, 0.75f, true);}
上面这段代码是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;
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor);//这里调用父类HashMap的构造方法; this.accessOrder = accessOrder; } public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); // Find a power of 2 >= initialCapacity int capacity = 1; // 默认是1 while (capacity < initialCapacity)//不断翻倍直到大于人为设置的大小 capacity <<= 1; this.loadFactor = loadFactor; threshold = (int)(capacity * loadFactor);//的确如你所言,后面如果需要增大长度,按照capacity*loadFactor取整后增长; table = new Entry[capacity]; init(); }
上面的两位网友的答复其实都已解答了发帖网友的疑问,第一位回复的网友显然是翻看过LinkedHashMap类的源码的。我写这篇博文目的在于记录分享,因为我之前在翻看Android 开源框架Universal-Image-Loader(在github上的地址:https://github.com/nostra13/Android-Universal-Image-Loader)里的那段源码时,也是不太明白作者意欲何为?当时没深究,今天上午在论坛里看到发帖的网友的提问及两位网友的答复,觉得这个问题有必要记录下。
0 0
- Android开源框架Universal-Image-Loader源码——关于LinkedHashMap的加载因子和初始容量分配
- Android异步加载图片开源框架Universal-Image-Loader
- Android开源框架Universal-Image-Loader源码解析
- Android 图片加载框架Universal-Image-Loader源码解析
- Android开源框架Universal-Image-Loader
- 开源框架Android-Universal-Image-Loader
- Android 开源框架Universal-Image-Loader
- Android开源框架Universal-Image-Loader
- Android 开源框架Universal-Image-Loader
- Android开源框架 universal-Image-Loader
- Android 开源框架Universal-Image-Loader完全解析(五)- 从代码分析Android-Universal-Image-Loader的图片加载、显示流程
- Android 开源框架Universal-Image-Loader的使用
- Android-Universal-Image-Loader开源框架的使用
- Android 开源框架Universal-Image-Loader的初次使用
- Android 开源框架Universal-Image-Loader的设计思路
- Android 开源框架Universal-Image-Loader的配置
- Android开源框架Universal-Image-Loader的详情讲解
- Android图片异步加载框架Universal Image Loader的源码分析
- Android Studio 格式化快捷键和QQ 锁键盘快捷键冲突的处理
- How to reuse old PCs for Solr Search Platform?
- Core Java 结合 android 新发现(一)
- [学习记录]简单的异步操作
- C# WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键
- Android开源框架Universal-Image-Loader源码——关于LinkedHashMap的加载因子和初始容量分配
- eclipse正则表达式插件regex util
- 类模板示例及类中成员函数的模板化
- OFBiz学习笔记(一)
- OpenVPN 的握手协议分析
- Android 手机屏幕px转dp和dp转px工具类
- 分页查询
- iOS开发-widget基础
- eclipse搭建Python, Ruby开发环境