Java集合框架本章内容1.Java集合框架概述2.List接口以及实现类3.Set接口以及实现类4.Map接口以及实现类5.Boxing/unBoxing6.Iterator以及Enumeration接口7.Collections和Arrays类集合框架的概念集合就是将若干用途相同、近似的“数据”结合成一个整体。集合从体系上分为三种:(1)列表(List):List集合区分元素的顺序,允许包含相同的元素。(2)集(Set):Set集合不区分元素的顺序,不允许包含相同的元素。(3)映射(Map):Map集合保存的”键”-“值”对,“键”不能重复,而且一个“键”只能对应一个“值”。Java集合中只能保存引用数据类型,也就是保存的是对象的地址,而非对象本身。集合中元素相当于引用类型的变量。集合框架的类图关系JDK所提供的容器API全部位于java.util包中。容器API的类图关系如下:CollectionSetMapHashSetTreeSetArrayListVectorStackListHashMapTreeMapHashtableIteratorJava.lang.ComparableArraysCollectionsEnumerationCollection接口中的方法(1)intsize();(2)booleanisEmpty();(3)voidclear();(4)booleancontains(Objectelement);(5)booleanadd(Objectelement);(6)booleanremove(Objectelement);(7)Iteratoriterator();(8)booleancontainsAll(Collectionc);(9)booleanaddAll(Collectionc)(10)booleanremoveAll(Collectionc)(11)booleanretainAll(Collectionc)(12)Object[]toArray();Collection方法举例importjava.util.*;publicclassCollectionTest{publicstaticvoidmain(Stringargs[]){Collectionc=newArrayList();c.add(helloworld);c.add(newInteger(100));c.add(newFloat(99.9f));System.out.println(c.size());System.out.println(c);}}List接口List是Collection的子接口,实现List接口的容器中存放的对象是有顺序的,而且可以重复。List容器中存放的对象都有一个整数型的序号,记录该对象在容器中的位置,可以根据序号来访问容器中的元素。JDK提供实现List接口的类有ArrayList、LinkedList等。Objectget(intindex)Objectset(intindex,Objectobj)voidadd(intindex,Objectobj)Objectremove(intindex)intindexOf(Objectobj)intlastIndexOf(Objectobj)List接口举例Listli=newArrayList();for(inti=0;i10;i++)li.add(a+i);System.out.println(li);li.add(3,a20);System.out.println(li);li.set(4,a30);System.out.println(li);System.out.println((String)li.get(2));li.remove(0);System.out.println(li);见源文件:ListTest1.javaList接口的实现类-ArrayListjava.util.ArrayList实现了List接口,用于描述长度可变的数组列表(底层采用数组实现)。ArrayList允许元素取值为null,提供了一些新增的方法来操作列表的容量的大小。publicArrayList()(默认大小是10)publicArrayList(intinitialCapacity)publicvoidensureCapacity(intminCapacity)publicvoidtrimToSize()ArrayList举例ArrayListlist=newArrayList(6);list.add(oyhj);list.add(newInteger(10));list.add(newDouble(10.5));System.out.println(list.size());Objectitem[]=list.toArray();for(inti=0;iitem.length;i++)System.out.println(item[i]);list.trimToSize();见源文件:ArrayListTest.javaList接口的实现类-Vectorjava.util.Vector实现了List接口,用于描述长度可变的数组向量(底层采用数组实现)。与ArrayList的区别:Vector是线程安全的(同步),用在多线程环境中,运行效率慢。ArrayList不是线程安全的,用在单线程环境中。Vector类的新增方法:publicVector()(默认大小是10)publicObjectelementAt(intindex)publicvoidremoveElement(intindex)publicvoidinsertElement(Objectobj,intindex)publicbooleanremoveElement(Objectobj)publicvoidremoveAllElements()publicObjecttoArray()Stack类java.util.Statck继承自Vector类,对应”FirstIn,Lastout”的数据结构-栈。Stack类的常用方法:publicStatck()publicObjectpush(Objectobj)publicObjectpop()publicObjectpeek()publicbooleanisEmpty()publicvoidclear()publicintsearch(Objectobj)见源文件:Stack/StackTest.javaSet接口Set接口是Collection的子接口,Set接口没有提供新增的方法,但实现Set接口的容器中元素是没有顺序的且不可以重复。Set容器可以与数学中的“集合”概念相对应。JDK中提供的实现Set接口的类有HashSet、TreeSet等。HashSetHashSeths=newHashSet();hs.add(first);hs.add(second);hs.add(third);hs.add(fourth);hs.add(first);hs.add(newDate());System.out.println(哈希表的大小:+hs.size());System.out.println(hs);见源文件:HashSet/HashSetTest.javaSet接口与集合操作相关的几个方法Sets1=newHashSet();Sets2=newHashSet();s1.add(a);s1.add(b);s1.add(c);s2.add(b);s2.add(c);s2.add(d);Sets3=newHashSet(s1);s3.retainAll(s2);//求交集Sets4=newHashSet(s2);s4.addAll(s1);//求并集System.out.println(s3);System.out.println(s4);见源文件:HashSet/SetTest2.javaSet接口的实现类-TreeSetTreeSet描述的是Set的一个变体-可实现排序功能的集合。将对象插入到TreeSet中时,会按照某种比较规则将对象插入到一个有序序列中,以保证TreeSet集合中的对象序列保持“升序”排列。见源文件:TreeSet/TreeSetTest1.javaComparable接口问题:TreeSet中的排序方法是根据什么确定对象之间的”大小”关系呢?所有可排序的类都实现了java.lang.Comparable接口,该接口中只有一个抽象方法:publicintcompareTo(Objectobj)注意:用户在实现compareTo()方法确定比较逻辑时,比较结果应该和equals()方法比较的结果一致。见源文件:Comparable/TreeSetTest2.javaMap接口实现Map接口的类用来存储”键-值”对。可理解为一张二维表,这个二维表只有两列,一列是Key,一列是Value。Map中存储的“键-值”对由键来标识,所以键不能重复。Map接口的实现类有HashMap和TreeMap。Map接口的常用方法:Objectput(Objectkey,Objectvalue)Objectget(Objectkey)Objectremove(Objectkey)booleancontainsKey(Objectkey)booleancontainsValue(Objectvalue)intsize()booleanisEmpty()voidputAll(Mapt)voidclear()Map接口的实现类-HashMapjava.util.HashMap类实现了java.util.Map接口,基于哈希表实现“键”-“值”对的映射关系。HashMap不确定“K”-”value”对的先后顺序,允许使用null“K”和null”value”。影响HashMap性能的两个因素:初始容量(InitialCapacity)加载因子(LoadFactor)(小于1的数)见源文件:HashMap/HashMapTest1.javaMap接口的实现类-Hashtablejava.util.Hashtable实现了java.util.Map接口,也是采用哈希表的形式将”Key”映射到”Value”,用法与HashMap基本相同。HashMap与Hashtable的区别:(1)Hashtable中的“key”和“value”都不允许null,而HashMap允许。(2)Hashtable是线程安全的,适合在多用户环境中使用,效率稍低;HashMap不是线程安全的,效率稍高,适合在单线程环境下使用。Iterator接口Iterator(称作迭代器)接口主要提供了对容器中元素进行遍历的方法。所有实现了Collection接口的类都有一个iterator()方法来返回一个实现了Iterator接口的类的对象。该接口中定义了如下抽象方法:Iterator接口booleanhasNext()//判断游标右边是否还有元素Objectnext()//返回游标右边的元素并将游标移动到该元素后voidremove()//删除游标左边的元素,通常在next()方法之后执行,只执行一次。Iterator接口举例Collectionc=newArrayList();c.add(helloworld);c.add(newInteger(100));c.add(newFloat(99.9f));Iteratorit=c.iterator();while(it.hasNext()){Objectobj=it.next();System.out.println(obj);it.remove();}System.out.println(c);见源文件:Iterator/IteratorTest.javaEnumeration接口Enumerati