Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的摘要,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐使用的选项的信息,请参阅JDK发行说明。
Java集合框架的设计目标是确保核心集合接口和在早期Java平台版本中用于表示集合的类型之间的完全互操作性:Vector、Hashtable、数组和Enumeration。在本节中,您将学习如何将旧集合转换为Java集合框架集合,以及反之亦然。
假设您正在使用一个API,该API返回旧的集合,并与另一个要求实现集合接口的API一起使用。为了使这两个API之间能够顺利交互,您需要将旧的集合转换为现代集合。幸运的是,Java集合框架使这一过程变得简单。
假设旧的API返回一个对象数组,而新的API需要一个Collection。集合框架提供了一个方便的实现,允许将对象数组视为一个List。您可以使用Arrays.asList将数组传递给任何需要Collection或List的方法。
Foo[] result = oldMethod(arg); newMethod(Arrays.asList(result));
如果旧的API返回一个Vector或Hashtable,那么您根本不需要进行任何工作,因为Vector已经被修改为实现List接口,而Hashtable已经被修改为实现Map接口。因此,可以直接将Vector传递给任何需要Collection或List的方法。
Vector result = oldMethod(arg); newMethod(result);
同样地,Hashtable可以直接传递给任何需要Map的方法。
Hashtable result = oldMethod(arg); newMethod(result);
较少见的情况是,一个API可能返回表示对象集合的Enumeration。Collections.list方法将Enumeration转换为Collection。
Enumeration e = oldMethod(arg); newMethod(Collections.list(e));
假设您正在使用一个返回现代集合的API,并与另一个要求传递旧集合的API一起使用。为了使这两个API之间能够顺利交互,您需要将现代集合转换为旧集合。同样,Java集合框架使这一过程变得简单。
假设新的API返回一个Collection,而旧的API需要一个Object数组。如你所知,Collection接口包含一个专门用于此情况的toArray方法。
Collection c = newMethod(); oldMethod(c.toArray());
如果旧的API需要一个String数组(或其他类型的数组)而不是Object数组呢?你只需使用toArray的另一种形式,即接受数组作为输入的形式。
Collection c = newMethod(); oldMethod((String[]) c.toArray(new String[0]));
如果旧的API需要一个Vector,则标准的集合构造函数很方便。
Collection c = newMethod(); oldMethod(new Vector(c));
处理旧的API需要Hashtable的情况类似。
Map m = newMethod(); oldMethod(new Hashtable(m));
最后,如果旧的API需要一个Enumeration,该怎么办?这种情况并不常见,但偶尔会发生,因此提供了Collections.enumeration方法来处理它。这是一个静态工厂方法,它接受一个Collection并返回该Collection的元素上的Enumeration。
Collection c = newMethod(); oldMethod(Collections.enumeration(c));