HashMap无序 LinkedHashMap有序


        HashMap为什么无序?

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

即,hashMap顺序是由key的hash值决定的,而哈希值是由一定算法决定的。

        当使用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;  
           }  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值