注:上述有关该图信息出处:http://www.cnblogs.com/xwdreamer
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框 的是接口,比如Collection,Iterator,List等。
发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hasNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
还有一个特点就是抽象类的使用。如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添加一些方法就可以实现自己需要的集合类,工作流昂大大降低。
1.HashSet
package com.mypractice.second;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetTest {
/**
* @param args
*/
public static void main(String[] args) {
Set<String> set = new HashSet<String>(); //创建HashSet
set.add("z"); //向HashSet中加入元素
set.add("h");
set.add("u");
set.add("u");
Iterator iterator = set.iterator(); //创建迭代器
while(iterator.hasNext()){ //使用迭代器进行输出
System.out.print(iterator.next()+",");
}
}
}
运行结果:
1.该集合中存放元素无顺序(即输入顺序和输出顺序不一致),原理是采用采用散列的存储方法,所以没有顺序;
2.该集合不存在重复元素(如存储两个一样的元素,只能显示一个元素)。
2.ArrayList
ArrayList是List的子类,它和HashSet不同,ArrayList允许存放重复元素,因此有序。集合中元素被访问的顺序取决于集合的类型。如果对ArrayList进行访问,迭代器将从索引0开始,每迭代一次,索引值加1。然而,如果访问HashSet中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元素被访问的次序。
package com.mypractice.second;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
/**
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<String>();//创建String类型的ArrayList集合
list.add("z"); //向ArrayList集合中加入元素
list.add("h");
list.add("u");
list.add("u");
Iterator<String> iterator = list.iterator();//创建迭代器
while(iterator.hasNext()){ //遍历ArrayList中数组
System.out.print(iterator.next()+",");
}
}
}
运行结果:
ArrayList总结:
1.该集合中允许存放重复元素;
2.该集合中存放元素是有序的(即存放顺序和输出顺序一致)。
3.LinkedList
package com.mypractice.third;
import java.util.LinkedList;
public class LinkedLink {
/**
* @param args
*/
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<String>(); //创建LinkedList对象
linkedList.add("z"); //向LinkedList对象中加入元素
linkedList.add("h");
linkedList.add(0,"u");
System.out.print("加入元素:"); //输出加入的元素
for(String str:linkedList){
System.out.print(str);
}
System.out.println("");
linkedList.remove(2); //删除索引为2的元素
System.out.print("移除元素linkedList.remove(2):");
for(String str:linkedList){ //遍历LinkedList
System.out.print(str);
}
System.out.println("");
}
}
运行结果
LinkedList总结:
1.LinkedList是使用链表来维持顺序,并且每一个元素都有自己的位置;
2.LinkedList可根据元素或者元素的位置进行增加或删除元素操作;
3.由于是使用链表来维持顺序,所有每一个元素都可查询其前一个或者后一个元素。