用“集合框架”设计软件时,记住该框架四个基本接口的下列层次结构关系会有用处:
· Collection 接口是一组允许重复的对象。
· Set 接口继承 Collection,但不允许重复。
· List 接口继承 Collection,允许重复,并引入位置下标。
· Map 接口既不继承 Set 也不继承 Collection, 存取的是键值对
我们以下面这个图表来描述一下常用的集合的实现类之间的区别:
Collection/Map |
接口 |
成员重复性 |
元素存放顺序(Ordered/Sorted) |
元素中被调用的方法 |
基于那中数据结构来实现的 |
HashSet |
Set |
Unique elements |
No order |
equals() hashCode() |
Hash 表 |
LinkedHashSet |
Set |
Unique elements |
Insertion order |
equals() hashCode() |
Hash 表和双向链表 |
TreeSet |
SortedSet |
Unique elements |
Sorted |
equals() compareTo() |
平衡树(Balanced tree) |
ArrayList |
List |
Allowed |
Insertion order |
equals() |
数组 |
LinkedList |
List |
Allowed |
Insertion order |
equals() |
链表 |
Vector |
List |
Allowed |
Insertion order |
equals() |
数组 |
HashMap |
Map |
Unique keys |
No order |
equals() hashCode() |
Hash 表 |
LinkedHashMap |
Map |
Unique keys |
Key insertion order/Access order of entries |
equals() hashCode() |
Hash 表和双向链表 |
Hashtable |
Map |
Unique keys |
No order |
equals() hashCode() |
Hash 表 |
TreeMap |
SortedMap |
Unique keys |
Sorted in key order |
equals() compareTo() |
平衡树(Balanced tree) |
撰写一个Person class,表示一个人员的信息。令该类具备多辆Car的信息,表示一个人可以拥有的车子的数据,以及:
Certificate code: 身份证对象
name: 姓名
cash: 现金
List car; 拥有的汽车,其中存放的是Car对象
boolean buycar(car); 买车子
boolean sellcar(Person p);//把自己全部的车子卖给别人
boolean buyCar(Car car,Person p);//自动查找卖车的人p是否有买主想要买的车car,如果有就买,并返回true ,否则返回false
viod addCar(car);//把某辆车送给方法的调用者。
String toString();//得到人的信息
并撰写第二个Car class 具备的属性:
String ID; //ID车牌号
cost //价格
color //颜色
Person owner; //车子的拥有者
toString();//得到汽车的信息
equals();//比较车子是否同一俩汽车,ID相同则认为相同
在另外一个Market类里面,进行车子的买卖。并保留所有交易人员的的信息到一个HashMap中,我们可以通过身份证号来查找到对应的人员的信息。同时所有的车子种类都在市场中进行注册,即车子的信息使用一个Set来保存
属性:
HashMap people;//存放交易人员的信息。Key为身份证号,value为Person对象
方法:
static boolean sellCar(Person p1 ,Car car1, Person p2);
//p1 将car1卖给 p2 。并在该方法中记录效益人的信息到people 中。
撰写类Certificate 表示身份证:
属性:
Id;//号码
方法:
equals();//比较两个身份证是否同一个,ID相同则认为相同
hashCode();//正确编写hashCode 方法
场景:
一个叫Bob的人:身份证:310 现金:30000。
有一辆车子:ID:001,红色,价格:50000的车子;
一个叫Tom的人:身份证:210 现金:70000,
有一辆车子: 颜色:白色,ID:003, 价格:25000。
一个叫King 的人:身份证:245 现金:60000,
有2辆车子: 颜色:白色,ID:005, 价格:18000。
颜色:红色,ID:045, 价格:58000。
Tom 买了Bob的车子.他就拥有了2辆汽车
King 把ID=005的车子买给了Bob
最后各人的信息如何?
为了用“集合框架”的额外部分把排序支持添加到 Java 2 SDK,版本 1.2,核心 Java 库作了许多更改。像 String 和 Integer 类如今实现 Comparable 接口以提供自然排序顺序。对于那些没有自然顺序的类、或者当您想要一个不同于自然顺序的顺序时,您可以实现 Comparator 接口来定义您自己的。
为了利用排序功能,“集合框架”提供了两种使用该功能的接口:SortedSet 和 SortedMap。
Comparable 接口
在 java.lang 包中,Comparable 接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许您把集合排序成自然顺序。
compareTo() 方法比较当前实例和作为参数传入的元素。如果排序过程中当前实例出现在参数前,就返回某个负值。如果当前实例出现在参数后,则返回正值。否则,返回零。这里不要求零返回值表示元素相等。零返回值只是表示两个对象排在同一个位置。
在 Java 2 SDK,版本 1.2 中有十四个类实现 Comparable 接口。下表展示了它们的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。
类 |
排序 |
BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short |
按数字大小排序 |
Character |
按 Unicode 值的数字大小排序 |
CollationKey |
按语言环境敏感的字符串排序 |
Date |
按年代排序 |
File |
按系统特定的路径名的全限定字符的 Unicode 值排序 |
ObjectStreamField |
按名字中字符的 Unicode 值排序 |
String |
按字符串中字符 Unicode 值排序 |
创建您自己的类 Comparable 只是个实现 compareTo() 方法的问题。通常就是依赖几个数据成员的自然排序。您自己的类也应该覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个散列码。
Comparator 接口
若一个类不能用于实现 java.lang.Comparable,您可以提供自己的 java.util.Comparator 行为。如果您不喜欢缺省的 Comparable 行为,您照样可以提供自己的 Comparator。
Comparator 的 compare() 方法的返回值和 Comparable 的 compareTo() 方法的返回值相似。在此情况下,如果排序时第一个元素出现在第二个元素之前,则返回一个负值。如果第一个元素出现在后,那么返回一个正值。否则,返回零。与 Comparable 相似,零返回值不表示元素相等。一个零返回值只是表示两个对象排在同一位置。由 Comparator 用户决定如何处理。如果两个不相等的元素比较的结果为零,您首先应该确信那就是您要的结果,然后记录行为。
为了演示,您会发现编写一个新的忽略大小写的 Comparator,代替使用 Collator 进行语言环境特定、忽略大小写的比较会更容易。这样的一种实现如下所示:
class CaseInsensitiveComparator implements Comparator {
public int compare(Object element1, Object element2) {
String lowerE1 = ((String)element1).toLowerCase();
String lowerE2 = ((String)element2).toLowerCase();
return lowerE1.compareTo(lowerE2);
}
}
因为每个类在某些地方都建立了 Object 子类,所以这不是您实现 equals() 方法的必要条件。实际上大多数情况下您不会去这样做。切记该 equals() 方法检查的是 Comparator 实现的等同性,不是处于比较状态下的对象。
Collections 类有个预定义的 Comparator 用于重用。调用 Collections.reverseOrder() 返回一个 Comparator,它对逆序实现 Comparable 接口的对象进行排序。
需要PDF文档可以去这里下载:http://download.csdn.net/detail/my_session/4555903