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的区别以及使用方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)