Java集合框架的一点儿基础的理解(学习笔记)

Java集合框架的一点儿基础的理解(学习笔记)_第1张图片
上面的集合框架图比较“粗糙”,希望浏览这篇文章的朋友们不要介意哈。

集合框架的初步理解

1、 集合框架有两个最重要的根接口,分别是CollectionMap
2、 Collection接口有两个重要的子接口分支,分别是List和Set。还有一个很少用的Queue队列子接口,该接口被下面的LinkedList实现类实现。
3、 Collection接口依赖于一个迭代器接口Iterator,可以通过Iterator来遍历实现Collection接口的集合的元素,Iterator有一个子接口ListIterator,该接口用来遍历List抽象类下面的实现类。
4、 Collection接口有继承于它的抽象类AbstractCollection,Map接口也同样有继承于它的抽象类AbstractMap。List接口也有继承于它的抽象类AbstractList,Set接口也有继承于它的抽象类AbstractSet。这两个抽象类又继承于AbstractCollection,注意“继承接口”换另一种说法就是“实现该接口”。
5、 AbstractList抽象类派生出了3个实现类,分别是LinkedList(类似于数据结构的链表)、ArrayLIst(类似于数据结构的线性表,只是这种线性表的空间是可以动态分配的),Vector(功能与ArrayList差不多,已很少用到),其中Vector派生出一个Stack类(类似于数据结构的堆栈)。
6、 AbstractSet抽象类派生出2个实现类,分别是HashSet子类(其又有一个LinkedHashSet子类)和TreeSet子类。它们俩底层的实现是不相同的。HashSet的底层是由HashMap来实现的,而TreeSet的底层是由TreeMap来实现的。
7、 AbstractMap抽象类有3个实现类,分别是HashMap、TreeMap、WeakHashMap。而Map接口的实现类里面,还有一个HashTable的实现类,但它并不是继承AbstractMap的,而是继承比较老的一个抽象类Directionary。
8、 还有两个服务于该集合框架的常用的工具类,分别是Arrays和Collections。它们里面有各种与集合操作相关的静态多态方法,因此它们不能被实例化,可直接通过类名.操作名来直接调用里面的方法。
9、 另外还有两个常用的比较接口,它们分别是Comparable接口和Comparator接口。Comparable是定义在类的内部的,而Comparator是定义在类的外部的(即需要重新定义一个比较类,该比较类是继承与Comparator接口的)。比如用Collections工具类进行比较排序时,对于实现了Comparable接口的类,可以直接调用Collections.sort(该类)来进行该类的对象排序,而对于实现Comparator接口的类则需要Collections,sort(待比较排序的类,实现Comparator接口的类)来进行调用。
Comparable接口里面我们要重写它的CompareTo方法,为public abstract int comparaTo(T o)方法;而Comparator接口里面我们需要重写它的Compara方法,为 public abstract int compara(T o1, T o2),可见它们的形参是不一样的。

集合框架的进一步理解

1、 List接口
List代表的是一组有序的可以重复的集合。允许null的存在。
1)、ArrayList实现类
ArrayList代表的是一个动态数组,它代表的是一个类似于数据结构的线性表(数组),只是这个数组的容量可以动态增加(并不是一成不变)而已。构造方法无参时生成一个初始容量为10的数组,有参时可以设定一定容量大小的数组,尤其是当我们知道数组大小的时候,给它一个初值,可以避免后面进行很多次的扩容操作,可以提高效率。当然后面也可以用ensureCapacity来增加容量。当访问它里面的元素时,只需要通过下标就可以访问,时间复杂度为O(1),但是进行插入和删除操作的时候,要对它里面的一部分元素进行整体的移动,因此时间复杂度为O(n)。是非同步的。
2)、LinkedList实现类
LinkedList代表的是一个双向链表(即有两个指针,一个指向前面另一个指向后面)。也可以动态增加容量。但是在遍历访问的过程中,需要通过指针的不断移动来寻找目标对象,时间复杂度为O(n),但是在插入和删除操作中,只需要改变对应位置的前后指针就可以实现了,因此时间复杂度是O(1)。是非同步的。
3)、Vector实现类
操作与ArrayList几乎一样,底层实现也是一样的。不过它是同步的线程安全的,不过可以通过加入一行实现同步的语句就可以使ArrayList也是线程同步的了,所以Vector并不常用。
4)、Stack实现类
该类与数据接口的栈几乎是一样的,同样也有Push,Pop,Peek等操作。
2、 Set接口
Set代表的是一组无序的(它里面的元素位置是通过元素的hashCode()方法来决定的,是固定的)不包含重复元素的集合。它也允许null的存在,但只允许一个存在。它是如何来判断元素是否重复呢?它是通过调用equals方法以及hashCode方法来进行判别的。一般来说,有一个判断出是true的话,另一个应该也是true。
1)、HashSet实现类
底层基于HashMap来实现,元素存放在HashMap的key中,value统一用来存放一个Object对象。元素的位置由hashCode方法来分配。是非同步的。
2)、LinkedHashSet实现类
底层也是基于HashMap来实现的,只是还多使用了链表来维护元素插入时的顺序,因此它里面的元素是有序的。是非同步的。
3)、TreeSet实现类
底层是基于TreeMap来实现的,是有序的。支持自然排序(也是默认排序)和自定义排序。值得注意的是,它不是通过equals和hashCode来比较元素之间是否有重复,而是通过Compara或者ComparaTo来比较的。是非同步的。
3、 Map接口
Map是由一组键值对组成的集合,一个key(键)对应一个值(value),不允许存在相同的key,允许存在相同的value,属于数学上的一种单映射关系。
1)、HashMap实现类
HashMap是一种链表散列的数据结构,即链表和数组的结合体。HashMap底层是一个数组,而数组的每一项又是一条链表。可以通过散列地址法来解决冲突,h&(lenth-1) <==> h%lenth。它的底层数组长度总是2的n次方,这样可以使得元素的位置分配更均匀,碰撞的几率会更小,优化性能。是非同步的。
2)、LinkedHashMap实现类
继承于HashMap,它能够保留元素的插入顺序。性能略低于HashMap。是非同步的。
3)、TreeMap实现类
底层是基于红黑树来实现的。可以对key进行两种类型的排序,分别是自然排序和自定义排序。这里和TreeSet是类似的。自然排序要求我们实现Comparable接口,对同一个类的对象进行排序。而自定义排序要求我们实现Compatator接口。通过ComparaTo来是比较两个key是否相等,相等返回0。
4)、HashTable实现类
是同步的。继承于Dictionary抽象类,该抽象类又继承Enumeration枚举接口。因为实现了Map接口,而Map接口依赖于Iterator接口,所以HashTable支持以上两种遍历方式,而HashMap只支持Iterator遍历方式。

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