欢迎讨论、交流,转载请注明出处,3Q! 

       前言

              Java提供了数据持有对象的方式,以及对象集合的操作。集合在Java中是非常重要的,Java

           集合框架API是用来表示和操作集合的统一框架,它包含接口实现类以及一些编程辅助算法

           具体位于java.util包下。

      Java集合框架结构图

              先来看看整体的其框架的UML类图

            Thinking in Java之集合框架浅析_第1张图片  

                  根据上面的UML例图,可以看出的是Java集合框架大体上可以简要分为四部分:

         1、Collection接口及其实现类

                                  Collection
                                   ├List
                                   │├LinkedList
                                   │├ArrayList
                                   │└Vector
                                   │ └Stack
                                   └Set

                                    ..............

                         其简要的UML类图如下:

                      Thinking in Java之集合框架浅析_第2张图片

                 Collection接口

                        Collection接口是最基本的容器接口,继承至Iterable接口(主要通过其进行产生迭代器

                 逐一的进行元素访问)。其中的元素允许重复,可以无序。JDK没有提供直接实现Collection

                 接口的实现类。

                       所有实现Colection的类原则上都应该提供两个标准的构造函数:

                 无参构造函数用于创建一个空的容器,有参构造函数用于创建一个新的Collection,且这

                个新的Collection和传入的collection具有相同的元素。

                 对于其具体的方法,可直接查阅源码。

               List接口

                       作为Collection的子接口,List限定容器中元素是有序的,也就是能够控制每个元素的插入

                位置,用户可以使用index来直接方法元素(类似于数组下表访问方式)。List中的元素是允许

                重复的。

                       除了具有Collection接口必须的iterator方法之外,List还提供了一个listiterator()方法,和

                标准的相较而言多了一些add()之类的方法,允许添加,删除、设定元素,重要的是能够实现

                向前向后遍历。

                       其常用的实现类有LinkedList,ArrayList,vector和stack。至于其具体的用法和他们的特点

                之后再进行总结。

              Set接口

                       Set是一种不包含重复元素的Collection,Set最多只有一个null元素。能够想到的是 Set的构

              造函数一定有一个约束条件,限制传入的Collection不能包含重复的元素。

                       到底是如何进行限定的呢?我们先看其HashSet的构造器吧。

               

                      理所当然的我们应该进入addAll()方法。进入其方法内部,由于HashSet是继承

                AbstractCollection(提供Collection的骨干实现)。addAll方法由AbstractCollection实现

                   Thinking in Java之集合框架浅析_第3张图片

                     阅读源码可以知道,要想找到关键所在,就要进入add方法了,不过这里我们查看在

                AbstractCollection类中查看add方法是他是空的。貌似断了......想想其实不然:时刻需要留意的

                是java中的多态性,我们看看子类中的实现吧:

                

                     得!我们又的进入HashMap类中去查看put方法的实现。(HashSet基于HashMap实现)

              Thinking in Java之集合框架浅析_第4张图片     

                     好吧,关键点就是在这里了。至于到底是如何过滤掉重复元素的就先不说明了,其实笔者

              也只有一些模糊的概念,后续会进行一些整理。

           2、Map接口及其实现类   

                       Thinking in Java之集合框架浅析_第5张图片

                 Map接口

                       Map提供了一个更加通用的元素存储方法。用于存储元素"键值对",其中的键(key)是唯一的

               每个key都映射到一个值。关于Map的详细实现以及特点将在后续总结。    

                        Tips:误区:不要将Collection认为是Java集合中的顶级接口,Map和Collection在层次结构

                上没有必然的关系

                AbstractMap类

                      提供Map接口的骨干实现

                HashMap类

                       基于哈希表的Map接口实现,利用哈希算法根据hashCode()来配置存储地址,具体的实现原

               理将会在后续讨论之。

              SortedMap接口

                     进一步提供关于键的 总体排序Map。该映射是根据其键的 自然顺序进行排序的,或者根据通常

               在创建有序映射时提供的 Comparator 进行排序。       

              TreeMap类

                    基于红黑树(Red-Black tree)的NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者

              根据创建映射时提供的Comparator 进行排序,具体取决于使用的构造方法。

            3、Iterator接口及实现类     

                    迭代器设计模式,通过它我们可以遍历并选择集合中的对象,对于其集合的底层结构实现并不关心。

                  对于其详细内容和具体用法,后续整理。

            4、辅助工具类

                     这笔者想当然的分类的吧,不过也不打紧,便于思考理解就行。

                 Collections、Arrays类

                       Collections、Arrays是集合类的一个工具类/帮助其中提供了一系列静态方法,用于对集合中

                  元素进行排序、搜索以及线程安全等各种操作。

              Comparable、Comparator接口

                      一般是用于对象的比较来实现排序,两者略有区别

                   Comparable用作默认的比较方式,实现了该接口的类之间可以相互进行比较,这个对象组成的集合

              就可以直接通过sort()进行排序了。

                     Comparator是设计模式中策略模式的一种应用。将算法的实现和数据进行了分离。

              一般用在如下情况下:

                   1、类设计者没有考虑到比较问题而没有实现Comparable接口。这是我们就可以通过使用

                          Comparator,这种情况下,我们是不需要改变对象的。

                    2、一个集合中,我们可能需要有多重的排序标准,这时候如果使用Comparable就有些捉襟见肘了

                          可以自己继承Comparator提供多种标准的比较器进行排序。

               至于两者的具体使用语法,读者可查阅API或者Google!Over~

                 相关阅读:

                          Thinking in Java之深入Collection源码学习
                          Thinking in Java之List、ArrayList源码学习

                         Thinking in Java之ArrayList、Vector比较

                          Thinking in Java之Set、HashSet源码学习