Merlin的魔力: 维护插入顺序

J2SE 1.4 为 Java Collections Framework 引入了两个新实现, LinkedHashSet 和 LinkedHashMap 。添加这两个新实现的好处是散列集合现在可以维护贯穿其元素的两条路径。除标准的散列关系之外,现在还有一个可遍历整个集合的链表。正常情况下,这个新的第二路径会遵循插入顺序,这意味着集合的迭代器将按照元素的插入顺序返回元素(而不按它们的散列码将其组合成一个集合的顺序),但 LinkedHashMap 支持第二种排序选项:按存取顺序而非插入顺序维护链表。

我们来看一下这些新类是如何工作的。

开始

开始使用这些新类非常容易。 只需导入 java.util 包并找到一组要使用的项目。在我们的示例中,我们将使用日历表的月份。在使用集时我们将使用英语月份名称,在使用映射表时用英语和意大利语的月份名称。

清单 1. 开始定义类

import java.util.*;
public class OrderedAccess {
  public static void main(String args[]) {
   String months[] =
    new DateFormatSymbols().getMonths();
   String italianMonths[] =
    new DateFormatSymbols(Locale.ITALIAN).getMonths();
  }
}

我将假定您已经知道了英语月份的名称和顺序。对于那些不熟悉意大利语月份名称的人们,它们是:Gennaio、Febbraio、Marzo、Aprile、Maggio、Giugno、Luglio、Agosto、Settembre、Ottobre、Novembre 和 Dicembre, 虽然由于某些原因 getMonths() 返回的名称不是大写的。

使用新 HashSet

LinkedHashSet 是基本 HashSet 类的一个子类。因此, 凡是 HashSet 能做的工作, LinkedHashSet 也能做到。 类中没有新方法。您能得到的只有 4 个构造函数:

LinkedHashSet()

   LinkedHashSet(Collection c)

   LinkedHashSet(int initialCapacity)

   LinkedHashSet(int initialCapacity, float loadFactor)

要向集中添加元素,我们可以为每个元素调用 add() ,或创建一个 Collection 并将它传递到构造函数。因为数组中已经有了元素,所以最简单的机制就是使用 Arrays.asList() ,它会返回一个包装成 List 中的数组,同时维持原始数组的顺序。通过将 list 传递到构造函数,我们可以很轻松地将相同的 list 添加到 LinkedHashSet 和简单的 HashSet 中。

清单 2. 填充集

List list = Arrays.asList(months);
  Set orderedSet = new LinkedHashSet(list);
  Set unorderedSet = new HashSet(list);

在填满了集之后,我们可以检查它们的元素,看看链接的集是否按插入顺序维护其元素, 然后与标准散列集比较结果。您可以通过集的 iterator() 手工迭代每个集的各个元素,或只调用 toString() 方法(隐式地),实际上就是它为我们做了那些工作。

清单 3. 显示集结果 

System.out.println("Ordered:  " + orderedSet);
  System.out.println("Unordered: " + unorderedSet);

时间: 2024-11-03 08:38:41

Merlin的魔力: 维护插入顺序的相关文章

Merlin的魔力: J2SE 1.4.2提供两种新的外观设计

迄今为止,所有Merlin的魔力专栏都是关于Java 1.4版本的新特性,本文主要针对目前正在测试的1.4.2版本.Sun认为Windows的经典外观已经过时,没有人再使用Motif了 -- 至少在用户桌面上.您将在这一标准Java平台的最新版本中找到新款Windows外观以及称为GTK+的全新外观,当用户使用Windows XP操作系统时新款Windows外观看起来象Windows XP,GTK+使用普通Linux桌面的外观. Swing架构提供可插入外观框架.例如,该框架提供一种标准方法使所

Merlin的魔力: Swing 的新JFormattedTextField组件

Java 2 标准版(J2SE),版本 1.4 为可用的 GUI 元素调色板添加了 2 个新的 Swing 组件: JSpinner 和 JFormattedTextField .在 Merlin 的魔力专栏的第一篇我们就介绍了 JSpinner 组件:我们现在将要探讨 JFormattedTextField . 虽然 JFormattedTextField 组件看起来与 JTextField 相似,但是它的行为与 JSpinner 完全不同.在最简单的情况下,您可以为电话号码提供一个类似"(#

Merlin的魔力: 异常和日志记录

