Java Collection Framwork中的类的确是最重要的基础api,实现任何算法,基本上都很难离开它。
因此理解这堆“集合(Collection)类”很有必要。声明一下,以前一直都是叫它们集合类,但是好像Think In Java的作者鄙视了这个说法,严格的说应该叫Container类,而后看了它整整一章书以后,觉得还是人家说的有道理。
它说这个container类库,包含了两大类,Collection和Map,而Collection又可以分为List和Set。当然这些抽象概念都被定义成了接口。
话说,这样的分类的确是严格按照类之间的继承关系来说得,但是俺总觉得很别扭,真动手的时候,还是很难选择。当然,Anytime and Anywhere使用ArrayList绝对都能解决问题,但这样做毕竟太农民了一点。
所以,我自己有了一些想法。先回归到最基本最基本的数据结构的层面,管你是Collection还是Container,反正描述的都是一堆东西吧。数据结构第一章讲了一个结构:在物理上连续分配空间的顺序结构,叫顺序表(希望记性是好的),而离散分配空间的,应该叫做链表,最常用的就是单链表。这两个东西,其实就是很多复杂数据结构的基础,还记得吗,当时就是讲完这些东西,才开始讲栈、队列、二叉树、有向无向图的。所以,这个顺序结构是很基础的。而在JAVA中,顺序表对应的就是List接口,而一般顺序表就是ArrayList(有效进行随机index查找);而单链表就是LinkedList(有效进行插入和删除),两个的优劣当年都讲烂了,这里就不说了。
有了这两个结构以后,JAVA就不提供Stack和Queue单独的类了,因为,用户可以用上面两个类轻易的去实现。
那Set和Map有怎么跟List连上关系呢?
我认为可以把它们看成是无序和单一的List(Map只是两个有映射关系的List罢了)。
Set和Map无序和单一的特性,决定了它们天大的需求就是根据关键字(元素对象)检索。so,为了效率,必须hash。
有了HashSet和HashMap。
同时,如果非要保持住元素的顺序,有了LinkedHashSet、LinkedHashMap。
结论:
假如你的需求是
1:往Container中放的对象是无序且单一的;
2:经常要检索。
用HashSet或HashMap吧。
ps:这两个条件其实是一回事,因为如果是不单一的话,你去检索它干嘛。
如果进而需要保持元素的顺序,不要让他顺便iteration,那就选择LinkedHashSet和LinkedHashMap。
假如你的需求不满足以上1&2,那你放心,List肯定能帮你解决,你只要稍微想一下是ArrayList好还是LinkedList好。
题外话:
关于Hash,务必记得要让自己的元素对象override hashCode()和 equles() 方法,要不你直接可以洗了睡。
关于所有这些Container,务必记得有个辅助类叫Interator,遍历尽量要用它。
关于一些老的Stack、Vector、HashTable,听说以后不要用了哦。收到啦!!