Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-05-06:请简述 LinkedHashMap 的工作原理和使用方式?

Moosphan opened this issue · comments

2019-05-06:请简述 LinkedHashMap 的工作原理和使用方式?

HashMap的基础上加入了双向链表记录插入顺序,常用作LRU算法

hash表实现快速查询,链表实现有序输出,将链表的快速插入删除和hash表的快速访问结合在一起

  • 查看LinkedHashMap源码发现是继承HashMap实现Map接口。也就是HashMap的方法LinkedMap都有。LinkHashMap与HashMap的主要区别是:LinkedHashMap是有序的,hashmap是无序的。LinkedHashMap通过维护一个双向链表实现有序,也正是因为要维护这个链表,内存上有更大的开销。
  • 补充下有序和无序
    • 我们说的无序是插入顺序和输出顺序不一致。
  • 补充一下链表结构和顺序结构:线性结构分为顺序结构,和链表结构。
    • 顺序结构:在内存中是一块完整有序内存。所以我们在查询的时候时候直接索引index,便可找到要查询的数据,速度非常快,缺点是插入删除慢。有点类似班级排队时(一列纵队),每个人都知道自己在第几个位置。老师只要说第三个位置,那这个同学立马知道老师要找的是自己。这时候要插入一个同学到第二个位置,所以之前第二个位置开始往后的每个同学的位置都要+1。所以比较慢。
    • 链表结构:通过结点头记录该结点的上一个结点和下一个下一个结点(就是传统的双链表,单链表就是只记录下一个结点,循环链表就是最后一个结点的下一个结点指向第一个结点)。正是因为这种关系,所以链表结构不需要一块完整的内存,而且插入删除相对快,但是查询相对慢。但是因为要维护结点头,所以内存开销相对大一点。有点类似于班级排队时,每个人虽然不知道自己的位置,但是知道自己前面是谁和后面是谁。当要插入一个同学b时到c前面时,只要c同学记住自己之前是a,现在换成b.b记住自己前面是a,后面是c。所以想对来说插入很快。删除类似。但是当老师按位置查询时,就要先从第一个开始计数,知道找到老师要找的数字。所以查询慢。

hashMap上接一个链表

综上,简单了解了一下linkedHashMap
1.有序的hashMap
2.工作原理 通过双向链表来实现有序的
3.使用方式 (我没玩过 坐等其他大牛回答 我先百度了解一哈)

打卡打卡

LinkedHashMap是基于Hash表和链表的实现,并且依靠着双向链表保证迭代顺序是插入的顺序。
可以说LinkedHashMap就相当于HashMap的儿子,因为它内部也是用HashMap实现的。

LinedHashMap 是有序的,且默认为插入的顺序,他是基于HashMap 和双向链表实现的,LinkedHashMap是线程不安全的

大家记得, 手写 BitmapLruCache, 我写过;(前一天晚上刚看, 第二天就遇到了, 分分钟默写一遍)

使用的话当然还是LruCache了, 他有一个三参数方法直接实现LruCache, 可以康康力扣的146题