使用HashMap的一个子类LinkedHashMap(顺序遍历的HashMap)进行研究
放入方法中:
重写了最关键的Node<K, V> newNode(int hash, K key, V value, Node next)方法,该方法首先创建一个HashMap.Node的子类LinkedHashMap.Entry,它比Node多了两个指针Entry<K, V> before, after;//用于保存前后两个节点的信息。
Tips:
LinkedHashMap拥有两个瞬时的属性
transient LinkedHashMap.Entry<K,V> tail;//用于保存上一个元素,即表尾;
transient LinkedHashMap.Entry<K, V> head;//用于保存第一个元素,即表头。
遍历:
使用LinkedEntryIterator迭代器进行遍历,继承于 abstract class LinkedHashIterator抽象类。该迭代器拥有两个Entry的指针next和current,并结合Entry中的before和after指针,实现了LinkedHashMap中元素的顺序遍历。
LinkedHashIterator的nextNode方法使用了LinkedHashMap.Entry<K, V>的after属性,使得iterator的遍历按照放入顺序进行的。
取值方法:
LinkedHashMap重写了Map接口的V get(Object key)方法,该方法分两个步骤:
调用父类HashMap的getNode(hash(key), key)方法,获取value;
如果accessOrder(访问后重排序)为true(默认为false),那么移动所访问的元素到表尾,并修改head和tail的值。
实现一个保证迭代顺序的HashMap
最新推荐文章于 2024-06-05 10:05:05 发布