一、集合类概览图

上图中,实线边框表示实现类,如ArrayList、LinkedList、HashMap、Vector、Stack、Hashtable、HashSet、TreeSet、WeakHashMap等,折线边框(长虚线边框)的是抽象类,如AbstractCollection、AbstractList、AbstractMap、AbstractSet、AbstractSequentialList等,而点线边框的是接口,如Collection、Iterator、List、Set、Map、ListIterator、SortedMap、SortedSet等。
从上图中可发现一个特点,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext()、next()、remove()三种方法。它的一个子接口是LinkedIterator,在Iterator的基础上接口LinkedIterator又添加了三种方法,分别是add()、previous()、hasPrevious()。如果实现的是Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会再遍历到(回不去),通常无序集合实现的都是这个接口,如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,如ArrayList。
还有一个特点就是抽象类的使用。如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添加一些方法即可实现自己需要的集合类,工作量大大降低。
二、常见集合类介绍
ArrayList
ArrayList是List接口的子类,与HashSet相反,允许存放重复元素,因此有序。集合中元素被访问的顺序取决于集合的类型。如果对ArrayList进行访问,迭代器将从索引0开始,每迭代一次,索引值加1。然而,如果访问HashSet中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元素被访问的次序。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
List<String> arrList = new ArrayList<String>();
arrList.add("a");
arrList.add("b");
arrList.add("c");
arrList.add("c");
arrList.add("d");
// 使用Iterator输出集合
Iterator<String> iter = arrList.iterator();
while (iter.hasNext()) {
System.out.print(iter.next() + " ");
}
System.out.println();
// 使用For Each输出集合
for (String e : arrList) {
System.out.print(e + " ");
}
System.out.println();
// 使用toString输出集合
System.out.println(arrList);
}
}
ListIterator是一种可以在任何位置进行高效地插入和删除操作的有序序列。具体见下例。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class LinkedListTest {
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
System.out.println(a);
List<String> b = new ArrayList<String>();
b.add("d");
b.add("e");
b.add("f");
b.add("g");
System.out.println(b);
// ListIterator在Iterator基础上添加了add(),previous()和hasPrevious()方法
ListIterator<String> aIter = a.listIterator();
// 普通的Iterator只有三个方法,hasNext(),next()和remove()
Iterator<String> bIter = b.iterator();
// b归并入a当中,间隔交叉得插入b中的元素
while (bIter.hasNext()) {
if (aIter.hasNext())
aIter.next();
aIter.add(bIter.next());
}
System.out.println(a);
// 在b中每隔两个元素删除一个
bIter = b.iterator();
while (bIter.hasNext()) {
bIter.next();
if (bIter.hasNext()) {//迭代器是从0开始的
bIter.next();// remove跟next是成对出现的,remove总是删除前序
bIter.remove();
}
}
System.out.println(b);
// 删除a中所有的b中的元素
a.removeAll(b);
System.out.println(a);
}
}
HashSet
HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("c");// 该元素会被忽略
set.add("d");
// 使用Iterator输出集合
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
System.out.print(iter.next() + " ");
}
System.out.println();
// 使用For Each输出结合
for (String e : set) {
System.out.print(e + " ");
}
System.out.println();
// 使用toString输出集合
System.out.println(set);
}
}
899

被折叠的 条评论
为什么被折叠?



