2019独角兽企业重金招聘Python工程师标准>>>
MAP:
HashMap/ConcurrentHashMap
Hashtable
LinkedHashMap
TreeMap/ConcurrentSkipListMap(跳表实现)
IdentityHashMap,key只有严格 == 时才算相同,put相同的key才会覆盖,而不是相等时覆盖
EnumMap,Enum做为key,并且会根据key的自然顺序保存
WeakHashMap,key没有强引用时会被GC回收,健值都被从map中删除
WeakHashMap:
WeakReference是“弱键”实现的哈希表。它这个“弱键”的目的就是:实现对“键值对”的动态回收。当“弱键”不再被使用到时,GC会回收它,WeakReference也会将“弱键”对应的键值对删除。
“弱键”是一个“弱引用(WeakReference)”,在Java中,WeakReference和ReferenceQueue 是联合使用的。在WeakHashMap中亦是如此:如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。 接着,WeakHashMap会根据“引用队列”,来删除“WeakHashMap中已被GC回收的‘弱键’对应的键值对”。
另外,理解上面思想的重点是通过 expungeStaleEntries() 函数去理解。
https://www.cnblogs.com/skywang12345/p/3311092.html
http://www.cnblogs.com/kersen0815/p/5325434.html
LinkedHashMap
LinkedHashMap增加了时间和空间上的开销,但是它通过维护一个额外的双向链表保证了迭代顺序。特别地,该迭代顺序可以是插入顺序,也可以是访问顺序。
LinkedHashMap可以用来实现LRU (Least recently used, 最近最少使用)算法。
实现时需要做两点:
1.调用该构造方法并将accessOrder置为true,当accessOrder为true时,get方法和put方法都会调用recordAccess方法使得最近使用的Entry移到双向链表的末尾;
2.覆盖方法removeEldestEntry,当put新元素当时候,此方法用来判断时map扩容还是LRU淘汰。应该处理成if(size() > maxSize) return true;
http://blog.csdn.net/justloveyou_/article/details/71713781
put操作时 将新增的节点,连接在链表的尾部
在执行get,put,remove方法后分别回调了HashMap为其预留的方法(覆盖)
void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }
在这些方法里处理链表变化。
https://blog.csdn.net/zxt0601/article/details/77429150
Java堆结构PriorityQueue完全解析
PriorityQueue
优先队列, 逻辑结构是一棵完全二叉树(根结点存储最小值),存储结构其实是一个数组。
逻辑结构层次遍历的结果刚好是一个数组,从小到大。
PriorityQueue默认是一个小顶堆,然而可以通过传入自定义的Comparator函数来实现大顶堆:
PriorityQueue< Integer > queue = new PriorityQueue < Integer > (26, Collections.reverseOrder());
https://blog.csdn.net/u013309870/article/details/71189189
https://blog.csdn.net/kobejayandy/article/details/46832797
Java 集合系列目录
http://www.cnblogs.com/skywang12345/p/3323085.html
java.util.BitSet 位操作,set(N):将N位设置true