Java集合体系总结—Map、Set、List、Queue

首先上来一张自己画的图,主要根据《疯狂Java讲义》一书中的两个图整合而来。主要讲解重要的集合及其特点。

Java集合体系总结—Map、Set、List、Queue_第1张图片
0x01 Collection 接口
Collection接口比较宽泛,该集合就是单一对象的集合(对比Map容器,是key-value这样的一对元素构成的键值对的集合)。一般作为工具使用,比如在“向上转型”中,定义一个Collection对象接受任何实现类, 该接口提供了很多有用的API,比如排序、查找和替换、同步控制等。子类有Set、List、Queue。
0x02 Map 接口
Map顾名思义,映射。主要存储一组组具有映射关系的数据,映射关系主要用key:value的键值对形式表示,一组键值对构成了Map的内部类Entity,所以可以把Map当做由Entity构成的集合。在Map接口的实现类中,例如TreeMap是通过红黑树实现,而红黑树在构建过程中比大小的时候,是根据Entity的key来比较的。所以Map内部也可以人为划分为KeySet和ValuesCollections(所谓人为划分,是因为实际存储是绑定在一起的,并不是分开的,分开是逻辑层面的)
HashMap 将Entity通过计算Entity.key的HashCode来存储在散列表中,通过数组实现,如果冲突,则通过挂链表来解决。
Hashtable 是比较古老的,甚至命名也没有遵守Java的驼峰命名法。古老的好像都是线程安全的。(Vector也是)。子类Properties类可以实现很方便的读写Hashtable,写在电脑里的文件常称之为配置文件,例如Windows系统中的*.ini
LinkedHashMap 与HashMap功能接近,通过链表实现。
0x03 Set 接口
之所以将Set接口放在Map接口后面讲,是因为Java在设计集合系统时,就是这样的一个顺序,也就是先设计了Map,有了HashMap、LinkedHashMap、TreeMap等,然后将所有的Value设置为NULL,于是相应的Set就诞生了:HashSet、LinkedHashSet、TreeSet等。之前一直被Java集合章节中繁杂的集合搞混淆,学了忘,忘了学。现在终于知道原因了。Map和Set有太多太多相似的地方,原来是因为底层实现根本就是一样的!Set是只有Key值,value值为NULL的一个特殊的Map。
0x04 List 接口
List说白了,就是表。这个表可以是数组实现的ArrayList,也可以是链表实现的LinkedList。比较古老的实现是Vector,现在不推荐使用,包括它的子类Stack,尽管它是线程安全的。
之所以将LinkedList标红,是因为LinkedList不但继承了List接口,而且继承了Deque(double-ended queue),所以既拥有List的特征(快速查询、迭代等),又有双端队列的特征(用作队列、栈等)
0x05 Queue 接口
这个接口是后来高版本的JDK添加的,可以方便的实现队列和栈及其相关的数据结构。实现类之一PriorityQueue优先队列,严格意义来说,已经破坏了队列的FIFO特性,每次插入新的数据都进行排序,但是打印的时候可能会显示的不是排好序的,这是该容器toString方法的问题,如果一个个poll出来,可以发现是排好序的。
Deque双端队列比较强大,拥有两个智能指针。学过数据结构的应该都知道,也应该都用C/C++亲自实现过,这里不多说。

总结
前面简要的宏观的介绍了几个常用的容器,Java中4大集合系统(Map、Set、List、Queue),常用的主要是前三种。我总结的比较肤浅,还有很多重要的特征,比如Map、Set、List的各个实现类之间的性能比较等,HashMap/HashSet插入自定义对象时,复写了equals方法、hashCode方法的不同情况对应不同结果,TreeMap/TreeSet插入自定义对象,复写equals方法、compareTo 方法的不同情况对应不同结果。很多书在这里着墨较多,以后有时间再补充。这里简要的总结几点:1.HashCode方法是根据key计算存储到数组的哪一个单元,删除操作时,先计算位置,再用equals方法比较,相同则删。查询也是先计算hashcode,找到位置后再通过equals方法比较,相同则true否则false
2.compareTo就是自定义一套比较规则,用来红黑树组件过程中比较大小时使用。如果出现修改,则删除修改的元素会出现异常,删除其它元素则不会。
3.一般都通过定义final的方法,避免在使用像HashMap、HashSet、TreeMap、TreeSet集合时,修改了集合中的元素,导致异常。


//*作者:守静居士
//*转载请注明出处:
http://blog.csdn.net/csp277/article
//*时间:20150611


你可能感兴趣的:(java基础)