集合类型主要有3种:set(集)、list(列表)和map(映射)。
Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和List。
Collection是集合接口
|————Set子接口:无序,不允许重复。
|————List子接口:有序,可以有重复元素。
1.Set
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
set的实现基础是map。
HashSet:虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是 在HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。
例: HashSet的add(Object obj)方法的实现
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
常用方法:
boolean add(E o) //如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。
boolean addAll(Collection<? extends E> c) //如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。
void clear() //移除 set 中的所有元素(可选操作)。
boolean contains(Object o) //如果 set 包含指定的元素,则返回 true。
boolean containsAll(Collection<?> c) //如果此 set 包含指定 collection 的所有元素,则返回 true。
boolean equals(Object o) //比较指定对象与此 set 的相等性。
int hashCode() //返回 set 的哈希码值。
boolean isEmpty() //如果 set 不包含元素,则返回 true。
Iterator<E> iterator() //返回在此 set 中的元素上进行迭代的迭代器。
boolean remove(Object o) //如果 set 中存在指定的元素,则将其移除(可选操作)。
boolean removeAll(Collection<?> c) //移除 set 中那些包含在指定 collection 中的元素(可选操作)。
boolean retainAll(Collection<?> c) //仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。
int size() //返回 set 中的元素数(其容量)。
Object[] toArray() //返回一个包含 set 中所有元素的数组。
<T> T[] toArray(T[] a) //返回一个包含 set 中所有元素的数组;返回数组的运行时类型指定数组的类型
1.1.HashSet
使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的.
1.2.TreeSet
在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用 了一个TreeMap。TreeSet对Set中的元素进行自然排序存放,升序。
2.List
List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
常用方法:
boolean add(E o) //向列表的尾部追加指定的元素(可选操作)。
void add(int index, E element) //在列表的指定位置插入指定元素(可选操作)。
boolean addAll(Collection<? extends E> c) //追加指定collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。
boolean addAll(int index, Collection<? extends E> c) //将指定collection 中的所有元素都插入到列表中的指定置(可选操作)。
void clear() //从列表中移除所有元素(可选操作)
boolean contains(Object o) //如果列表包含指定的元素,则返回 true
boolean containsAll(Collection<?> c) //如果列表包含指定collection的所有元素,则返回 true
boolean equals(Object o) //比较指定的对象与列表是否相等。E get(int index) //返回列表中指定位置的元素
int hashCode() //返回列表的哈希码值。int indexOf(Object o) //返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回-1。
boolean isEmpty() //如果列表不包含元素,则返回 true。
Iterator<E> iterator() //返回以正确顺序在列表的元素上进行迭代的迭代器。int
lastIndexOf(Object o) //返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回-1
ListIterator<E> listIterator() //返回列表中元素的列表迭代器(以正确的顺序)
ListIterator<E> listIterator(int index)//返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始
E remove(int index) //移除列表中指定位置的元素(可选操作)
boolean remove(Object o) //移除列表中出现的首个指定元素(可选操作)。boolean
removeAll(Collection<?> c) //从列表中移除指定collection 中包含的所有元素(可选操作)
boolean retainAll(Collection<?> c) //仅在列表中保留指定collection 中所包含的元素(可选操作)。
E set(int index, E element) //用指定元素替换列表中指定位置的元素(可选操作)。int size() //返回列表中的元素数。
List<E> subList(int fromIndex,int toIndex) //返回列表中指定的fromIndex(包括 )和toIndex(不包括)之间的部分视图。
Object[]toArray() //返回以正确顺序包含列表中的所有元素的数组。
<T> T[] toArray(T[] a) //返回以正确顺序包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
2.1.ArrayList(非线程安全,适合查找)
实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步。
2.2.LinkedList(非线程安全,插入删除元素较快)
实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。
3.Map
Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。
常用方法:
V put(K key, V value) //(可以相同的key值,但是添加的value值会覆盖前面的,返回值是前一个,如果没有就返回null)
putAll(Map<? extends K,? extends V> m) //从指定映射中将所有映射关
remove() //删除关联对象,指定key对象
clear() //清空集合对象
value get(key); //可以用于判断键是否存在的情况。当指定的键不存在的时候,返回的是null。
boolean isEmpty() //长度为0返回true否则false
boolean containsKey(Object key) //判断集合中是否包含指定的key
boolean containsValue(Object value) //判断集合中是否包含指定的value
int size() //长度
3.1.HashMap(非线程安全)
HashMap是最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null。
3.2.Hashtable(线程安全,慢)
Hashtable与HashMap类似,是HashMap的线程安全版,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。
3.3.TreeMap(非线程安全,顺序)
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的。
4.Vector
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
5.Stack
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
6.Iterator
所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。
例:不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it =collection.iterator(); // 获得一个迭代子
while(it.hasNext()){
Object obj =it.next(); // 得到下一个元素
}