Java集合之LinkedHashMap

  • HashMap 是无序的,HashMap 在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历HashMap的顺序跟put的顺序不同(除非在put时已经能确定key的hashcode值并按其排序)。
  • LinkedHashMap 是非线程安全的。
  • LinkedHashMap 是 HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序与插入的顺序一致,那么选用LinkedHashMap。
  • LinkedHashMap 是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序。特别是它不保证该顺序永恒不变。
  • LinkedHashMap 与 HashMap 的不同之处在于,LinkedHashMap 维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者访问顺序。

示例:HashMap

public static void main(String[] args){
	Map<String,String> map = new HashedMap();
	map.put("A","a");
	map.put("B","b");
	map.put("C","c");
	map.put("D","d");
	Set<String> set = map.keySet();
	for (String s : set){
		System.out.println(s + "_" + map.get(s));
	}
}

输出:

D_d
A_a
C_c
B_b

示例:LinkedHashMap

public static void main(String[] args){
	Map<String,String> map = new LinkedHashMap();
	map.put("A","a");
	map.put("B","b");
	map.put("C","c");
	map.put("D","d");
	Set<String> set = map.keySet();
	for (String s : set){
		System.out.println(s + "_" + map.get(s));
	}
}

输出:

A_a
B_b
C_c
D_d
  • LinkedHashMap:并且初始化LinkedHashMap,使用get可以按照访问顺序进行输出,观察输出结果我们会发现get()到的对象会放在后面,具体原因是因为采用了LRU(Least recently used)算法(太高深了,请自行搜索吧)。
  • LRU(Least recently used):最近最少使用,也就是说当缓存满了,会优先淘汰那些最近不常访问的数据。 new LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) initialCapacity:初始容量 loadFactor:负载系数 accessOrder:是否使用LRU算法: false——所有的Entry按照插入的顺序排序, true——所有的Entry按照访问的顺序排序 |——如果有a,b,c这3个Entry,那么访问了a,就把a移到尾部去,即b,c,a。每次访问都把访问的那个数据移到双向队列的尾部去,那么每次要淘汰数据的时候,双向队列最前头的数据就是最不常访问的数据,即双向链表最前面的数据就是要淘汰的数据。 "访问"有两层意思:1.根据key拿到value,即get()方法; 2.修改key对应的value,即put()方法。
public static void main(String[] args) {
	Map<String, String> map = new LinkedHashMap<String, String>(16,0.75f,true);
	map.put("A","a");
	map.put("B","b");
	map.put("C","c");
	map.put("D","d");

	map.get("C");
	map.get("A");
	Iterator iter = map.entrySet().iterator();
	while (iter.hasNext()) {
		Map.Entry entry = (Map.Entry) iter.next();
		System.out.println(entry.getKey() + "=" + entry.getValue());
	}
}

输出:

B=b
D=d
C=c
A=a

转载于:https://my.oschina.net/alarm1673/blog/828033

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值