java高手训练营版12.10集合类_第1页
java高手训练营版12.10集合类_第2页
java高手训练营版12.10集合类_第3页
java高手训练营版12.10集合类_第4页
java高手训练营版12.10集合类_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

集合类概集合类是Java中十分实用的一些工具类。这些类可以用来对象,而且长度是可集合类体Collection接口是所有集合接口的父接口,Collection接口有两个子接口:List和Set。集合类中还有一个接口,Map,但是这个接口没有继承CollectionMap中的方法稍那么,List、Set、Map之间有什么区别呢List:对象是有序的,可以重Set:对象是无序的,不可以重Map 本章集合类是Java的工具类,用于对象,长度可Collection接口有List和SetMap接口属于集合类,但是不继承Collection接Collection接口概在上一节中提到了,Collection是List和Set接口的父接口,所以说Collection接口中的方注意:大家在查阅相关集合类的API文档时,可能会见到类似<E>、<T>、<K,V>等。这Collection接口方法概booleanadd(Objectobj); booleanaddAll(Collectionc); voidclear(); booleancontains(Object booleancontainsAll(Collection boolean Iterator booleanremove(Objecto); booleanremoveAll(Collectionc)//如果集合中含有c中的所有对象,删除,并返回trueintsize(); Object 由于Collection是接口,不能实例化,演示使用CollectionListimportpublicclassCollectionDemopublicstaticvoidmain(String[]args)//Collectioncollection=newCollectioncollection2=new//

Object[]arr=for(intx=0;x<arr.length;System.out.println("collection2的第x1元素是:}}}Eclipse当中这段程序大部在这个程序当中,我对collection和collection2这两个实例使用了Collection接口的方法来进行增删改查等操作。这些方法也是List和Set的基本方法。那么,如何对Collection接口中的元素进行遍历呢?Collection接口为我们提供Iterator接本章Collection接口是List和SetCollection中的方法基本都是增删改查,例如add()、remove()、contains()Iterator接口Iterator接口称作迭代器。每一个Collection都会有一个与之对应的Iterator。迭代器用于按顺序获取一个Collection中的元素,十分常用。不过,Iterator是接口,不可能直接new出来。Collection接口中的iterator()方返回与Iterator中的Iterator Iterator中有两个常用方法booleanhasNext(); Objectnext(); 使用这两个方法,可以方便的将Collectionwhile循环,以hasNext()为循环条件,打印next()。importpublicclassIteratorDemopublicstaticvoidmain(String[]{Collectionc=new将三个元素添加至c//Iteratorit=while(it.hasNext())}}}

Stringstr=(String)it.next();在这个程序当中,最后的while循环以it.hasNext(),也就是是否还有元素可以取出为条不是String,我们还将其向下转换为String,就会出现ClassCastException。我们以后学习迭代器的迭代器的原理其实很简单。在获取到Collection中的元后,会有一个指针放置在第一个元前。由于指针后面还有元素,hasNext()返回true,next()便会返回指针后面的元每当next()获取指针后面的元后,指针会走到第一个元后,第二个元前。然本章小Iterator(迭代器)接口用于遍历Collection迭代器中的hasNext()方法用于判断还有没有元素可以取List接口List接口是Collection接口的子接口,是集合类中必不可少的接口。List字面上指的是“列表”、“”等,这个接口的特点也是如此。List中的元素是按顺序一个一个排列的,每一个元素都有自己的下标(和数组差不多),因此,List接口的方法比Set一节,我们就来重点学下List接口的特有方法。List接口特有因为List接口是Collection的子接口,Collection接口中的方法全都被继承过来了。然而关于Collection接口的方法我们已经讲过了,所以我们今天只讲List的特有方法。voidadd(intindex,Objectelement); booleanaddAll(intindex,Collectionc); Objectget(intindex); intindexOf(Object ListIterator Objectremove(int booleanremove(Objecto); Objectset(intindex,Objectelement); 联(毕竟只有List有下标)。importpublicclassListDemopublicstaticvoidmain(String[]{Listl=newl.add(2,"插入的元素");Iteratori=l.iterator();}}}在这个程序当中,我对List的特有方法进行了一个示范。通过这个程序,我们可以发现本章List实现类概List是一个接口,真正开发的时候肯定不能直接使用这个接口。真正实用的是实现这个接竟这些方法可以通过API查询。我们重点讲的是实现类的特点。Vector三个实现类数据的特ArrayList对象的方式是通过像数组一样的下标,对每一个对象进行排列。Vector类也是这样。两者的区别在于,ArrayList是线程异步的,Vector是线程同步的。我们还没有学到多线程,线程同步机制自然也没有学过。简单来说:在多线程环境中,ArrayList的程序),就应当使用ArrayList。如果是多线程,应当使用Vector。LinkedList比较特别。LinkedList中的元素并不是通过像数组一样的形式排列的。数组和链表的性能分析间的连接。如果需要查询一个元素,需要挨个问每一个元素,“你和XXX元素连接了吗?”可见,在查询方面,数组形式是效率更高的。如果对集合的查询操作较多,使用ArrayList或如果对集合的更改操作较多,使用ArrayList、LinkedList、Vector是List的常用实现ArrayList和Vector使用数组形式对Iterator接口中的importimportpublicclassListIteratorDemopublicstaticvoidmain(String[]{ArrayListal=newIteratori=while(i.hasNext())}}}代器获取到元后进行迭代,而同时,你却又对元素进行了编辑。这样的操作是有安提供了Iterator接口的子接口,ListIterator。ListIteratorListIterator接口只能被List以及其实现类拥有。这是因为List拥有下标ListIterator的方法可以有效List接口中获取ListIterator接口的方ListIteratorlistIterator(); ListIteratorlistIterator(intindex); booleanadd(Object boolean int Object int void voidset(Object importpublicclassListIteratorDemopublicstaticvoidmain(String[]{ArrayListal=newListIteratorli=}}以说ListIterator更加优越。本章Iterator没有提供ListIterator是Iterator的子接口,其中的特有方法可以在迭代过程中对集合进行编Set接口HashSetSet接口Set接口是集合类的重要组成部分。这个接口与List接口完全相对。List接口元素有序,可重复;Set接口元素无需,不可重复。这里指的“无序”的意思是取出来的顺序与存进去的顺序不一定相同。然而,这个接口作为Collection接口的子接口,没有任何特有方法。所以说Set接口的方法这里就不说了,直接开始讲实现类。HashSet是Set接口的经典实现。同样,这个实现类没有任何特有方法,之间使用我们之前学过的Collection接口的方法使用即可。importimportpublicclassHashSetDemopublicstaticvoidmain(String[]{HashSeths=newIteratori=}}}importimportpublicclassHashSetDemopublicstaticvoidmain(String[]{HashSeths=newHashSet();Objectobj=newObject(); Iteratori=hs.iterator();}}}我们在讲add()方法的时候,曾提到过,如果元素添加成功,返回true;没有成功返回false。在这个程序当中,由于我之前已经存入了obj实例,再次存入将不会成功,因此打印add()方法的返回值将会是false。哈希表算将Object类的时候,曾经提过Object类有一个hashCode()方法,用于返回对象的哈希码;equals(Objectobj)用于判断对象是否相等。常规情况下,如果两个对象的hashCode()返回的值一样,他们equals()也应当返回trueHashSetObject类中的hashCode()或equals()方法呢classMyClass1publicinthashCode()return }}classMyClass2publicbooleanequals(Objectobj)return }}class publicinthashCode()return}publicbooleanequals(Objectobj)return}}这三个类当中:MyClass1hashCode()方法返回值是固定的;MyClass2的equals()方法的返回值是固定的;MyClass3的两个方法的返回值都是固定的。要是把这三个类都进HashSet会怎么样?importpublicclassHashSetDemopublicstaticvoidmain(String[]{HashSeths=newhs.add(newMyClass1());hs.add(newMyClass1());hs.add(newMyClass2());hs.add(newMyClass2());hs.add(newMyClass3());hs.add(newMyClass3());Iteratori=hs.iterator();}}}类的toString()方法默认返回“类名+@+哈希值”我们先观察前面两个MyClass1,可以发现“@”之后都是1,但是照样成功MyClass2的equals()方法返回true,但是添加成功,哈希码不一样MyClass3的两个方法都复写了,添加不成功。equals()方法既返回true,hashCode()也返回可以发现:equals()方法为true,哈希码也一样,才会被当成“一个对象”在不同的位置。这样做虽说可以,但是会降低HashSet的效率。因此一般equals()和本章HashSet是Set的实现类,通过哈希表算法判断两个对象是否相HashSet没有特有方如果equals()方法返回true,hashCode()也一样,会被当做一个对TreeSet类概TreeSet也是SetHashSet最大的区别在于排序方面:HashSet类是通过哈希表对元素进行排序的,TreeSet的排序方法是使用者自定的。今天我已有排序方法的importimportpublicclassTreeSetDemopublicstaticvoidmain(String[]{TreeSetts=newts.add(6);//添加多个Integer类Iteratori=}}}大家可以发现,我在TreeSet中添加了几个没有任何顺序的int(Integer)类型,但是一将Integer类(也就是int类型的包装么如果要自定义我的类的排序方式如何实现呢?Comparableparable接口包含用于对对象进行排序的方法。TreeSet中存的元素的类都必intcompareTo(Object如果返回值为负数,说明this小于0,说明this与o如果返回值为正数,说明this大于假如说我有一个工人类,想要通过TreeSet对工人的工号进行排序。classprivateString privateint privateint publicStringreturn}publicWorker(Stringname,intage,intid)=name;this.age=age;this.id=id;}}toString方法,让直接打印这个类的实例看的更加直观。不过,由于我们这个类还没有实现Comparable接口,其还不能被排序。我们让它实现这的运行时类型是不是Worker,如果是,向下转换;如果不是,通过throw抛出id字段与thisid字段,如果this.id>obj.id,返回正数(表示this>obj)如果this.idobj.id0(表示如果this.id<obj.id,返回负数(表示classWorkerimplementsComparable{privateStringname;//privateintage;privateint publicStringreturn}publicWorker(Stringname,intage,=name;this.age=age;this.id=id;}publicintcompareTo(Objecto)if(!(oinstanceof //如果能够执行到这里,说明oinstanceofWorker==trueWorkerworker=(Worker)o; return elseif(this.idworker.id)//如果this的id等于worker的return }

return- }importpublicclassTreeSetDemopublicstaticvoidmain(String[]{TreeSetts=newts.add(newWorker("A",25,1));//添加Worker类对象ts.add(newWorker("B",31,5));ts.add(newts.add(newts.add(newIteratori=ts.iterator();}}}本章TreeSet是Set接口的实现类,通过存入对象的类的compareTo()方法对对象进行排如果想要往TreeSet类添加对象,这个对象的类必须实现Comparable如果compareTo()返回正数,说明this>0,this==参数;如果是负Map接口接口,这是因为其中的数据方式和List与Set有着很大的区别假如说我们有一个集合,这个集合是一个学生的成绩单。有“80分”、“91分”目去查询,然后再看与这个科目相对的分值。Map的特点就是像这样一个元素对应一个元素的。用于查找的元素叫做“键(Key)”、用于表示实际数据的元素叫做“值(Value)”Map接口有一个内部接口,叫做Entry,也叫映射。一个EntryEntry就构成了一个MapMap接口Map接口没有继承Collection,所以其中的所有方法都是特有的void booleancontainsKey(Object Set Objectget(Object boolean SetkeySet() Objectput(Objectkey,Object voidputAll(Mapm) Objectremove(Object int Collection importpublicclassMapDemopublicstaticvoidmain(String[]args)Mapmap=newHashMap();}}在这个程序中,我是实例化了HashMap之后通过put()方法加入了多个科目以及对应分数。之后使用size()方法返回这个Map的Entry数量。最后使用containsKey()方法判断是Entry接口Object Object ObjectsetValue(Object importpublicclassMapDemopublicstaticvoidmain(String[]{Mapmap=newSetset=map.entrySet(); Iter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论