为了理解问题的根源并适当地响应,Merlin 发行版添加了几个与异常处理相关的功能.现在,您不必手工分析堆栈转储信息就可以检查堆栈跟踪信息,并且可以把异常连成一条菊花链,这样就能够在重新抛出异常时附加上异常的原因,这会大大促进调试工作.此外,现在还有一个内建的日志记录工具用来记录消息的不同级别.在 Merlin 的魔力系列的这一部分,John Zukowski 演示了这些新的日志记录和异常功能的工作原理并提供了一个示例程序以供查看和下载. 这个 Merlin 发行版中新添加的许多功能(比如异常处

Merlin的魔力: 焦点,焦点,还是焦点

基于Swing的GUI还有一些遗留问题,包括如何管理焦点(哪个组件有接收键盘输入的优先权),如何判断哪个组件拥有焦点,以及如何将焦点从一个组件遍历到下一个组件.由于Swing建立在抽象窗口工具包(AWT)之上,对组件焦点的管理便依赖于AWT中的底层焦点管理.Java平台过去的版本依赖于本地的窗口管理器来协助进行焦点管理,所以尽管有些开发者会认为焦点控制是在他们的应用程序内部进行的,而实际情况并非如此.由于对底层的本地焦点系统的依赖性,因而出现了许多平台不相容的现象. 至于Merlin,它为您提供

Merlin的魔力: Java联网增强技术

Java 编程中的联网包括了定位和识别资源的能力以及通过 TCP 和 UDP 连接进行通信的能力.首先,您需要识别具有象 www.ibm.com 这样名称的资源,然后打开到该资源的连接,最后在您自己和连接的另一端之间发送信息包.由于安全性原因,可能会包括其它任务,但是整个过程是一样的.对于 Java 平台,会在 java.net 包中找到支持这些操作的类.从 Java 编程的早期到现在,这些操作中大多数都未曾发生太大的变化.但是,随着 Merlin 的发展,这些基本操作中有些已经作了改进,以支持

Merlin的魔力: Merlin的新I/O缓冲区的输入和输出

Java 2 平台标准版(Java 2 Platform Standard Edition,J2SE)1.4 对 Java 平台的 I/O 处理能力做了大量更改.它不仅用流到流的链接方式继续支持以前 J2SE 发行版的基于流的 I/O 操作,而且 Merlin 还添加了新的功能 - 称之为新 I/O 类(NIO),现在这些类位于 java.nio 包中. I/O 执行输入和输出操作,将数据从文件或系统控制台等传送至或传送出应用程序.(有关 Java I/O 的其它信息,请参阅 参考资料). 缓冲

Merlin的魔力: 长期持久性

Merlin 的一种新功能在 Sun 的 Swing Connection 中以各种形式出现已有一段时间了,实际上它首次被讨论是在 1999 年的 JavaOne 展示会上.这个功能可以将 JavaBean 组件状态长期持久地保存在 XML 文档中.序列化工作适合短期编组的需要(对于 CORBA 和 RMI)或适合将状态信息保存在一个执行的 servlet 中.但是序列化会产生许多问题,包括类库版本或 Java 运行时环境方面的问题.新的 XMLEncoder / XMLDecoder 类允许将

Merlin的魔力: 动态事件监听器代理

所有 Swing 组件都是 JavaBeans 组件.它们有一系列的 setter 和 getter 方法,这些方法的类似于 void setXXX(类型名) 和 Type getXXX() .关于这些方法没有什么特别之处,并且正如所预期的,它们遵循 JavaBeans 的属性命名规范.我们今天要讨论的是JavaBeans 组件的一个方面,即一对监听器方法 addXXXListener (XXXListener name) 和 removeXXXListener (XXXListener nam

Merlin的魔力: 字符集

用数字表示 不怕明说,其实计算机只理解数字.但下面这一点可能就没那么明显 ― 因为计算机只理解数字,所以它们需要用某种形式把数字值映射为相应的字符,这样才能显示文本.就是这些映射(或 字符集)才使得计算机可以理解文本.例如,就为了这种映射,早期的台式机使用了 ASCII.当一台使用 ASCII 的计算机存储数字 72.101.108 和 112 时,它便知道要显示"Help"这个单词,因为在 ASCII 中,数字 72 是 H 的值.101 是 e 的值.108 是 l 的值.112