LinkedHashMap
来源:互联网 发布:网络监控app都有哪些 编辑:程序博客网 时间:2024/05/01 21:31
LinkedHashMap
如果只是从头上讲元素删除,接到尾上,其实是可以使用单链表的。其实是可以使用单链表的,在定位到某一个元素的过程中顺便就可以吧他前面的元素找到,这样就可以删除了,而在尾部的插入用单链表也能完成。这样写我才是比较节省时间吧。
这一条(第一条)我理解错了,我以为是用我以为table[]所存的是一个双链表,其实LinkedHashMap
是有两个链表,一个是继承了hashMap
的table[]
所存放的单链表用来实现hashMap
,另一个是一个双链表实现得环,其中header
在这个环中,header.before
指向的事优先队列的队尾,header.after
指向的队首- LinkedHashMap中没用堆而是用了链表了来实现LRU算法。是因为每次往里面插入数据都是当前时间。就是从表尾插入,因为这个特性所以用了链表来实现一个优先队列。
int rounded = number >= MAXIMUM_CAPACITY
? MAXIMUM_CAPACITY
: (rounded = Integer.highestOneBit(number)) != 0
? (Integer.bitCount(number) > 1) ? rounded << 1 : rounded
: 1;
将number向上取到最近的2的幂,比如7取到8,0取到1,234取到256。
先将number的二进制除最高不为0位保留其余位填零变成100000这样的形式,如果number原来为0则二进制含有0个一,函数返回1。如果number的二进制含有1个1则number为二的幂直接将number返回。否则将除最高位保留地位清零的number左移一位(也就是*2)后返回。
private void addBefore(LinkedHashMapEntry<K,V> existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; } 这个函数将新元素插入到header之前,也就是队尾。 不过我不明白调用这个函数的recordAccess(HashMap<K,V> m)为什么要传HashMap<K,V> m这个参数进去然后用m来访问accessOrder,直接访问accessOrder不行吗?
- containsValue(Object value)是直接搜优先队列中的元素来确定是否有value,这样比HashMap中需要循环table每一个元素快,但是当value==null时却还这样就比HashMap的实现慢了,因为HashMap中。。。(哎 我又想错了 HashMap中是key==null的元素在table[0]中)
今天看了几个博客都输LinkedHashMap数据遍历比hashmap快,明明是LinkedHashMap重写了迭代器的next()方法自然是前者快,前者直接是一条链表,而后者是好几条链表,遍历的时候中间还要遍历table数组。
0 0
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- LinkedHashMap
- SQL的JOIN和UNION
- linux下发送邮件
- Python随机数
- python中yield的使用
- 双击退出App 重写onBackPressed()
- LinkedHashMap
- Android 资料总结(全)
- 使用SFTP工具下载文件
- 对于html页面的重置问题
- java socket编程入门讲解
- 【React Native】iOS离线打包
- HTML第七章上机题3---------北大青鸟视频宣传
- 2.for循环的3种写法
- 循环结构(for循环和while循环的区别)