JAVA常用集合类详解(有例子-经典呐!!!集合类糊涂的来看啊!!)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

CollectionsFramework集合框架是一个统一的架构,用来表示和操作集合.集合框架主要是由接口,抽象类和实现类构成.接口:蓝色;实现类:红色Collection|_____Set(HashSet)||_____SortedSet(TreeSet)|_____List(LinkedList,ArrayList)Collection:集合层次中的根接口,JDK没有提供这个接口的实现类。Set:不能包含重复的元素,子接口SortedSet是一个按照升序排列的元素的Set。List:可以包含重复的元素,是一个有序的集合,提供了按索引访问的方式,有次序,位置不改变。Collection接口常用的方法:booleanadd(Eo)确保此collection包含指定的元素(可选操作)。booleancontains(Objecto)如果此collection包含指定的元素,则返回true。booleanremove(Objecto)从此collection中移除指定元素的单个实例,如果存在的话(可选操作)。intsize()返回此collection中的元素数。Object[]toArray()返回包含此collection中所有元素的数组。IteratorEiterator()返回在此collection的元素上进行迭代的迭代器。List接口特有方法:Eget(intindex)返回列表中指定位置的元素。SortedSet接口特有方法:Efirst()返回此有序集合中当前第一个(最小的)元素。Elast()返回此有序集合中最后一个(最大的)元素。集合框架中的实现类.ArrayList:本质:我们可以将其看作是能够自动增长容量的数组,实际是采用对象数组实现的。自动增长容量就是当数组不够的时候,再定义更大的数组,然后将数组元素拷贝到新的数组.例子:importjava.util.*;classArrayListTest{publicstaticvoidmain(String[]args){ArrayLista1=newArrayList();a1.add(winsun);a1.add(weixin);a1.add(mybole);for(inti=0;ia1.size();i++){System.out.println(a1.get(i));}System.out.println(a1);}}结果:winsunweixinmybole[winsun,weixin,mybole]利用ArrayList的toArray()返回一个对象的数组也可以利用Arrays.asList()方法返回一个列表返回固定尺寸的列表,当返回以后就不能修改列表的大小了,可以修改列表中元素的值,但不能增加容量,可以用set()方法对值进行修改:Objectset(intindex,Objectelement)用element替换指定的index的对象Arrays.asList()和Collection.toArray()是作为数组和集合类的一个桥如果想从集合类中获得一个数组可以使用toArray()方法;如果想从数组中获得一个列表可以使用asList()方法:importjava.util.*;classPoint{intx,y;Point(intx,inty){this.x=x;this.y=y;}publicStringtoString(){returnx=+x+,y=+y;}}publicclassArrayListToArrayTest{publicstaticvoidmain(String[]args){ArrayLista1=newArrayList();a1.add(newPoint(3,3));a1.add(newPoint(4,4));a1.add(newPoint(5,5));for(inti=0;ia1.size();i++){System.out.println(a1.get(i));}System.out.println(a1);Object[]objs=a1.toArray();//利用ArrayList的toArray()返回一个对象的数组.for(inti=0;iobjs.length;i++){System.out.println(objs[i]);}System.out.println(objs);//Listl=Arrays.asList(objs);//Arrays.asList()返回一个列表.System.out.println(l);}}结果:x=3,y=3x=4,y=4x=5,y=5[x=3,y=3,x=4,y=4,x=5,y=5]x=3,y=3x=4,y=4x=5,y=5[Ljava.lang.Object;@1fc4bec[x=3,y=3,x=4,y=4,x=5,y=5]LinkedList类LinkedList是采用双向循环链表实现的.利用LinkedList实现栈(stack),队列(queue),双向队列(double-endedqueue)LinkedList常用方法voidaddFirst(Objecto)voidaddLast(Objecto)ObjectgetFirst()ObjectgetLast()Objectremove(intindex)booleanremove(Objecto)ObjectremoveFirst()ObjectremoveLast()判断是否为空LinkedList继承了一个方法isEmpty()如果没有包含任何元素返回true,没有包含任何元素返回falseArrayList底层采用数组完成,而LinkedList则是以一般的双向链表完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素.如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速.因为插入和删除都要移动数组中的元素.只是访问就用ArrayList,提供了按索引访问的机制.HashSetHashSet实现了Set接口的hashtable(哈希表),依靠HashMap来实现.应该为要存放到散列表的各个对象定义hashCode()和equals().因为实现了set接口所以不能有重复的元素.散列表:散列表又称为哈希表.散列表算法的基本思想:以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该结点存储在散列表中的地址.当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放到新的散列表中,原先的散列表将被删除.在java语言中,通过负载因子(loadfactor)来决定何时对散列表进行再散列.例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行散列.负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长.负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多.HashSet类的缺省负载因子是0.75.HashSet在java.util包当中.需要导入.常用方法booleanadd(Objecto)需要使用迭代器HashSet类实现了Set接口,所以不能有重复的元素.要根据散列码计算存储位置.而散列码是利用Object类当中的HashCode()函数获得的.而HashCode()函数是通过一个对象的内存地址来得到散列码的.所以要重写publicintHashCode()方法.String类实继承了HashCode()方法.importjava.util.*;publicclassHashSetTest{publicstaticvoidmain(String[]args){HashSeths=newHashSet();/*hs.add(one);hs.add(two);hs.add(three);hs.add(one);*/hs.add(newStudent(1,zhangsan));hs.add(newStudent(2,lisi));hs.add(newStudent(1,zhangsan));hs.add(newStudent(3,wangwu));Iteratorit=hs.iterator();while(it.hasNext()){System.out.println(it.next());}}}classStudent{intnum;Stringname;Student(intnum,Stringname){this.name=name;this.num=num;}publicintHashCode(){returnnum*name.hashCode();}publicbooleanequals(Objecto){Students=(Student)o;returnnum==s.num&&name.equals(s.name);}publicStringtoString(){returnname:=+name;}}需要覆盖HashCode()和equals()方法HashSet-HashCode-对象内存地址TreeSet:TreeSet是依靠TreeMap来实现的.TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然排序进行排列,意味着TreeSet中元素要实现Comparable接口.我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象.java.util包当中TreeSet类importjava.util.*;publicclassTreeSetTest{//如果自定义类对象要加入TreeSet要实现Comparable接口publicstaticvoidmain(String[]args){TreeSetts=newTreeSet(newStudent.StudentComparator());/*ts.add(winsun);ts.add(weixin);ts.add(mybole);*/ts.add(newStudent(2,lisi));ts.add(newStudent(1,wangwu));ts.add(newStudent(3,zhangsan));ts.add(newStudent(3,mybole));Iteratorit=ts.iterator();while(it.hasNext()){System.out.println(it.next());}}}classStudentimplementsComparable{intnum;Stringname;staticclassStudentComparatorimplementsComparator{publicintcompare(Objecto1,Objecto2){Students1=(Student)o1;Students2=(Student)o2;intresult=s1.nums2.num?1:(s1.num==s2.num?0:-1);if(result==0){//String类实现了compareTo()方法.result=s1.name.compareTo(s2.name);}returnresult;}}publicstaticvoidprintElements(Collectionc){Iteratorit=c.iterator();while(it.hasNext()){System.out.println(it.next());}}Student(intnum,Stringname){this.name=name;this.num=num;}publicintHashCode(){returnnum*name.hashCode();}publicbooleanequals(Object

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功