一、实现类
Java提供了一套实现Collection接口的标准集合类(实现类),其中包含具体类(可直接拿来使用)和抽象类(提供了接口的部分实现)。
其中抽象类描述如下(图中蓝底部分):
-
AbstractCollection:实现了大部分的集合接口。
-
AbstractList:继承于AbstractCollection并且实现了大部分List接口。
-
AbstractSequentialList:继承于AbstractList,提供了对数据元素的链式访问而不是随机访问。
-
AbstractSet:继承于AbstractCollection并且实现了大部分Set接口。
-
AbstractMap:实现了大部分的Map接口。
具体实现类描述如下:
-
LinkedList:继承了AbstractSequentialList,实现了List接。允许有Null(空)元素,主要用于创建链表数据结构。此类没有同步方法,如果多个线程同时访问一个List,必须自己实现同步访问,解决办法就是在创建List的时候构造一个同步的List。例如:
List list = Collections.synchronizedList(newLinkedList(...));
LinkedList与ArrayList相比,增加和删除的操作效率更高,查找和修改的操作效率较低。
-
ArrayList:继承了AbstractList,并实现了List接口。此类是一个可以动态修改的数组,没有固定的大小,提供了添加、删除、修改、遍历等功能。该类也是非同步的,在多线程的情况下不要使用。ArrayList增长当前长度的50%,插入删除效率低。
-
HashSet:基于HashMap实现,实现了Set接口。不允许出现重复元素,不保证集合中元素的顺序(无序即不会记录插入的顺序),允许包含值为Null的元素,但最多只能一个。该类不是线程安全的,如果多个线程尝试同时修改HashSet,则最终结果是不确定的。必须在多线程访问时显示同步对HashSet的并发访问。
-
LinkedHashSet:具有可预知迭代顺序的Set接口的哈希表和链接列表实现。
-
TreeSet:实现了Set接口,可以实现排序等功能。
-
HashMap:继承于AbstractMap,实现了Map接口。该类是一个散列表,它存储的内容是键值对(key-value)映射,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。它是无序的,即不会记录插入的顺序。
-
TreeMap:继承于AbstractMap,并且使用一棵树,
-
WeakHashMap:继承于HashMap,使用元素的自然顺序对元素进行排序(如果元素是数字型,则从小到大排序;如果是字符型,则以ASCII码来排序)。
-
IdentityHashMap:继承于AbstractMap,比较文档时使用引用相等。
-
Vector:此类与ArrayList相似,但是此类是同步的,可以用在多线程的情况,此类允许设置默认的增长长度,默认扩容方式为原来的2倍。
-
Stack:栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
-
HashTable:是Dictionary(字典)的子类。
二、算法
集合框架定义了几种算法,可用于集合和映射。这些算法被定义为集合类的静态方法。集合定义三个静态的变量:EMPTY_SET,EMPTY_LIST,EMPTY_MAP,这些变量都不可改变。
异常类型:
- 在尝试比较不兼容的类型时,一些方法能够抛出ClassCastException异常。
- 当试图修改一个不可修改的集合时,抛出UnsupportedOperationException异常。
三、迭代器
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList和HashSet等集合。
迭代器it的基本操作时是next、hashNext和remove。
- 调用it.next()会返回迭代器的下一个元素,并且更新迭代器的状态。
- 调用it.hashNext()用于检测集合中是否还有元素。
- 调用it.remove()将迭代器返回的元素删除。
使用迭代器:
import java.util.ArrayList;
import java.util.Iterator;
public class Test{
public static void main(String[] args){
//创建集合
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(11);
numbers.add(22);
numbers.add(33);
numbers.add(44);
numbers.add(55);
//获取迭代器
Iterator<Integer> it = numbers.iterator();
Iterator<Integer> it2 = numbers.iterator();
//输出集合中的所有元素
while(it.hashNext()){
System.out.println(it.next());
}
//删除集合中大于30的元素
while(it2.hashNext()){
Integer i = it2.next();
if(i > 30) {
it2.remove();
}
}
//创建Map
Map<String,String> map = new HashMap<String,String>();
map.put("1","value1");
map.put("2","value2");
map.put("3","value3");
//获取迭代器
Iterator<Map.Entry<String,String>> itm = map.entrySet().iterator();
while (itm.hasNext()) {
Map.Entry<String, String> entry = itm.next();
System.out.println("key= " + entry.getKey() + " and value= " +entry.getValue());
}
}
}