第11讲 JAVA集合类

第11讲 JAVA集合类

ID:40231668

大小:116.00 KB

页数:49页

时间:2019-07-27

上传者:xinshengwencai
第11讲   JAVA集合类_第1页
第11讲   JAVA集合类_第2页
第11讲   JAVA集合类_第3页
第11讲   JAVA集合类_第4页
第11讲   JAVA集合类_第5页
资源描述:

《第11讲 JAVA集合类》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

Java集合类(下) collectionsframework概述所有抽象出来的数据结构和操作统称为collectionsframework框架。Java程序员不必考虑数据结构的算法细节,只需要定义具体应用的数据结构实体。数据结构上的方法也用不着程序员去写,用系统的方法就行了,系统的方法总比一般程序员编的要快所有这些framework都在java.util包中7/15/20212Java集合类(下) collectionsframework概述在Java2的Collections框架中,主要包括两个接口及其扩展和实现类:Collection接口和Map接口Collection是集合接口Collections是集合类Collection接口:Set—不允许重复List—可以有重复元素7/15/20213Java集合类(下) Java类库中具体的集合(部分)7/15/20214Java集合类(下) Collection接口CollectionAPI提供“集合”的功能CollectionAPI包含下述接口Collection:将一组对象以集合元素的形式组织到一起,在其子接口中分别实现不同的组织方式Set:Collection的子接口,不记录元素的保存顺序,且不允许有重复元素List:Collection的子接口,记录元素的保存顺序,且允许有重复元素7/15/20215Java集合类(下) Collection接口定义了集合的基本行为,一个Collection的实现类的实例能够:存放一个元素增加/删除一个元素查找一个元素是否在此集合中计算此集合的元素数目Collection没有约束元素的具体类型(是否为空也未规定),元素的顺序,元素是否可重复部分Collection是整齐的(ordered)(注意,整齐的并不是一定是一定要经过排序的,即不一定是sorted).这样的Collection的元素之间在逻辑上是一个接一个(onebyone),即可以得到一个元素的下一个元素的引用.这些元素可以是排序的(sorted,元素的次序由自然顺序或者规定的顺序排列)也可以是未排序的(unsorted,元素顺序由插入的顺序决定)java.util.List接口继承Collection接口定义这一类Collection部分Collection要求无重复的元素,称之为Set,java.util.Set接口继承Collection来定义这一类Collection7/15/20216Java集合类(下) Collection层次结构<>Collection+add(element:Object):boolean+remove(element:Object):boolean+size():int+isEmpty():boolean+contains(element:Object):boolean+iterator():Iterator<>SetHashSet<>ListArrayListVectorLinkedList7/15/20217Java集合类(下) CollectionArrayListArrayList(有序)实现类(把List接口中抽象方法按照非线程安全来实现,这样具有效率高、安全性低).7/15/20218Java集合类(下) 数组列表ArrayList在编程中常常会遇到需要动态操纵数组,比如在运行时增加和删除数组元素,而且有时在编译时又不想确定数组大小希望它可以动态伸缩,在java中解决这一问题的方法是使用java.util包中的ArrayList类ArrayList是List接口的一个可变长数组实现。7/15/20219Java集合类(下) 数组列表ArrayListpublicintsize();//返回列表中的元素个数publicObjectget(intindex);//返回指定位置的元素publicvoidset(intindex,Objectobj);//设置指定位置元素publicvoidadd(intindex,Objectobj);//在列表指定位置插入元素publicvoidclear();//删除列表中所有元素publicvoidremove(intindex);//删除列表中指定位置元素元素publicvoidcontains(Objectobj);//判断列表中指定对象是否存在7/15/202110Java集合类(下) ArrayList示例(ArrayListExample)publicclassArrayListExample{publicstaticvoidmain(String[]args){ArrayListal=newArrayList();//CreateanewArrayListfor(inti=0;i<10;i++){al.add(newInteger(i));//AddItemstothearraylist}for(inti=0;i>Iterator+hasNext():boolean+next():object+remove()<>ListIterator+hasPrevious():boolean+previous():Object+add(element:Object)+set(element:Object)7/15/202123Java集合类(下) Iterator接口Iterator:提供对所有集合(Collection)进行遍历的接口对Collection提供一个统一的遍历接口是原Collection的一个视图,故在进行遍历时对应Collection中元素的改变会影响Iterator。与旧版本遍历Enumeration的区别:Iterator可以在遍历时删除对应Collection中的元素Iterator有更好的方法名Enumeration已过时不同的Collection产生Iterator产生的效率是不同的,ArrayList的遍历应该使用索引Listlist=newArrayList();Iteratorelements=list.iterator();while(elements.hasNext()){System.out.println(elements.next());}7/15/202124Java集合类(下) Iterator接口booleanhasNext()如果存在更多的元素,则返回true,否则返回falseObjectnext()返回下一个元素。如果没有下一个元素,则引发NoSuchElementException异常voidremove()删除当前元素,如果试图在调用next()方法之后,调用remove()方法,则引发IllegalStateException异常7/15/202125Java集合类(下) Iterator接口hasPrevious()如果存在前一个元素,则返回true;否则返回falseintnextIndex()返回下一个元素的下标,如果不存在下一个元素,则返回列表的大小Objectprevious()返回前一个元素,如果前一个元素不存在,则引发一个NoSuchElementException异常intpreviousIndex()返回前一个元素的下标,如果前一个元素不存在,则返回-1voidset(Objectobj)将obj赋给当前元素。这是上一次调用next()方法或previous()方法最后返回的元素voidadd(Objectobj)将obj插入列表中的一个元素之后,该元素在下一次调用next()方法时,被返回7/15/202126Java集合类(下) Iteratornext()对于a,b,c,d,e这样一个5个元素的序列,有6个插入位置,每次next()是由一个插入位置移动到下一个插入位置,而不是元素的位置本身7/15/202127Java集合类(下) Iterator接口在通过迭代函数访问类集之前,必须得到一个迭代函数。每一个Collection类都提供一个iterator()函数,该函数返回一个对类集头的迭代函数。通过使用这个迭代函数对象,可以访问类集中的每一个元素,一次一个元素。通常,使用迭代函数循环通过类集的内容,步骤如下:7/15/202128Java集合类(下) Iterator接口1.通过调用类集的iterator()方法获得对类集头的迭代函数。2.建立一个调用hasNext()方法的循环,只要hasNext()返回true,就进行循环迭代。3.在循环内部,通过调用next()方法来得到每一个元素。对于执行List的类集,也可以通过调用ListIterator来获得迭代函数。正如上面解释的那样,列表迭代函数提供了前向或后向访问类集的能力,并可让你修改元素。否则,ListIterator如同Iterator功能一样。7/15/202129Java集合类(下) Iterator接口importjava.util.*;classHashSetTest{publicstaticvoidmain(String[]args){HashSeths=newHashSet();//hs.add("one");//hs.add("two");//hs.add("three");//hs.add("one");hs.add(newStudent1(1,"zhangsan"));hs.add(newStudent1(2,"lisi"));hs.add(newStudent1(3,"wangwu"));hs.add(newStudent1(1,"zhangsan"));Iteratorit=hs.iterator();while(it.hasNext()){System.out.println(it.next());}}}7/15/202130Java集合类(下) Iterator接口classStudent1{intnum;Stringname;Student1(intnum,Stringname){this.num=num;this.name=name;}publicinthashCode(){returnnum*name.hashCode();}publicbooleanequals(Objecto){Student1s=(Student1)o;returnnum==s.num&&name.equals(s.name);}publicStringtoString(){returnnum+":"+name;}}7/15/202131Java集合类(下) Iterator作为返回值classIterTest31{publicIteratortt(){Listaa=newArrayList();aa.add(newPerson("w1",1));aa.add(newPerson("w2",1));aa.add(newPerson("w3",1));aa.add(newPerson("w4",1));aa.add(newPerson("w5",1));Iteratorit=aa.iterator();System.out.println("--------");System.out.println(aa);returnit;}publicstaticvoidmain(Stringargc[]){IterTest31itt=newIterTest31();Iteratorit=itt.tt();while(it.hasNext()){Personp1=(Person)it.next();System.out.println(p1);}}}7/15/202132Java集合类(下) 多次调用对象xxx.iterator()获取的IteratorclassIterTest41{publicIteratortt(){Listaa=newArrayList();aa.add(newPerson("w1",1));aa.add(newPerson("w2",1));aa.add(newPerson("w3",1));aa.add(newPerson("w4",1));aa.add(newPerson("w5",1));Iteratorit=aa.iterator();while(it.hasNext()){Personp1=(Person)it.next();System.out.println(p1);if(p1.getName().equals("w3")){System.out.println("--------");Iteratorit11=aa.iterator();if(it11.hasNext()){System.out.println(it11.next());}}}System.out.println("--------");System.out.println(aa);returnit;}publicstaticvoidmain(Stringargc[]){IterTest41itt=newIterTest41();Iteratorit=itt.tt();}}7/15/202133Java集合类(下) ConcurrentModificationException异常获取叠代器后通过Connection接口的实现类增加删除数据通过叠代器自身增加删除数据7/15/202134Java集合类(下) 映射(map)映射(map)是一个存储关键字和值的关联或者说是关键字/值对的对象。给定一个关键字,可以得到它的值。关键字和值都是对象。关键字必须是唯一的。但值是可以被复制的。有些映射可以接收null关键字和null值。而有的则不行。Map是一个维护一组”键---值”映射的类(mapkeystovalues)(这里的key,value全部都是引用类型)一个Map中key的值是唯一的,不重复(如,不要用员工姓名作为key)一个Map中一个key只能对应一个value(可以为空),但一个value可以有多个key与之对应Map能让你通过key快速查找到相应的对象并获得它对应的value的引用(如存储员工资料并用员工ID作为key来查找某一员工的信息)7/15/202135Java集合类(下) HashMapHashMap类使用散列表实现Map接口。这允许一些基本操作如get()和put()的运行时间保持恒定,即便对大型集合,也是这样的。HashMap()构造一个默认的散列映射HashMap(Mapm)用m的元素初始化散列映射HashMap(intcapacity)将散列映射的容量初始化为capacityHashMap(intcapacity,floatfillRatio)用它的参数同时初始化散列映射的容量和填充比。容量和填充比的含义与前面介绍的HashSet中的容量和填充比相同。7/15/202136Java集合类(下) Map接口,HashMap类Map接口是Dictionary类的替代品。HashMap是以哈希表的形式存储键值对,速度快。7/15/202137Java集合类(下) HashMapHashMap实现Map并扩展AbstractMap.它本身并没有增加任何新的方法。应该注意的是散列映射并不保证它的元素的顺序。因此,元素加入散列映射的顺序并不一定是它们被迭代函数读出的顺序。7/15/202138Java集合类(下) HashMapimportjava.util.*;classHashMapTest{publicstaticvoidprintElements(Collectionc){Iteratorit=c.iterator();while(it.hasNext()){System.out.println(it.next());}}publicstaticvoidmain(String[]args){HashMaphm=newHashMap();hm.put("one","zhangsan");hm.put("two","lisi");hm.put("three","wangwu");System.out.println(hm.get("one"));System.out.println(hm.get("two"));System.out.println(hm.get("three"));Setkeys=hm.keySet();System.out.println("Key:");printElements(keys);Collectionvalues=hm.values();System.out.println("Value:");printElements(values);Setentry=hm.entrySet();//printElements(entry);Iteratorit=entry.iterator();while(it.hasNext()){Map.Entryme=(Map.Entry)it.next();System.out.println(me.getKey()+":"+me.getValue());}}}7/15/202139Java集合类(下) HashMapHashMap类:实现Map接口及它的它的所有可选操作。允许空key和空value.类似Hashtable,但Hashtable是线程安全的,且不允许空key和空value.不保证元素的顺序基本元素操作(putandget)速度恒定。(前提是各“桶”内分布的元素是均匀的)线程不安全7/15/202140Java集合类(下) HashSet和HashMapHashMap可以看作三个视图:key的Set,value的Collection,Entry的Set。这里HashSet就是其实就是HashMap的一个视图。HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要Key和Value两个值。往hashset中插入对象其实只不过是内部做了publicbooleanadd(Objecto){returnmap.put(o,PRESENT)==null;}HashMap为散列映射,它是基于hashtable的一个实现,它可在常量时间内安插元素,或找出一组key-valuepair.HashSet为散列集,它把查找时间看的很重要,其中所有元素必须要有hashCode()7/15/202141Java集合类(下) Dictionary和Hashtable类Dictionary类提供了根据关键字查值的功能。Dictionary是个abstract的类,因此我们不直接使用它。直接使用的一般是Hashtable类。Hashtable继承了dictionary类,称为哈希表类。快速寻址等7/15/202142Java集合类(下) Hashtable类如果要取得并显示哈希表中所有记录值,应该用以下程序段Enumerationenum=table.elements();while(enum.hasMoreElements())show("FoundElements(notkey):"+enum.nextElement());其中的table.elements取得的是所有哈希表中的对象如果要取得并显示哈希表中所有关键字的值,就应该这么做Enumerationenum1=table.keys();while(enum1.hasMoreElements())show("Keyis->"+enum1.nextElement());其中的table.keys取得哈希表中所有关键字的值7/15/202143Java集合类(下) Hashtable(注意不是HashTable)importjava.util.*;classHashTableTest1{publicHashtablett(){try{Hashtablemm=newHashtable();mm.put("w1",newPerson("w1",11));mm.put("w2",newPerson("w2",11));mm.put("w3",newPerson("w3",11));mm.put("w4",newPerson("w4",11));/**mm.put(null,"sdfds");mm.put("w3",null);Enumeration*/returnmm;}catch(Exceptione){e.printStackTrace();}returnnull;}publicstaticvoidmain(Stringargc[]){HashTableTest1htt=newHashTableTest1();Hashtablemm=htt.tt();//可以采用Map的keySet(),values(),entrySet()方法来访问Hashtable/**Setss=mm.keySet();Iteratorii=ss.iterator();*while(ii.hasNext()){System.out.println(ii.next());}*///也可以用早期提供的Enumeration访问//elements()返回value的,keys()返回key的Enumeration,values()返回values的CollectionEnumerationbb=mm.elements();while(bb.hasMoreElements()){System.out.println("-----------");Objecto=bb.nextElement();System.out.println(o);if(oinstanceofPerson){Personp1=(Person)o;System.out.println("name----:"+p1.getName());System.out.println("age----:"+p1.getAge());}}Enumerationkk=mm.keys();while(kk.hasMoreElements()){System.out.println(kk.nextElement());}}}7/15/202144Java集合类(下) Properities类哈希表里存的关键字-值对可以是各种类型。而propeities就相对简单多了。它只存放字符串对propeities用setProperty和getProperty来处理值,此类的值只能是String7/15/202145Java集合类(下) SystemPropertiesimportjava.util.Properties;importjava.util.Enumeration;publicclassTestProperties{publicstaticvoidmain(String[]args){Propertiesprops=System.getProperties();Enumerationprop_names=props.propertyNames();while(prop_names.hasMoreElements()){Stringprop_name=(String)prop_names.nextElement();Stringproperty=props.getProperty(prop_name);System.out.println("property’"+prop_name+"’is’"+property+"’");}}}7/15/202146Java集合类(下) Hashtable与HashMapHashtable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。HashTable有一个contains(Objectvalue),功能和containsValue(Objectvalue)功能一样。Hashtable使用Enumeration,HashMap使用Iterator。7/15/202147Java集合类(下) 掌握重点Java数组有什么特点数组列表和数组有什么不同Collection接口及其实现类HashMap,HashSet,HashTable7/15/202148Java集合类(下) 课后练习为ArrayTest添加为Employee数组排序的方法(提示:为Employee实现);按ArrayTest设计ArrayListTest类,使用数组列表代替数组7/15/202149Java集合类(下)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