快速业务通道

Merlin的魔力: 维护插入顺序 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
   LinkedHashMap(int initialCapacity, float loadFactor)    LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)    LinkedHashMap(Map)

添加的构造函数处理存取顺序选项。把 false 存取顺序作为缺省值, 要获得一个存取顺序的列表,您必须传入一个 true ;也即映射表的头部是使用时间距今最远的映射表条目。

常规 HashMap 的子类 LinkedHashMap 的一个优点是迭代次数不受映射表容量的影响。使用 LinkedHashMap 时,选择大容量对迭代遍历次数没有任何影响, 但使用常规 HashMap 时要影响到性能。

向映射表添加元素要比向集添加元素更加棘手一些,只是因为我们不得不单独 put() 每一对元素。下面的代码并没有什么特别之处, 只是我们要循环遍历月份名称,而不是只向构造函数传递一个 Map 。

清单 6. 填充映射表

Map orderedMap = new LinkedHashMap();   Map unorderedMap = new HashMap();   for (int i=0, n=months.length; i < n; i++) {    orderedMap.put(months[i], italianMonths[i]);    unorderedMap.put(months[i], italianMonths[i]);   }

幸运的是,与集相同,您可以只调用映射表的 toString() 方法来获取按插入顺序排列的映射表条目。这种调用将以 key=value 的形式返回每个键值对。

清单 7. 显示映射表结果 System.out.println("Ordered:  " + orderedMap);

System.out.println("Unordered: " + unorderedMap);

已排序的映射表显示如下:

清单 8. 显示已排序的映射表结果

Ordered:

{January=gennaio, February=febbraio, March=marzo, April=aprile,   May=maggio, June=giugno, July=luglio, August=agosto, September=settembre,   October=ottobre, November=novembre, December=dicembre, =}

Merlin的魔力: 维护插入顺序(3)

时间:2011-02-02 John Zukowski

而未排序的映射表显示如下:

清单 9. 显示未排序的映射表结果

Unordered: {August=agosto, July=luglio, November=novembre, June=giugno,   October=ottobre, April=aprile, May=maggio, March=marzo, January=gennaio,   February=febbraio, =, December=dicembre, September=settembre}

要自己核对,您可以迭代。所有的迭代器都知道插入顺序, 所以在接收到值迭代器 ( values() ) 时,您可以按插入顺序遍历那些值,如下所示:

清单 10. 迭代值 

Collection values = orderedMap.values();   for (Iterator i = values.iterator(); i.hasNext();    System.out.println(i.next()));

显示如下:

清单 11. 显示已排序的值gennaio

febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre

按存取顺序访问

我们将要讨论的新类的最后一个方面是 LinkedHashMap 的存取顺序选项。 将 true 传递到 LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 构造函数使您能够保持映射表的链表的存取顺序,从使用时间距今最远的到最近使用的。换句话说,新项目被添加到尾部,映射表查找操作将项目移到链表的尾部。最后一点十分重要。因为映射表的典型的读存取操作会改变顺序,如果多个线程可以从映射表读取,就应该同步存取操作。

为了演示,我们可以看几个月份并按新顺序打印:

清单 12. 按存取顺序访问元素

Map accessorderedMap =    new LinkedHashMap(20, .80f, true);   for (int i=0, n=months.length; i < n; i++) {    accessorderedMap.put(months[i], italianMonths[i]);   }   accessorderedMap.get("June");   accessorderedMap.get("April");   accessordere

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号