0.参考文献
1.java集合类图
1.1
1.2
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
还有一个特点就是抽象类的使用。如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添加一些方法就可以实现自己需要的集合类,工作流昂大大降低。
1.3
2.详解
2.1HashSet
HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致。
代码实例:HashSetDemo
packageedu.sjtu.erplab.collection;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;public classHashSetDemo {public static voidmain(String[] args) {
Set set=new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("c");
set.add("d");//使用Iterator输出集合
Iterator 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);
}
}
代码实例:SetTest
packageedu.sjtu.erplab.collection;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Scanner;importjava.util.Set;public classSetTest {public static void main(String[] args) throwsFileNotFoundException {
Set words=new HashSet();//通过输入流代开文献//方法1:这个方法不需要抛出异常
InputStream inStream=SetTest.class.getResourceAsStream("Alice.txt");//方法2:这个方法需要抛出异常//InputStream inStream = new FileInputStream("D:\\Documents\\workspace\\JAVAStudy\\src\\edu\\sjtu\\erplab\\collection\\Alice.txt");
Scanner in=newScanner(inStream);while(in.hasNext())
{
words.add(in.next());
}
Iterator iter=words.iterator();for(int i=0;i<5;i++)
{if(iter.hasNext())
System.out.println(iter.next());
}
System.out.println(words.size());
}
}
2.2ArrayList
ArrayList是List的子类,它和HashSet想法,允许存放重复元素,因此有序。集合中元素被访问的顺序取决于集合的类型。如果对ArrayList进行访问,迭代器将从索引0开始,每迭代一次,索引值加1。然而,如果访问HashSet中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元素被访问的次序。
代码实例:ArrayListDemo
packageedu.sjtu.erplab.collection;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;public classArrayListDemo {public static voidmain(String[] args) {
List arrList=new ArrayList();
arrList.add("a");
arrList.add("b");
arrList.add("c");
arrList.add("c");
arrList.add("d");//使用Iterator输出集合
Iterator 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);
}
}
2.3 ListIterator
ListIterator是一种可以在任何位置进行高效地插入和删除操作的有序序列。
代码实例:LinkedListTest
packageedu.sjtu.erplab.collection;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importjava.util.ListIterator;public classLinkedListTest {public static voidmain(String[] args) {
List a=new ArrayList();
a.add("a");
a.add("b");
a.add("c");
System.out.println(a);
List b=new ArrayList();
b.add("d");
b.add("e");
b.add("f");
b.add("g");
System.out.println(b);//ListIterator在Iterator基础上添加了add(),previous()和hasPrevious()方法
ListIterator aIter=a.listIterator();//普通的Iterator只有三个方法,hasNext(),next()和remove()
Iterator 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())
{
bIter.next();//remove跟next是成对出现的,remove总是删除前序
bIter.remove();
}
}
System.out.println(b);//删除a中所有的b中的元素
a.removeAll(b);
System.out.println(a);
}
}
2.4HashMap
2.5WeekHashMapDemo
packageedu.sjtu.erplab.collection;importjava.util.WeakHashMap;public classWeekHashMapDemo {public static voidmain(String[] args) {int size = 100;if (args.length > 0) {
size= Integer.parseInt(args[0]);
}
Key[] keys= newKey[size];
WeakHashMap whm = new WeakHashMap();for (int i = 0; i < size; i++) {
Key k= newKey(Integer.toString(i));
Value v= newValue(Integer.toString(i));if (i % 3 == 0) {
keys[i]= k;//强引用
}
whm.put(k, v);//所有键值放入WeakHashMap中
}
System.out.println(whm);
System.out.println(whm.size());
System.gc();try{//把处理器的时间让给垃圾回收器进行垃圾回收
Thread.sleep(4000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(whm);
System.out.println(whm.size());
}
}classKey {
String id;publicKey(String id) {this.id =id;
}publicString toString() {returnid;
}public inthashCode() {returnid.hashCode();
}public booleanequals(Object r) {return (r instanceof Key) &&id.equals(((Key) r).id);
}public voidfinalize() {
System.out.println("Finalizing Key " +id);
}
}classValue {
String id;publicValue(String id) {this.id =id;
}publicString toString() {returnid;
}public voidfinalize() {
System.out.println("Finalizing Value " +id);
}
}
输出结果
{50=50, 54=54, 53=53, 52=52, 51=51, 46=46, 47=47, 44=44, 45=45, 48=48, 49=49, 61=61, 60=60, 63=63, 62=62, 65=65, 64=64, 55=55, 56=56, 57=57, 58=58, 59=59, 76=76, 75=75, 74=74, 73=73, 72=72, 71=71, 70=70, 68=68, 69=69, 66=66, 67=67, 85=85, 84=84, 87=87, 86=86, 81=81, 80=80, 83=83, 82=82, 77=77, 78=78, 79=79, 89=89, 88=88, 10=10, 90=90, 91=91, 92=92, 93=93, 94=94, 95=95, 96=96, 97=97, 98=98, 99=99, 20=20, 21=21, 12=12, 11=11, 14=14, 13=13, 16=16, 15=15, 18=18, 17=17, 19=19, 8=8, 9=9, 31=31, 4=4, 32=32, 5=5, 6=6, 30=30, 7=7, 0=0, 1=1, 2=2, 3=3, 29=29, 28=28, 27=27, 26=26, 25=25, 24=24, 23=23, 22=22, 40=40, 41=41, 42=42, 43=43, 38=38, 37=37, 39=39, 34=34, 33=33, 36=36, 35=35}
Finalizing Key98Finalizing Key97Finalizing Key95Finalizing Key94Finalizing Key92Finalizing Key91Finalizing Key89Finalizing Key88Finalizing Key86Finalizing Key85Finalizing Key83Finalizing Key82Finalizing Key80Finalizing Key79Finalizing Key77Finalizing Key76Finalizing Key74Finalizing Key73Finalizing Key71Finalizing Key70Finalizing Key68Finalizing Key67Finalizing Key65Finalizing Key64Finalizing Key62Finalizing Key61Finalizing Key59Finalizing Key58Finalizing Key56Finalizing Key55Finalizing Key53Finalizing Key52Finalizing Key50Finalizing Key49Finalizing Key47Finalizing Key46Finalizing Key44Finalizing Key43Finalizing Key41Finalizing Key40Finalizing Key38Finalizing Key37Finalizing Key35Finalizing Key34Finalizing Key32Finalizing Key31Finalizing Key29Finalizing Key28Finalizing Key26Finalizing Key25Finalizing Key23Finalizing Key22Finalizing Key20Finalizing Key19Finalizing Key17Finalizing Key16Finalizing Key14Finalizing Key13Finalizing Key11Finalizing Key10Finalizing Key8Finalizing Key7Finalizing Key5Finalizing Key4Finalizing Key2Finalizing Key1{54=54, 51=51, 45=45, 48=48, 60=60, 63=63, 57=57, 75=75, 72=72, 69=69, 66=66, 84=84, 87=87, 81=81, 78=78, 90=90, 93=93, 96=96, 99=99, 21=21, 12=12, 15=15, 18=18, 9=9, 6=6, 30=30, 0=0, 3=3, 27=27, 24=24, 42=42, 39=39, 33=33, 36=36}
疑问:为什么value没有被回收。
3.比较
是否有序
是否允许元素重复
Collection
否
是
List
是
是
Set
AbstractSet
否
否
HashSet
TreeSet
是(用二叉排序树)
Map
AbstractMap
否
使用key-value来映射和存储数据,key必须唯一,value可以重复
HashMap
TreeMap
是(用二叉排序树)
转载内容