java linkedhashmap的迭代

java linkedhashmap的迭代,第1张

LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序

由哈希表保证键的唯一性

链表保证键盘的有序(存储和取出的顺序一致)

HashMap

是一个最常用的Map,它根据键的HashCode

值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

LinkedHashMap

LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序

顾名思义LinkedHashMap是比HashMap多了一个链表的结构。与HashMap相比LinkedHashMap维护的是一个具有双重

链表的HashMap,LinkedHashMap支持2中排序一种是插入排序,一种是使用排序,最近使用的会移至尾部例如 M1 M2 M3

M4,使用M3后为 M1 M2 M4

M3了,LinkedHashMap输出时其元素是有顺序的,而HashMap输出时是随机的,如果Map映射比较复杂而又要求高效率的话,最好使用

LinkedHashMap,但是多线程访问的话可能会造成不同步,所以要用CollectionssynchronizedMap来包装一下,从而实

现同步。其实现一般为:

Map<String String> map = CollectionssynchronizedMap(new LinkedHashMap(<String String));

import javautilHashMap;

import javautilIterator;

import javautilLinkedHashMap;

import javautilMap;

public class TestLinkedHashMap {

public static void main(String args[])

{

Systemoutprintln("LinkedHashMap");

Map<Integer,String> map = new LinkedHashMap<Integer,String>();

mapput(6, "apple");

mapput(3, "banana");

mapput(2,"pear");

for (Iterator it = mapkeySet()iterator();ithasNext();)

{

Object key = itnext();

Systemoutprintln( key+"="+ mapget(key));

}

Systemoutprintln("HashMap");

Map<Integer,String> map1 = new HashMap<Integer,String>();

map1put(6, "apple");

map1put(3, "banana");

map1put(2,"pear");

for (Iterator it = map1keySet()iterator();ithasNext();)

{

Object key = itnext();

Systemoutprintln( key+"="+ map1get(key));

}

}

}

运行结果如下:

LinkedHashMap

6=apple

3=banana

2=pear

HashMap

2=pear

6=apple

3=banana

分析:LinkedHashmap 的特点是put进去的对象位置未发生变化,而HashMap会发生变化

您好根据您的提问,linkedhashmap是链表连接,确实是有序的,用values方法返回一个包含所有value的collection,然后读第一条就可以了。

LinkedHashMap当前实现(Java 8)跟踪其尾部。如果考虑性能和/或 Map 大小,你可以通过反射访问该字段。

由于实施可能会发生变化,因此也可能采用后备策略。如果抛出异常,你可能希望记录某些内容,因此你知道实现已更改。

它可能看起来像:

public static Entry getFirst(Map map) {undefined

if (mapisEmpty()) return null;

return mapentrySet()iterator()next();

}

public static Entry getLast(Map map) {undefined

try {undefined

if (map instanceof LinkedHashMap) return getLastViaReflection(map);

} catch (Exception ignore) { }

return getLastByIterating(map);

}

private static Entry getLastByIterating(Map map) {undefined

Entry last = null;

for (Entry e : mapentrySet()) last = e;

return last;

}

private static Entry getLastViaReflection(Map map) throws NoSuchFieldException, IllegalAccessException {undefined

Field tail = mapgetClass()getDeclaredField(“tail”);

tailsetAccessible(true);

return (Entry) tailget(map);

}

LinkedHashMap是比HashMap多了一个链表的结构。与HashMap相比LinkedHashMap维护的是一个具有双重链表的HashMap,LinkedHashMap支持2中排序一种是插入排序,即插入是什么顺序,读出来的就是什么顺序。一种是使用排序,最近使用的会移至尾部例如 key1 key2 key3 key4,使用key3后为 key1 key2 key4 key3了。accessOrder为true表示使用顺序,false表示插入顺序。

基于LinkedHashMap的使用顺序的特性,我们可以用来实现LRU算法(Mybatis的LRU算法也是这样实现的)

bigSize表示缓存最大容量,超过这个值最近最少使用的key,将会被移除。

测试

结果如下,当我们重新访问前3个值后,他们会被放到链表最后。前面的值会被移除。

以上就是关于java linkedhashmap的迭代全部的内容,包括:java linkedhashmap的迭代、linkedhashmap和hashmap的区别、LinkedHashMap和HashMap的区别以及使用方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9334703.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存