初始Java集合框架
1.集合的定义:可以把多个对象的引用放进一个类似于“容器”里。
2.集合的分类:
- Collection:主要由List(有序可重复)、Set(无序不可重复)、Queue(队列实现)接口组成。
- Map:代表具有映射关系的键值对集合。
- java.util.Collection下的关系图:
- java.util.Map下的关系图:
3.将集合框架又可以分为以下几个部分:
(1)数据结构:List、Queue、Deque(双端队列)、Set、Map
(2)比较器:Comparator(比较器)、Compareable(排序接口)
(3)算法:Collections(常用算法类)、Arrays(静态数组排序、查找算法)
(4)迭代器:Iterator(通用迭代器)、ListIterator(针对List特化的迭代器)
有序列表:List
List的主要实现类有:ArrayList、LinkedList、Vector、Stack
- ArrayList:
(1)动态数组结构、可以随机存取、尾部插入删除较方便、内部操作时效率很低(要挨个一定数组元素)。
(2)当数组容量不足时自动扩容,效率较低。 - LinkedList:
(1)双向的链表结构,在任意位置插入删除都方便,但不支持随机取值(每次只能从一端开始遍历,直到找到要查询的对象)。
(2)相比ArrayList来说不需要进行内存拷贝,效率较高,但因为有额外的前驱和后继节点,占用内存大一些。 - Vector:
(1)也是动态数组结构,相比ArrayList来说,它允许同步访问,是线程安全的,但是效率低下。
(2)为啥线程安全:因为它里边的方法加了synchronized修饰,效率低。
(3)如果又想用ArrayList又想线程安全呢?- 用List list =Collections.synchronizedList(new ArrayList());创建对象。
- 也可以复制容器 java.util.concurrent.CopyOnWriteArrayList进行操作,例如:final CopyOnWriteArrayList cowList = new CopyOnWriteArrayList(Object);
- Stack:
(1)Stack是Vector的一个子类,采用先进后出的策略。
(2)现在用的很少,大多被ArrayDeque(双端队列)替代使用。
Set
Set的特点:元素不重复、存取无序、无下标,他的主要实现类有:HashSet、LinkedHashSet、TreeSet。
- HashSet: 底层基于hashMap的K实现,特性同HashMap
- LinkedHashSet:底层基于LinkedHashMap的K实现,特性同LinkedHashMap
- TreeSet:底层基于TreeMap的K实现,特性同Treemap
Queue
Queue的主要实现类有:ArrayQueue、LinkedList、PriorityQueue
- ArrayDueue:基于数组实现的双端队列,可以先进先出,也可以先进后出。想插入元素的时候它是头插,那需要它的push方法;如果需要尾插,需要他的offer方法。
- LinkedList:是List接口的实现类,也是Deque的实现类,底层是一种双向链表的数据结构。
- PriorityQueue:基于队列的一个实现类,他的元素排列并不是按照元素添加的顺序进行排列,而是内部会按照元素的大小进行排列,是一种能够自动排列的队列。
Map
Map是一个双列集合,其中保存的是键值对,键要求保持唯一性,值可以重复。它的主要实现类有:HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties。
- HashMap: 继承自AbstractMap,Key不可重复,因为使用的是哈希表存储的元素,所以输入的数据和输出的数据的顺序基本不一致,HashMap最多只允许一条记录的Key为null。