Java集合 List、Set、Map UML类图关系

对Java中的集合类数据结构种类繁多,且他们之间的关系错综复杂, 于是对着JDK的源码,用UML图描述一下Java中各种List、Set和Map之间的关系。

对于类图的表示,下面这这个图展示了UML中、接口、继承、组合、聚合、依赖、关联之间的关系。

下面是List、Set和Map的UML类图关系

可以简单的总结一下:

ArrayList, LinkedList和Vector都是List的子类, 他们都是有序的,这个有序指的是按照写入和读出顺序一致,这个需要和排序区分开来。

ArrayList和Vector底层实现都是数组,因此随机访问速度快,删除慢。 而LinkedList是一个双向链表,插入删除都快,可以用作做FIFO队列或者Stack。

而右边Set系列,数据是无序的,因为读取顺序和写入顺序没有关系。但LinkedHashSet是有序的,因为它的底层数据结构在Hashtable的基础上增加了链表来记录写入顺序。 同时对Set而言,里面的元素不会重复,而且最多允许一个null元素。 TreeSet是红黑树的Set集,讲真,这个红黑树我没有搞清楚,只知道这个东西能排序,而且是平衡二叉树,查找速度贼快。

对于Map系列,HashMap和Hashtable最常用, Hashtable 是将数组&链表完美结合起来的数据结构, 外层数据结构是Entry数组,Entry内部有个指针(引用)指向下一个Entry,这样就形成一个链表。Hashtable中元素在数组的位置是计算出来的:计算器key的Hash值,然后与数组长度取余获得在数组位置,如果此位置已经有Entry(hash值相同),那么就直接插入在这数组位置,并让Entry的next指向之前的数组位置的Entry。 Hashtable和HashMap的最大差别是Hashtable是线程安全的。

LinkedHashMap就是在HashMap基础上加入链表记录写入顺序以便可以按顺序读出。

对于这些数据结构,除了Vector、Hashtable是线程安全的,其他的都是非线程安全,如果需要同等类型的线程安全数据结构,可以使用Collections这个Util类中的相关方法创建对应的数据结构。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章