LinkedHashMap

来源:互联网 发布:网络监控app都有哪些 编辑:程序博客网 时间:2024/05/01 21:31
  1. LinkedHashMapLinkedHashMap所用的循环双链表如果只是从头上讲元素删除,接到尾上,其实是可以使用单链表的。其实是可以使用单链表的,在定位到某一个元素的过程中顺便就可以吧他前面的元素找到,这样就可以删除了,而在尾部的插入用单链表也能完成。这样写我才是比较节省时间吧。
    这一条(第一条)我理解错了,我以为是用我以为table[]所存的是一个双链表,其实LinkedHashMap是有两个链表,一个是继承了hashMaptable[]所存放的单链表用来实现hashMap,另一个是一个双链表实现得环,其中header在这个环中,header.before指向的事优先队列的队尾,header.after指向的队首
  2. LinkedHashMap中没用堆而是用了链表了来实现LRU算法。是因为每次往里面插入数据都是当前时间。就是从表尾插入,因为这个特性所以用了链表来实现一个优先队列。
  3. 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
原创粉丝点击