Java中集合分为Collection和Map:
1.Collection常用的一些接口和类:
Collection派生出三个子接口List,Set,Queue;
List:存放有序可重复元素
Queue:队列(api的介绍为在处理元素前用于保存元素的collection)
Set:存放无序不可重复元素
实现List接口的集合主要有Vector,ArrayList,LinkedList,Stack;
ArrayList:
动态数组,允许任何符合规则(指定的泛型)的元素插入(包括null),ArrayList有很多构造方法,若是不指定ArrayList的容量,则在第一次添加数据时会进行调整,如果调用的是add方法时,会将容量扩充至10;当存放的元素达到10个时,不会扩容,当存放第十一个元素时,容量会扩容至之前容量的1.5倍,下面是ArrayList源码中扩容代码:
vector:
与ArrayList相似,它的操作与ArrayList几乎一样,但是vector是线程安全的动态数组,ArrayList则不是;所以在单线程任务中使用Arraylist提高效率,在多线程任务中使用Vector,不用额外的线程安全考虑;
Stack:
stack继承vector,实现一个后进先出的堆栈,stack提供5个额外的方法,使得vector可以被当作堆栈使用;push(压入)pop(弹出)peek(得到栈顶元素)empty(判空)search(检测一个元素在堆栈中的位置)
LinkedList:
可以根据索引访问集合元素,此外因为LinkedList实现了List接口也实现了Deque接口,还可以当作双端队列来使用
ArrayList和LinkedList的区别:ArrayList内部以数组形式保存集合的元素,LinkedList内部以链表的形式存放集合的元素,因此,ArrayList便于随机访问,LinkedList便于插入删除
Queue派生接口Deque,类PriorityQueue:
Deque:双端队列
PriorityQueue:优先队列
Deque:
一个线性 collection,支持在两端插入和移除元素。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
PriorityQueue:
一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的Compartor 进行排序,具体取决于所使用的构造方法。优先级队列不允许使用 null
元素。
set的几个常用实现类HashSet,LinkedHashSet,TreeSet,EnumSet
HashSet:
按照Hash算法存储元素,具有良好的存取和查找性能,HashSet的特点:不能保证元素的顺序,不是线程同步的,集合的元素可以为null
LinkedHashSet:
是HashSet的子类,具有HashSet的特性,但它使用链表维护元素的添加顺序,因此性能低于HashSet,便于迭代访问
TreeSet:
TreeSet是SortedSet接口的实现类,可以保证元素处于排序状态,采用红黑树的数据结构存储集合元素
EnumSet:
专为枚举类设计的集合类,不允许添加null,集合元素有序,以枚举值在枚举类中定义的顺序决定集合元素的顺序
以上这些Set的实现类都不是线程安全的
Map
Map是集合的另外一种接口,它采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,key值不允许重复,可以为空,常用实现类有HashMap,LinkedHashMap,TreeMap
HashMap:
名字带有Hash代表它也是以Hash算法进行存储的,通过K的Hash值找到相应的位置存储V值;与HashMap相似的是HashTable,它俩的关系和ArrayList与Vector的关系一样,HashMap线程不安全,HashTable线程安全
LinkedHashMap:
是HashMap的子类,使用双向链表来维护Key-Value对插入的次序,在迭代访问时有较好的性能
Properties:
是HashTable的子类,它是一个K和V都是String类型的Map,主要用于配置文件的读取
TreeMap:
是SortedMap的是实现类,与TreeSet一样使用红黑树的数据结构,每个<k,v>作为红黑树的一个节点,通过k对节点进行排序
Linked***一般保证元素插入的顺序,Tree**一般是对元素进行排序