Java集合类 框架
从上图中可以看出,集合类主要分为两大类:Collection和Map。
List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。
Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证,hashcode相同再对比equals)。常用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。
TreeMap java内部红黑树的实现,红黑树具有二叉树所有特性,并且还是一颗平衡二叉排序树。一个二叉排序树可以大大提高检索效率,红黑树就是一种维护二叉树平衡的算法。诸如此类的算法还有AVL、SBT、伸展树、TREAP5等。关于平衡二叉树,在这儿不赘述了。红黑树,会在后续开一篇单独讲述。
我们看到,抽象类AbstractCollection、AbstractList和AbstractSet分别实现了Collection、List和Set接口,这就是在Java集合框架中用的很多的适配器设计模式,用这些抽象类去实现接口,在抽象类中实现接口中的若干或全部方法,这样下面的一些类只需直接继承该抽象类,并实现自己需要的方法即可,而不用实现接口中的全部抽象方法。
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。适配器模式中的三个角色:Target(目标接口,也就是客户想要的接口也可以是个类),Adaptee(需要适配的类),Adapter(适配器)通过包装一个需要适配的对象转换成目标接口。具体在研究集合源码中分析。
Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。
Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。