美文网首页
2018-06-20

2018-06-20

作者: 程序yuan | 来源:发表于2018-06-20 22:30 被阅读0次

二,LinkedHashMap详解

LinkedHashMap底层数据结构由链表和哈希表组成。由链表保证元素有序。由哈希表保证元素唯一

LinkedHashMap的两种排序

1,按插入顺序排序(默认)

2,访问顺序排序(lru是这种排序)

LinkedHashMap重写了父类HashMap的get方法,实际在调用父类getEntry()方法取得查找的元素后,再判断当排序模式accessOrder为true时,记录访问顺序,将最新访问的元素添加到双向链表的表头,并从原来的位置删除。由于的链表的增加、删除操作是常量级的,故并不会带来性能的损失

三,HashMap和ConcurrentHashMap的原理

1,原理

HashMap的原理:hashmap本质数组加链表。根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面

ConcurrentHashMap原理:在hashMap的基础上,ConcurrentHashMap将数据分为多个segment(类似HashTable),默认16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁得几率,提高并发效率

2,Hashmap的源码:

构造函数,空参或者单参时都会调用两个参数的

publicHashMap(intinitialCapacity,floatloadFactor){intcapacity =1;while(capacity < initialCapacity)          capacity <<=1;this.loadFactor = loadFactor;      threshold = (int)(capacity * loadFactor);      table =newEntry[capacity];      init();  }

有3个关键参数:

capacity:容量,就是数组大小

loadFactor:比例,用于扩容

threshold:=capacity*loadFactor  最多容纳的Entry数,如果当前元素个数多于这个就要    扩容(capacity扩大为原来的2倍)

Get方法:根据key算hash值,再根据hash值取得数组下标,通过数组下标取出链表,遍历链表用equals取出对应key的value

publicVget(Object key){if(key ==null)returngetForNullKey();inthash = hash(key.hashCode());for(Entry e = table[indexFor(hash, table.length)];          e !=null;          e = e.next) {          Object k;if(e.hash == hash && ((k = e.key) == key || key.equals(k)))returne.value;      }returnnull;  }

3,HashMap和ConcurrentHashMap,hashtable的区别

HashMap:线程不安全,效率高

ConcurrentHashMap:线程安全,效率高,默认提升16倍

Hashtable:线程安全,效率低

四,SparseArray原理

SparseArray是android里为这样的Hashmap而专门写的类,目的是提高内存效率,其核心是折半查找函数(binarySearch)。注意内存二字很重要,因为它仅仅提高内存效率,而不是提高执行效率

它要比 HashMap 节省内存,结构比HashMap简单(SparseArray内部主要使用两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的数据结构(主要是针对HashMap中的HashMapEntry而言的)。

作者:java小石头

链接:https://www.jianshu.com/p/f7a30554fe55

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

相关文章

  • 面向接口/协议编程

    2018-06-20继承和面向接口(iOS架构思想篇)

  • 2018-06-20

    幸福三阶 belivePossible 2018-06-20 22:15 · 字数 41 · 阅读 0 · 日记本...

  • 2019-06-12第十三天

    1、/*字符串切断转成数组*/ var sTr = '2018-06-20'; var aRr = sTr.spl...

  • 2019-04-08第十四天

    1、/*字符串切断转成数组*/ var sTr = '2018-06-20'; var aRr = sTr.spl...

  • 2019-06-02

    那些年我们唱过的歌 莲步 字数 2324 · 阅读 30 2018-06-20 13:38 要...

  • 新一代建树工具IQ-Tree介绍

    原创:montreal生信人2018-06-20 系统发育树(phylogenetic tree)构建的软件可谓五...

  • 《PRESS.one改变世界之研究报告篇》

    [PRESSone拓荒者] 6月24日 作者:刘胜新 日期:2018-06-20 https://www.jia...

  • 日精进打卡(第348天)

    2018-06-20 姓名:李义 公司:........ 组别:259期利他二组 【知~学习】 背诵 六项精进大纲...

  • 2019-04-10

    日IP千万,如何解决环境问题 发布时间:2018-06-20 09:55:06| 来源:IDC | 访问次数: 日...

  • 技术新闻集锦

    移动开发:2018-06-20 FB正在大规模重构React Native,预计今年发布iOS组件化与模块化前端...

网友评论

      本文标题:2018-06-20

      本文链接:https://www.haomeiwen.com/subject/gbrfyftx.html