15.5 将用户定义的类存储于collection中
为了简单,前面的例子在类集中存储内置的对象,如string或integer.当然,类集并没有被限制为只能存储内置的对象。完全相反的是,类集的能力是它能存储任何类型的对象,包括你所创建的类的对象。例如,考虑下面的例子,在这个例子中使用linkedlist存储信箱地址。
// a simple mailing list example.
import java.util.*;
class address {
private string name;
private string street;
private string city;
private string state;
private string code;
address(string n, string s, string c,
string st, string cd) {
name = n;
street = s;
city = c;
state = st;
code = cd;
}
public string tostring() {
return name + "\n" + street + "\n" +
city + " " + state + " " + code;
}
}
class maillist {
public static void main(string args[]) {
linkedlist ml = new linkedlist();
// add elements to the linked list
ml.add(new address("j.w. west", "11 oak ave",
"urbana", "il", "61801"));
ml.add(new address("ralph baker", "1142 maple lane",
"mahomet", "il", "61853"));
ml.add(new address("tom carlton", "867 elm st",
"champaign", "il", "61820"));
iterator itr = ml.iterator();
while(itr.hasnext()) {
object element = itr.next();
system.out.println(element + "\n");
}
system.out.println();
}
}
程序的输出如下所示:
j.w. west
11 oak ave
urbana il 61801
ralph baker
1142 maple lane
mahomet il 61853
tom carlton
867 elm st
champaign il 61820
除了在类集中存储用户定义的类之外,关于上面程序的另一个重要的,值得注意的事情是它是非常短的。当考虑用50行代码建立一个能够实现存储,检索,以及处理信箱地址的链表时,类集框架的能力就变得显而易见了。正如大多数读者知道的那样,如果所有这些功能都必须用人工编写代码的话,程序将比现在的长好几倍。类集对许多不同的编程问题提供了现成的解决方案。每当情况出现时,就可以用它们。
15.6 处理映射
正如在本章开始时所谈到的,除了类集,java 2还在java.util中增加了映射。映射(map)是一个存储关键字和值的关联或者说是关键字/值对的对象。给定一个关键字,可以得到它的值。关键字和值都是对象。关键字必须是唯一的。但值是可以被复制的。有些映射可以接收null关键字和null值。而有的则不行。
15.6.1 映射接口
因为映射接口定义了映射的特征和本质,因此关于映射的讨论从这里开始。下面的接口支持映射:
接口描述
map 映射唯一关键字给值
map.entry 描述映射中的元素(关键字/值对)。这是map的一个内部类
sortedmap 扩展map以便关键字按升序保持
下面对每个接口依次进行讨论。
map 接口
map接口映射唯一关键字到值。关键字(key)是以后用于检索值的对象。给定一个关键字和一个值,可以存储这个值到一个map对象中。当这个值被存储以后,就可以使用它的关键字来检索它。由map说明的方法总结在表15-6中。当调用的映射中没有项存在时,其中的几种方法会引发一个nosuchelementexception异常。而当对象与映射中的元素不兼容时,引发一个classcastexception异常。如果试图使用映射不允许使用的null对象时,则引发一个nullpointerexception异常。当试图改变一个不允许修改的映射时,则引发一个unsupportedoperationexception异常。
表15-6 由map 定义的方法
方法描述
void clear( ) 从调用映射中删除所有的关键字/值对boolean containskey(object k) 如果调用映射中包含了作为关键字的k,则返回true;否则返回false
boolean containsvalue(object v) 如果映射中包含了作为值的v,则返回true;否则返回falseset entryset( ) 返回包含了映射中的项的集合(set)。该集合包含了类型map.entry的对象。这个方法为调用映射提供了一个集合“视图”boolean equals(object obj) 如果obj是一个map并包含相同的输入,则返回true;否则返回falseobject get(object k) 返回与关键字k相关联的值int hashcode( ) 返回调用映射的散列码boolean isempty( ) 如果调用映射是空的,则返回true;否则返回falseset keyset( ) 返回一个包含调用映射中关键字的集合(set)。这个方法为调用映射的关键字提供了一个集合“视图”object put(object k, object v) 将一个输入加入调用映射,覆盖原先与该关键字相关联的值。关键字和值分别为k和v.如果关键字已经不存在了,则返回null;否则,返回原先与关键字相关联的值void putall(map m) 将所有来自m的输入加入调用映射object remove(object k) 删除关键字等于k的输入
续表
方法描述
int size( ) 返回映射中关键字/值对的个数collection values( ) 返回一个包含了映射中的值的类集。这个方法为映射中的值提供了一个类集“视图”映射循环使用两个基本操作:get( )和put( )。使用put( )方法可以将一个指定了关键字和值的值加入映射。为了得到值,可以通过将关键字作为参数来调用get( )方法。调用返回该值。
正如前面谈到的,映射不是类集,但可以获得映射的类集“视图”。为了实现这种功能,可以使用entryset( )方法,它返回一个包含了映射中元素的集合(set)。为了得到关键字的类集“视图”,可以使用keyset( )方法。为了得到值的类集“视图”,可以使用values( )方法。类集“视图”是将映射集成到类集框架内的手段。
sortedmap 接口
sortedmap接口扩展了map,它确保了各项按关键字升序排序。由sortedmap说明的方法总结在表15-7中。当调用映射中没有的项时,其中的几种方法引发一个nosuchelementexception异常。当对象与映射中的元素不兼容时,则引发一个classcastexception异常。当试图使用映射不允许使用的null对象时,则引发一个nullpointerexception异常。表15-7 由sortedmap 定义的方法
方法描述
comparator comparator( ) 返回调用排序映射的比较函数。如果调用映射使用的是自然顺序的话,则返回nullobject firstkey( ) 返回调用映射的第一个关键字sortedmap headmap(object end) 返回一个排序映射,该映射包含了那些关键字小于end的映射输入object lastkey( ) 返回调用映射的最后一个关键字sortedmap submap(object start, object end) 返回一个映射,该映射包含了那些关键字大于等于start同时小于end的输入sortedmap tailmap(object start) 返回一个映射,该映射包含了那些关键字大于等于start的输入排序映射允许对子映射(换句话说,就是映射的子集)进行高效的处理。使用headmap( ),tailmap( )或submap( )方法可以获得子映射。调用firstkey( )方法可以获得集合的第一个关键字。而调用lastkey( )方法可以获得集合的最后一个关键字。
map.entry 接口
map.entry接口使得可以操作映射的输入。回想由map接口说明的entryset( )方法,调用该方法返回一个包含映射输入的集合(set)。这些集合元素的每一个都是一个map.entry对象。表15-8总结了由该接口说明的方法。
表15-8 由map.entry 定义的方法
方法描述
boolean equals(object obj) 如果obj是一个关键字和值都与调用对象相等的map.entry,则返回trueobject getkey( ) 返回该映射项的关键字object getvalue( ) 返回该映射项的值int hashcode( ) 返回该映射项的散列值object setvalue(object v) 将这个映射输入的值赋给v.如果v不是映射的正确类型,则引发一个classcastexception 异常。如果v 存在问题, 则引发一个illegalargumentexception异常。如果v是null而映射又不允许null关键字,则引发一个nullpointerexception异常。如果映射不能被改变,则引发一个unsupportedoperationexception异常。
15.6.2 映射类
有几个类提供了映射接口的实现。可以被用做映射的类总结如下:
类描述
abstractmap 实现大多数的map接口
hashmap 将abstractmap扩展到使用散列表
treemap 将abstractmap扩展到使用树
weakhashmap 将abstractmap扩展到使用弱关键字散列表
注意abstractmap对三个具体的映射实现来说,是一个超类。weakhashmap实现一个使用“弱关键字”的映射,它允许映射中的元素,当该映射的关键字不再被使用时
闽公网安备 35060202000074号