集合类存放于java.util包中
首先需要说的是Collection
Collection是集合的基本接口,List、Set、Queue就继承于Collection接口(map没有)。
java的集合主要有三种:Set,List和Map
Set(集)
Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
List(列表)
List : 次序是List最重要的特点:它保证维护元素特定的顺序,即list中元素是有序的。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用,因为其是链表的存储结构)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。Java List一共三个实现类:分别是ArrayList、Vector和LinkedList。
ArrayList : 由数组实现的List(顺序存储,即在存储空间内开辟一块连续的空间用于存储,值得一提的是如果存储空间满了则会自动增加50%+1的空间)。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢(由于顺序存储的缘故,如果假设有10个元素,需要删掉其中的第2个,则3,4,5...一直到第10个元素的位置都需要往前移动,插入同理)。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
LinkedList : 链表存储结构,向List中间插入与删除的开销并不大(因为本身的存储空间并不连续,元素和下一个元素之间都是通过指针来连接)。随机访问则相对较慢(因为访问时需要移动指针,而ArrayList则直接访问某一固定位置即可),还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
Vector : 也是由数组实现的List,大体上与ArrayList无异,Vector的主要优点即线程安全,一个Vector中同一时间只能有一个线程对它进行写操作,但是由于线程的同步需要消耗一定资源,所以速度上自然比不上ArrayList
Map(映射)
Map与Collection在集合框架中属并列存在(即前文提到的继承Collection的不包括Map)
Map存储的是键值对,而之前的List和Set存储的只是值,当然,也可以说他们在集合中的序号看做他们的键,不过本质上是不同的。Map存储元素使用put方法,Collection使用add方法,Map集合取出元素时先转成Set集合,再通过迭代获取元素,于Collection也有不同。另外由于Map集合中使用键值对进行储存,所以键必须是唯一的,即任意两个键不能相同,但是值可以是相同的,即任意两个不同键对应的值可以相同。Map
这里要先提一下Hash表的概念了:Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找
Hashtable : 底层是哈希表数据结构,线程是同步的(即线程安全),不可以存入null键,null值。效率较低,被HashMap 替代。
HashMap : 底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,和equals方法。
LinkedHashMap : 该子类基于哈希表又融入了链表,提高插入和删除元素的效率,当然访问时效率应该也会有所下降。
TreeMap : 底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator进行比较排序,当然也可以定义他们实现特殊的排序方法。
参考博文: