简单的asp网站国际学院网站建设的意义
web/
2025/9/29 9:29:38/
文章来源:
简单的asp网站,国际学院网站建设的意义,那个网站可以免费建站,网站后台管理系统需求LinkedHashMap 集合源码分析 文章目录 LinkedHashMap 集合源码分析一、字段分析二、内部类分析三、构造方法分析四、内部方法分析五、总结 LinkedHashMap 是 HashMap 的子类#xff0c;在 HashMap 的基础上维护了双向链表#xff0c;保证了有序性。默认是不排序的#xff0c…LinkedHashMap 集合源码分析 文章目录 LinkedHashMap 集合源码分析一、字段分析二、内部类分析三、构造方法分析四、内部方法分析五、总结 LinkedHashMap 是 HashMap 的子类在 HashMap 的基础上维护了双向链表保证了有序性。默认是不排序的可在初始化时传入 accessOrder true则进行排序
一、字段分析
// 指向LinkedHashMap 维护的双向链表的头结点
transient LinkedHashMap.EntryK,V head;
// 指向LinkedHashMap 维护的双向链表的尾结点
transient LinkedHashMap.EntryK,V tail;
// 是否排序默认false不排序。设为true时越近访问的节点越靠近尾结点即头结点 - 尾结点
// 按 最近访问时间降序排列即越靠近尾结点离上次访问时间越近。
final boolean accessOrder;二、内部类分析
//可以看到是继承了 hashmap 的 node再次基础上多了 before 和 after就是用来维护双向链表的
static class EntryK,V extends HashMap.NodeK,V {EntryK,V before, after;Entry(int hash, K key, V value, NodeK,V next) {super(hash, key, value, next);}}三、构造方法分析 //传入默认的初始容量 和 加载因子默认不排序public LinkedHashMap(int initialCapacity, float loadFactor) {super(initialCapacity, loadFactor);accessOrder false;}//闯入默认的初始容量默认不排序public LinkedHashMap(int initialCapacity) {super(initialCapacity);accessOrder false;}//无参构造默认不排序public LinkedHashMap() {super();accessOrder false;}//传入集合m来使用集合m的所有元素来构建 LinkedHashMap默认不排序public LinkedHashMap(Map? extends K, ? extends V m) {super();accessOrder false;putMapEntries(m, false);}//传入初始容量加载因子也可指定进行排序即truepublic LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) {super(initialCapacity, loadFactor);this.accessOrder accessOrder;}四、内部方法分析
LinkedHashMap 的添加元素、删除元素扩容等方法都是直接使用 了 HashMap 的方法。但在 HashMap 的基础上做了扩展体现了多态性。主要是三种方法 afterNodeRemoval将被删除的节点从 LinkedHashMap 维护的双向链表中移除。afterNodeInsertion用来判断是否删除 LinkedHashMap 维护的双向链表的头结点即最久未被访问的节点。afterNodeAccess将传入的node节点放置末尾即最近访问的元素。 //将 e 节点从双向链表中删除void afterNodeRemoval(NodeK,V e) { // unlinkLinkedHashMap.EntryK,V p (LinkedHashMap.EntryK,V)e, b p.before, a p.after;p.before p.after null;if (b null)head a;elseb.after a;if (a null)tail b;elsea.before b;}//evicttrue删除最久未被访问的元素即双向链表的头结点void afterNodeInsertion(boolean evict) { // possibly remove eldestLinkedHashMap.EntryK,V first;if (evict (first head) ! null removeEldestEntry(first)) {K key first.key;removeNode(hash(key), key, null, false, true);}}//节点e是刚刚访问的节点判断是否需将其移动至双向链表的尾结点void afterNodeAccess(NodeK,V e) { // move node to lastLinkedHashMap.EntryK,V last;if (accessOrder (last tail) ! e) {LinkedHashMap.EntryK,V p (LinkedHashMap.EntryK,V)e, b p.before, a p.after;p.after null;if (b null)head a;elseb.after a;if (a ! null)a.before b;elselast b;if (last null)head p;else {p.before last;last.after p;}tail p;modCount;}}
五、总结
我们知道 HashMap 并不能保证有序性而 LinkedHashMap 作为 HashMap 子类解决了排序的问题。在构造时通过传入afterNodeAccess true 来设置LinkedHashMap是有序的。通过维护双向来链表来保证有序性拥有变量 head 和 tail 分别指向双向链表的头结点和尾结点越靠近 尾结点越是最近访问的节点越是靠近头结点越是越久未被访问的节点。可用于实现 LRU 算法 使用 LinkedHashMap 实现 LRU class LRUCache extends LinkedHashMapInteger, Integer{private int capacity;public LRUCache(int capacity) {super(capacity, 0.75F, true);this.capacity capacity;}public int get(int key) {return super.getOrDefault(key, -1);}public void put(int key, int value) {super.put(key, value);}Overrideprotected boolean removeEldestEntry(Map.EntryInteger, Integer eldest) {return size() capacity; }
}不适用 LinkedHashMap 实现 LRU class LRUCache {static class Node{public int key;public int val;public Node prev;public Node next;public Node(){this.key -1;this.val -1;}public Node(int key,int val){this.key key;this.val val;}}//最大容量 int capacity;//节点数量int size;//虚拟头节点Node dummyHead;//虚拟尾节点Node dummyTail;MapInteger,Node map new HashMap();public LRUCache(int capacity) {this.capacity capacity;this.size 0;dummyHead new Node();dummyTail new Node();dummyHead.next dummyTail;dummyTail.prev dummyHead;}public int get(int key) {if(!map.containsKey(key)){return -1;}Node node map.get(key);//将该节点从原位置删除remove(node);//将该节点添加到链表尾部addLeast(node);return node.val;}public void put(int key, int value) {Node cur new Node(key,value);remove(map.get(key));addLeast(cur);}//删除节点public void remove(Node node){if(node null) return;node.prev.next node.next;node.next.prev node.prev;node.next null;node.prev null;size --;map.remove(node.key);}//将节点添加到尾部public void addLeast(Node node){Node prev dummyTail.prev;prev.next node;node.prev prev;node.next dummyTail;dummyTail.prev node;size ;map.put(node.key,node);//超过最大容量了if(size capacity){removeFirst();}}//删除头节点public Node removeFirst(){if(dummyHead.next dummyTail) return null;Node remove dummyHead.next;remove(remove);return remove;}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83820.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!