2018-06-20

二,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)