HashMap无序与LinkedHashMap有序_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > HashMap无序与LinkedHashMap有序

HashMap无序与LinkedHashMap有序

 2011/11/11 16:37:43  xiaoZ5919  http://xiaoz5919.iteye.com  我要评论(0)
  • 摘要:HashMap为什么是无效?HashMap的数据结构是table[entry],entry是一个链表结构,数据的每个元素是一个链表。不同key,但是具有相同hashcode会落在table[hashcode]的链表上当使用iterator遍历时,使用如下code:finalEntry<K,V>nextEntry(){if(modCount!=expectedModCount)thrownewConcurrentModificationException();Entry<K
  • 标签:has Map Hash

HashMap为什么是无效?

?

HashMap的数据结构是table[entry],entry是一个链表结构,数据的每个元素是一个链表。不同key,但是具有相同hashcode会落在table[hashcode]的链表上

当使用iterator遍历时,使用如下code:

?

final Entry<K,V> nextEntry() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
            Entry<K,V> e = next;
            if (e == null)
                throw new NoSuchElementException();

            if ((next = e.next) == null) {//如果链表中的最后一个元素则取table中的下一个element中的链表
                Entry[] t = table; //HashMap中的table[entry]
                while (index < t.length && (next = t[index++]) == null)
                    ;
            }
            current = e;
            return e;
        }
?

?

?

如上代码,顺序每次都是固定的,并且按照table+entry链表的顺序,而不是插入顺序。

LinkedHashMap用额外的链表保证插入顺序

??void createEntry(int hash, K key, V value, int bucketIndex) {

        HashMap.Entry<K,V> old = table[bucketIndex];
        Entry<K,V> e = new Entry<>(hash, key, value, old);
        table[bucketIndex] = e;
        e.addBefore(header);//插到链表中
        size++;
    }
?

 Entry<K,V> nextEntry() {//遍历链表
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
            if (nextEntry == header)
                throw new NoSuchElementException();

            Entry<K,V> e = lastReturned = nextEntry;
            nextEntry = e.after;
            return e;
        }
?

?

发表评论
用户名: 匿名