一、集合框架图:
从上图我们可以看到,JAVA的集合架构主要分为两条线:Collections和Map。
1.Collections是一个接口,是一个抽象的集合,它包含了集合中的一些属性和相关操作,其中包含了List、Set Queue三个接口:
List接口:是一个有序的Collections,与数组类似,可通过索引来访问List中的元素,第一个索引值为0且允许有相同的元素。List用于存储一组不唯一且有序的对象。
实现List接口的主要有ArrayList、LinkedList、Vector、Stack。
ArrayList:
ArrayList是一个动态数组,是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。随着元素个数的增加,容量也会随着增加。但是ArrayList是不同步的,在多线程中无法使用。
LinkedList:
LinkedList是一个双向链表,有就具有了链表的特点,如每次查找某个数据都要从表头开始遍历,效率较低,但是在插入、删除、添加等操作时会节省下一些时间。LinkedList也是不同步的。
Vector:
Vector与ArrayList基本相同,但是Vector是同步的,因此可用于多线程的操作中。
Stack:
Stack是一个堆栈,可利用基本方法push和pop来进行入栈和出栈的操作。
2.Set接口:是一个无序的Collections,但是不保存相同的元素,所有传入set中的元素必须不同。Set用于存储一组唯一且无序的对象。
实现set接口的主要有HashSet、LinkedHashSet、TreeSet
HashSet:
HashSet由HashMap实现的,无序,只能存入一个null,是非同步的。
LinkedHashSet:
LinkedHashSet继承与HashSet,虽然也是根据hashcode来确定数据的存储位置,但是是通过使用链表来实现的,因此是有序的。LinkedHashSet是非同步的。
TreeSet:
TreeSet是一个有序集合,其底层是基于TreeMap实现的,非线程安全。
Queue接口:JDK1.5新增加的一个接口,与上述两者的区别为Queue主要用于存储数据而不是处理数据。
3.Set和List的区别:
由于Set存储的是无序的对象,因此无法通过索引来进行数据的查找,而是通过遍历所有的数据来查找。这样就会造成查找的效率较低,但是增加、删除、插入的效率较高并且不会改变之前数据的位置。
而List存储的是有序的对象,因此可以通过索引来进行数据的查找,这样查找的效率较高,但是进行增加、删除、插入时的效率较低并且会改变之前数据所在的位置。
4.Map也是一个接口,如我们熟知的Hashmap,是一个key-value相对应的。Map中的每一个数据都包含了一个key和这个Key所对应的value值。从框架图上可以看到一个AbstractMap,这是一个抽象类,用来实现了Map接口中的API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。Hashtable继承了Dictionary,而且实现了Map接口。
实现HashMap接口的主要有:HashMap、LinkedHashMap、TreeMap
HashMap:
利用哈希表实现,通过哈希函数来存储数据以及查询数据,查询速度较快,每一个元素都会通过一个哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果该位置已经存在数据,则使用链表将所有相同哈希地址的元素串起来。
LinkedHashMap:
保留插入的顺序,如果需要输入和输出的顺序是一致的,那么这个将会是首选。
允许使用null,非同步。
TreeMap:
TreeMap是一个有序的key-value集合,非同步,基于红黑树实现。
【关于迭代器 Java Iterator】
在需要进行遍历某一个集合时,我们通常想到的是利用for循环,这样当然也可以用于集合框架中,但是这里要介绍一种使用迭代器的方法来进行遍历,使得我们通过循环来得到或者删除某个元素:
代码如下:
结果为: