《Java面向对象编程》课件-第11章 集合_第1页
《Java面向对象编程》课件-第11章 集合_第2页
《Java面向对象编程》课件-第11章 集合_第3页
《Java面向对象编程》课件-第11章 集合_第4页
《Java面向对象编程》课件-第11章 集合_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

第11章集合

学习内容02集合概念Collection接口0103泛型01集合概念集合概念当我们遇到存储变长的对象的时候,为此jdk给我们提供了集合类,让我们存储变长个数的对象与数组的比较:数组长度是固定的,集合长度是可变的。数组只可以存储相同类型的数据,集合中可以存储任意类型的对象。集合的分类:分别是单列集合和双列集合。单列集合称之为Collection单列集合,双列集合称之为map双列集合。Collection单列集合:单列集合根接口,用来存储一系列符合某种规则的元素。它有两个子接口,分别是list和setmap双列集合:双列集合类的根接口,用于存储键值对映射关系的元素,在使用Map集合时可以根据Key键找到对应的Value,主要的实现类有HashMap和TreeMap。01集合概念集合的继承体系下面通过一张图来描述整个集合类的继续体系,如下图所示:02Collection接口Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合,如下表所示。以上列举了4类方法,分别是增加方法,说明了如何给集合添加元素,删除方法,说明了如何删除元素,判断方法,说明了集合中是否包含某个元素的方法,查看方法,说明了查看元素的大小等方法。方法声明功能描述增加方法

add(Ee)添加成功返回true,添加失败返回false.addAll(Collectionc)把一个集合的元素添加到另外一个集合中去删除方法

clear()移除集合所有元素remove(Objecto)移除集合一个元素removeAll(Collectionc)移除集合中的c集合retainAll(Collectionc)只保留集合中的c集合查看

size()查看集合元素的个数判断方法

isEmpty()判断集合元素是否为空contains(Objecto)判断集合是否存在o对象containsAll(Collectionc)判断集合是否存在c集合02Collection接口1、List接口Collection接口的子接口,List接口中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素,它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素,与数组的索引是一个道理,它是一个元素存取有序的集合,即元素的存入顺序和取出顺序是一致。不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下表所示:方法声明功能描述增加方法

voidadd(intindex,Eelement)把E元素添加到集合的index处。booleanaddAll(intindex,Collectionc)把c集合中的元素添加到集合的index序号处,成功返回true,失败返回false获取方法

Objectget(intindex)返回集合index处的元素indexOf(Objecto)返回对象在List集合中出现的位置索引lastIndexOf(Objecto)返回对象在List集合中最后一次出现的位置索引

ListsubList(intfromIndex,inttoIndex)返回集合从fromIndex到toIndex处所有元素组成的子集合修改

set(intindex,Eelement)将索引index处元素替换成element对象,并将替换后的元素返回02Collection接口2、ArrayList集合ArrayList是List接口的一个实现类。实现原理:底层维护了一个Object[]用于存储对象,默认数组的长度是10,当默认的或者指定的容量不够存储对象的时候,容量自动增长为原来的容量的1.5倍。ArrayList进行数据存储时是通过底层数组实现的,数组的内存空间地址是连续的,所以数据查找快,在增和删的时候会牵扯到数组增容,以及数据拷贝,所以数据增加和删除慢。

案例:publicclassDemo1{

publicstaticvoidmain(String[]args){

//创建集合,因为Collection为抽象类,不能直接创建对象,所以创建Collection的子类ArrayList

ArrayListc1=newArrayList();

c1.add("宋江");//add方法,添加

c1.add("武松");

ArrayListc2=newArrayList();

c2.add("武松");

c2.add("石清");

c1.addAll(c2);//把c2的元素的添加到c集合中去。

c1.remove("李逵");

System.out.println("查看元素个数:"+c1.size());

System.out.println("集合的元素:"+c1);//打印出集合中所有的元素

System.out.println("第3个元素:"+c1.get(2));

c1.set(2,"鲁智深");

System.out.println("修改后的第3个元素:"+c1.get(2));

c1.clear();//clear()清空集合中的元素

System.out.println("查看元素个数:"+c1.size());

}}02

Collection接口3、LinkedList集合ArrayList是List接口的一个实现类。实现原理:底层采用链表实现,具有增加数据,删除数据快,查询数据慢的特点。由于LinkedList在内存中的地址不连续,需要让上一个元素记住下一个元素,所以每个元素中保存的有下一个元素的位置,虽然也有角标,但是查找的时候,需要从头往下找,显然是没有数组查找快的。但是链表在插入新元素的时候,只需要让前一个元素记住新元素,让新元素记住下一个元素就可以了,所以插入很快,链表在删除元素时,只需让前一个元素记住后一个元素,后一个元素记住前一个元素,这样的增删效率较高。

LinkedList集合除了具备增删元素效率高的特点,还专门针对元素的增删操作定义了一些特有的方法。如下表所示。方法声明功能描述voidaddFirst(Objecto)将指定元素插人此列表的开头voidaddLast(Objecto)将指定元素添加到此列表的结尾ObjectgetFirst()返回此列表的第一个元素ObjectgetLast()返回此列表的最后一个元素ObjectremoveFirst()移除并返回此列表的第一个元素ObjectremoveLast()移除并返回此列表的最后一个元素02

Collection接口案例:publicclassDemo2{publicstaticvoidmain(String[]args){LinkedListlst=newLinkedList();lst.add("zhansan");lst.add("lisi");lst.add(1,"wangwu");System.out.println(lst);lst.addFirst("zhouliu");System.out.println(lst);Objectfirst=lst.getFirst();System.out.println("第一个元素:"+first);Objectlast=lst.getLast();System.out.println("最后一个元素:"+last);Objectremove=lst.removeFirst();System.out.println("移除的元素第一个元素是:"+remove);System.out.println(lst);Objectremove1=lst.remove(2);System.out.println("移除的第二个元素是:"+remove1);System.out.println(lst);}}02

Collection接口4、Iterator迭代器为了方便的处理集合中的元素,jdk中出现了一个对象,该对象提供了一些方法专门处理集合中的元素。例如删除和获取集合中的元素,该对象就叫做迭代器(Iterator)。与集合的差别:list和map用于元素的存储,而迭代器主要用于元素的处理。获取迭代器的方法:但是该对象比较特殊,不能直接创建对象,该对象是以内部类的形式存在于每个集合类的内部。Collection接口中定义了获取集合类迭代器的方法(iterator()方法),所有的Collection体系集合都可以获取自身的迭代器。Collection接口通过iterator()方法可以获得迭代器,那么满足什么条件下的接口可以获得迭代器呢,实现了Iterable接口的对象就是可迭代的,并且支持增强for循环。Iterable接口,即称为可迭代接口,是Collection的父接口,该接口只有一个方法即获取迭代器的方法iterator(),接下来,我们来看一下迭代器(Iterator)常用的方法,如下表所示:方法声明功能描述booleanhasNext()如果仍有元素可以迭代,则返回true。next()返回迭代的下一个元素。remove()从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。02

Collection接口案例:publicclassDemo3{publicstaticvoidmain(String[]args){ArrayListlst=newArrayList();lst.add("宋江");//add方法,添加

lst.add("吴用");lst.add("武松");lst.add("武松");lst.add("李逵");lst.add("石清");Iteratoriterator=lst.iterator();//根据iterator()方法获得自身的迭代器

while(iterator.hasNext()){//采用hasNext()方法判断集合中是否有下一个元素,如果存在返回真,否则为假

Objectobj=iterator.next();//返回迭代的下一个元素

System.out.println(obj);}}}02

Collection接口5、Set接口Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,数据存储元素是无序的,并且都会以某种规则保证存入的元素不可重复。主要的两个实现类:分别是HashSet和TreeSet。HashSet:是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。TreeSet:是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。02

Collection接口6、HashSet集合hashSet是实现了Set接口的子类,HashSet存储元素的顺序并不是按照存入时的顺序,而是按照哈希值来存的,获取数据也是按照哈希值取得。由于Set集合是不能存入重复元素的集合。那么HashSet也是具备这一特性的,即不存入重复元素。实现原理:HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。由于任何对象都是Object类的子类,所以任何对象有拥有这个方法。即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。02

Collection接口案例:publicclassDemo4{publicstaticvoidmain(String[]args){HashSethashSet=newHashSet();hashSet.add("张三");hashSet.add("李四");hashSet.add("王五");hashSet.add("张三");Iteratoriterator=hashSet.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}从运行结果中,可以看出取出元素与添加元素的顺序不一致。而且重复添加的“张三”元素被去除了,只出现了一次。

HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作.当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true否则说明有重复元素,就将该元素舍弃。02

Collection接口7、TreeSet集合TreeSet是Set接口的另一个实现类,它内部采用自平衡的排序二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以对元素进行排序。二叉树原理:所谓二叉树就是说每个节点最多有两个子节点的有序树,每个节点及其子节点组成的树称为子树,通常左侧的子节点称为“左子树”,右侧的子节点称为“右子树”。之后存入的元素与第一个元素比较,如果小于第一个元素就将该元素放在左子树上,如果大于第1个元素,就将该元素放在右子树上,案例如下:publicclassDemo5{publicstaticvoidmain(String[]args){TreeSettreeSet=newTreeSet();treeSet.add(18);treeSet.add(23);treeSet.add(10);treeSet.add(15);treeSet.add(25);treeSet.add(19);Iteratoriterator=treeSet.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}03

泛型1、泛型集合如果想让集合和数组一样,在集合中只能存放一种数据类型对象,为了解决这个问题,在Java中引人了“参数化类型(parameterizedtype)”这个概念,即泛型。它可以限定集合操作的数据类型,在定义集合类时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型,具体格式如下:集合类<数据类型>变量=new集合类<数据类型>();ArrayList<String>arrayList=newArrayList<String>();案例:publicclassDemo6{publicstaticvoidmain(String[]args){//1.创建一个泛型集合,确定集合中只能存储字符串数据类型的对象

ArrayList<String>lst=newArrayList<String>();lst.add("宋江");//只能添加字符串类型的数据,否则会出现编译错误

lst.add("吴用");lst.add("武松");lst.add("武松");lst.add("李逵");lst.add("石清");//产生一个泛型的迭代器

Iterator<String>iterator=lst.iterator();while(iterator.hasNext()){Stringitem=iterator.next();//直接取出一个字符串类型的元素

System.out.println(item);}}}03

泛型2、自定义泛型自定义泛型就是一个数据类型的占位符或者说是一个数据类型的变量。自定义泛型声明方法:自定义泛型通常采用<T>声明参数类型,T其实就是Type的缩写,这里也可以使用其他字符.为了方便理解都定义为T。如果我们采用自定义泛型,定义泛型方法的形式是:

<T>T方法名(Tt)其中<T>:用于声明T是一个数据类型自定义泛型使用场合:因为在程序设计过程中,经常遇到一些特殊要求,所以经常运用自定义泛型技术,比如自定义泛型会运用到泛型方法、泛型类和泛型接口等场合。03

泛型3、泛型类那么在类中使用了自定义泛型的类,就是泛型类。泛型类的格式:定义格式:修饰符class类名<代表泛型的变量>{…….}使用格式:创建对象时,确定泛型的类型案例:classPoint<T>{//此处可以随便写标识符号

privateTx;privateTy;publicvoidsetX(Tx){//作为参数

this.x=x;}publicvoidsetY(Ty){this.y=y;}publicTgetX(){//作为返回值

returnthis.x;}publicTgetY(){returnthis.y;}}publicclassDemo7{publicstaticvoidmain(String[]args){//2.使用泛型类创建对象时,泛型类中的占位符T必须要用真实的数据类型代替。

Point<Integer>p1=newPoint<Integer>();p1.setX(10);p1.setY(20);System.out.println("整数点X坐标是:"+p1.getX()+"整数点Y坐标是:"+p1.getY());Point<Float>p2=newPoint<Float>();p2.setX(10.1f);p2.setY(20.2f);System.out.println("浮点数点X坐标是:"+p1.getX()+"浮点数点Y坐标是:"+p1.getY());}}03

泛型4、泛型接口使用了自定义泛型的接口就是泛型接口.泛型接口的格式:定义格式:修饰符interface接口名<代表泛型的变量>{…….}使用格式:创建对象时,确定泛型的类型案例:interfaceTools<T>{voidprint(Tt1,Tt2);}classMyTools<T>implementsTools<T>{@Overridepublicvoidprint(Tt1,Tt2){System.out.println(t1.toString());System.out.println(t2.toString());}}classInfo{Stringname;Stringdesp;publicInfo(Stringname,Stringdesp){=name;this.desp=desp;}@OverridepublicStringtoString(){return"Info{"+"name='"+name+'\''+",desp='"+desp+'\''+'}';}}publicclassDemo7_2{publicstaticvoidmain(String[]args){MyTools<Info>myTools=newMyTools<Info>();myTools.print(newInfo("清华大学","中国排名前2名"),newInfo("北京大学","中国排名前2名"));}}03

泛型注意:泛型接口定义之后,必须要创建实现了接口的类,才能创建对象。创建实现了接口的类,有2种实现方法,本例中采用一种实现泛型接口的方式,还有另外一种实现泛型接口的方式,代码如下:classMyTools2implementsTools<String>{@Overridepublicvoidprint(Stringt1,Stringt2){}}第二种方式与第一种方式比较:第一种方式依旧采用了占位符的实现类,第二种采用了确定的数据类型的实现类。那么在实际应用中,根据具体情况灵活采用不同的实现方式。03

泛型5、

泛型方法:使用了自定义泛型的方法就是泛型方法。泛型方法格式:定义格式:修饰符<代表泛型的变量>返回值类型方法名(参数){}使用格式:调用方法时,确定泛型的类型案例:classDog{Stringname;intage;publicDog(Stringname,intage){=name;this.age=age;}@OverridepublicStringtoString(){return"Dog{"+"name='"+name+'\''+",age="+age+'}';}}classCat{Stringname;intage;publicCat(Stringname,intage){=name;this.age=age;}@OverridepublicStringtoString(){return"Cat{"+"name='"+name+'\''+",age="+age+'}';}}03

泛型案例继续:publicclassDemo8{publicstaticvoidmain(String[]args){ArrayList<Dog>lst1=newArrayList<Dog>();ArrayList<Cat>lst2=newArrayList<Cat>();add(lst1,newDog("小狗",2));add(lst1,newDog("小黄狗",3));add(lst2,newCat("小猫",1));add(lst2,newCat("小黑猫",1));print(lst1);print(lst2);}publicstatic<T>voidadd(ArrayList<T>lst,Tt){lst.add(t);}publicstatic<T>voidprint(ArrayList<T>lst){System.out.println(lst);}}

05

泛型泛型上下限如果现在我们需要对数据类型进行限制,比如只有Interger及其父类的数据类型可以接受,

温馨提示

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

评论

0/150

提交评论