二,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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
网友评论