《跨平台程序设计语言》课件-第8章 泛型与集合_第1页
《跨平台程序设计语言》课件-第8章 泛型与集合_第2页
《跨平台程序设计语言》课件-第8章 泛型与集合_第3页
《跨平台程序设计语言》课件-第8章 泛型与集合_第4页
《跨平台程序设计语言》课件-第8章 泛型与集合_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

第8章泛型与集合1.1泛型介绍泛型:什么是泛型Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。泛型类泛型类就是把泛型定义在类上。定义格式:定义泛型类,在类名后添加一对尖括号,并在尖括号中填写类型参数,参数可以有多个,多个参数使用逗号分隔。publicclass类名<T,...>{

}泛型类例如:示例中,定义了3个泛型参数(ab,a,c),当然,这个后面的参数类型也是有规范的,不能像上面一样随意,通常类型参数我们都使用大写的单个字母表示:publicclassGenericClass<ab,a,c>{}T:任意类型typeE:集合中元素的类型elementK:key-value形式keyV:key-value形式value泛型类使用泛型类:1.泛型类型必须是引用类型(非基本数据类型),后面课程会详细介绍。2.使用泛型的时候,前后定义的泛型类型必须保持一致,否则会出现编译异常类名称<数据类型>对象名称=new类名称<数据类型>();泛型类练习:编写数组帮助类,实现动态数组功能(追加元素、获取长度、根据索引获取元素等)泛型类练习:编写数组帮助类,实现动态数组功能(追加元素、获取长度、根据索引获取元素等)泛型方法泛型方法,是在调用方法的时候指明泛型的具体类型。定义格式:与泛型类类似,只是方法声明中定义的形参只能在该方法里使用,而接口、类声明中定义的类型形参则可以在整个接口、类中使用。若类和方法使用同一个标记符,则方法的标记符会覆盖类的标记符。修饰符<代表泛型的变量>返回值类型方法名(参数){//方法体}泛型方法使用泛型方法:在调用泛型方法的时候,可以指定泛型,也可以不指定泛型。在不指定泛型的情况下,泛型变量的类型为该方法中的几种类型的同一个父类的最小级,直到Object。在指定泛型的时候,该方法中的几种类型必须是该泛型实例类型或者其子类。定义格式://调用格式<指定的类型>泛型方法(实参列表);泛型方法练习:编写泛型方法,实现打印数组元素值泛型方法练习:编写泛型方法,实现打印数组元素值测试程序第8章泛型与集合1.2包装类为什么使用泛型泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。保证了类型的安全性。消除强制转换。避免了不必要的装箱、拆箱操作,提高程序的性能。提高了代码的重用性使用泛型的约束和限制1.不能使用基本数据类型实例化类型参数。Java泛型中的类型参数不能是基本类型,只能是类或接口类型。例如,以下代码在编译阶段会出错,无法通过编译:正确的写法是使用基本类型对应的包装类型,如下所示:List<long>arrs=newArrayList<long>();List<Long>arrs=newArrayList<Long>();使用泛型的约束和限制2.无法在运行时获取泛型类型信息。由于泛型擦除的存在,导致我们在程序运行时无法获取泛型类型的信息。例如,以下代码在运行时就无法获取List的元素类型:所谓的泛型擦除(TypeErasure),就是指在编译时,JVM编译器会将所有的泛型信息都擦除掉,变成原始类型,一般是将泛型的类型参数替换成具体类型的上限或下限(如果没有指定上界,则默认为Object)。List<String>arrs=newArrayList<String>();System.out.println(arrs.getClass()); //输出的是classjava.util.ArrayList使用泛型的约束和限制3.不能创建参数化类型的数组(泛型数组)。例如,以下代码是错误的写法:MyPrint<String>pairs[]=newMyPrint<String>[10];//错误4.不能实例化类型变量T。不能使用像newT(...)、newT[...]或者T.class这样的表达式。例如,下面T的构造方法是非法:Tt=newT();//错误使用泛型的约束和限制5.泛型类的静态上下文中类型变量无效。静态变量不能定义泛型类型,静态方法的返回类型不能定义为泛型类型。例如,下面的写法是错误的:publicclassInterval<T>{privatestaticTsingleInstance; //错误,静态变量的类型不能为泛型类型publicstaticTgetSingleInstance() //错误,静态方法的返回类型为泛型类型。{ returnsingleInstance;}}包装类Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(WrapperClass),包装类均位于java.lang包。而且,如果只有基本数据类型,使用时是很不方便的,比如,在集合类中,无法将int、double等类型放进去的,因为集合的容器要求元素是Object类型。此外,包装类还为基本类型添加了属性和方法,丰富了基本类型的操作。如当我们想知道int取值范围的最小值,我们需要通过运算,但是有了包装类,我们可以直接使用Integer.MAX_VALUE即可。包装类总结:除了int(包装类为Integer)和char(包装类为Character)外,其他数据类型的包装类型都是自己的首字母大写,所有记忆起来会比较容易。各数据类型对应的包装类:第8章泛型与集合2.1集合基本概念什么是集合集合:为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。Java所有的集合类都位于java.util包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类和操作它们的算法。Java集合框架Java集合框架主要包括两种类型的容器一种是集合(Collection),存储一个元素集合。另一种是图(Map),存储键/值对映射。集合特点接口名称作用Collection接口是List、Set和Queue的父接口,是存放一组单值的最大接口。所谓的单值是指集合中的每个元素都是一个对象。一般很少直接使用此接口直接操作。List接口是最常用的接口。是有序集合,允许有相同的元素。使用List能够精确地控制每个元素插入的位置,用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,与数组类似。Set接口不能包含重复的元素。Map接口是存放一对值的最大接口,即接口中的每个元素都是一对,以key➡value的形式保存。Java集合接口集合特点类名称作用HashSet为优化査询速度而设计的Set。它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,实现比较简单TreeSet实现了Set接口,是一个有序的Set,这样就能从Set里面提取一个有序序列ArrayList一个用数组实现的List,能进行快速的随机访问,效率高而且实现了可变大小的数组LinkedList对顺序访问进行了优化,但随机访问的速度相对较慢。此外它还有addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()等方法,能把它当成栈(Stack)或队列(Queue)来用HsahMap按哈希算法来存取键对象TreeMap可以对键对象进行排序Java集合实现类集合与数组的区别数组可以储存基本数据类型和对象,而集合中只能储存对象(可以以包装类形式存储基本数据类型)。数组的长度是固定的,集合长度是可以改变的。定义数组时必须指定数组元素类型,集合默认其中所有元素都是Object。无法直接获取数组实际存储的元素个数,length用来获取数组的长度,但可以通过size()直接获取集合实际存储的元素个数。集合有多种实现方式和不同的适用场合,而不像数组仅采用分配连续的空间方式。集合以接口和类的形式存在,具有封装,继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂的操作,大大提高软件的开发效率。为什么需要集合假设要统计公司的年利润,会怎么计算存储这些利润数据呢?方案一:以变量的形式储存数据量少的话,是没问题的。但如果数据多了起来,程序及不美观,也不便于计算,这很明显是不是一个明智的选择。为什么需要集合而利润的数据是在不断增长变化的。在Java教程中我们知道,要统计的数据量是不可能固定不变的,所以我们需要一个拥有可变长度的容器来储存。假设要统计公司的年利润,会怎么计算存储这些利润数据呢?方案二:以数组的形式储存这也是行不通的,因为数组有个致命的特点,那就是创建时需要指定其长度,并且在使用时长度不可改变。为什么需要集合在接下来集合的使用中,会发现集合也不用像数组需要看着下标来存储数据,直接调用add方法,就可以实现数据的存储。假设要统计公司的年利润,会怎么计算存储这些利润数据呢?方案三:以集合的形式储存集合里有各种各样的容器,而且每个容器的长度都是可变的,若是空间不够了,也会自行调节。第8章泛型与集合2.2List集合List集合介绍List集合:在Java中,List集合是一种常用的数据结构,用于存储一组有序、可重复的元素。它是Java集合框架中的一部分,位于java.util包下。List集合介绍List集合特点:可重复性:List允许存储相同的元素多次。也就是说,可以在List中添加重复的元素,并且它们可以保持各自的位置和顺序。有序性:List中的元素按照它们被添加的顺序进行存储,并且可以通过索引访问每个元素。这意味着当我们遍历List时,元素的顺序与它们添加的顺序相同。List集合介绍常见的List实现类:List中主要有ArrayList、LinkedList两个实现类。ArrayList类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。List集合介绍ArrayList和LinkedList的区别:ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。List集合介绍方法名说明publicbooleanadd(要添加的元素)将指定的元素追加到此集合的末尾publicbooleanremove(要删除的元素)删除指定元素,返回值表示是否删除成功publicEremove(intindex)删除指定索引处的元素,返回被删除的元素publicEset(intindex,Eelement)修改指定索引处的元素,返回被修改的元素publicEget(intindex)返回指定索引处的元素publicintsize()返回集合中的元素的个数booleancontains(Objecto)如果此列表包含指定的元素,则返回truebooleanaddAll(intindex,Collection<?extendsE>c)将指定集合中的所有元素插入到此列表中,从指定的位置开始voidclear()列表中删除所有元素ArrayList和LinkedList通用方法:List集合练习随机数:第8章泛型与集合2.3Set集合Set集合介绍Set集合:Set是Java的一种集合,继承自Collection接口。它没有固定的大小限制,可以动态地添加和删除元素。Set集合中的元素都是唯一的,不会有重复的元素,即使是null值也只能有一个。Set集合介绍Set集合特点:Set集合中的元素都是唯一的,不允许有重复值,且最多只允许包含一个null元素;Set集合中的元素没有顺序,无法通过索引来访问元素,但TreeSet是有序的;Set集合没有固定的大小限制,可以动态地添加和删除元素;Set集合提供了高效的元素查找和判断方法。Set集合介绍常见的Set实现类:Set中主要有HashSet、TreeSet两个实现类。HashSet是一个无序的集合,它的作用是提供无序的不允许有重复元素的Set集合。HashSet允许有null值;TreeSet是一个有序的集合,它的作用是提供有序的不允许有重复元素的Set集合。TreeSet不允许有null值;Set集合介绍HashSet和TreeSet的区别:HashSet是一个无序的集合,基于HashMap实现;TreeSet是一个有序的集合,基于TreeMap实现。HashSet集合中允许有null元素,TreeSet集合中不允许有null元素。HashSet和TreeSet都是非同步!在使用Iterator进行迭代的时候要注意fail-fast。Set集合介绍HashSet和TreeSet通用方法:方法名说明add​(Ee)如果指定的元素尚不存在,则将其添加到此集合(可选操作)。clear()从该集合中删除所有元素(可选操作)。contains​(Objecto)如果此set包含指定的元素,则返回true。containsAll​(Collection<?>c)如果此集合包含指定集合的所有元素,则返回true。isEmpty()如果此集合不包含任何元素,则返回true。iterator()返回此set中元素的迭代器。remove​(Objecto)如果存在,则从该集合中移除指定的元素(可选操作)。size()返回此集合中的元素数(基数)。toArray()返回包含此set中所有元素的数组。Set集合练习QQ号去重:第8章泛型与集合2.4Map集合Map集合介绍Map是一种键-值对(key-value)集合,Map集合中的每一个元素都包含一个键(key)对象和一个值(value)对象。用于保存具有映射关系的数据。Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复,value可以重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。Map中的key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的、确定的value。从Map中取出数据时,只要给出指定的key,就可以取出对应的value。Map集合:Map集合介绍Map集合特点:Map是一个双列集合,一个元素包含两个值(一个key,一个value)Map集合中的元素,key和value的数据类型可以相同,也可以不同Map中的元素,key不允许重复,value可以重复Map里的key和value是一一对应的。Map集合介绍常见的Map实现类:TreeMap是Java中的一种有序键值对集合,它基于红黑树实现,可以保证元素按照键的顺序进行排序。TreeMap允许null值但不允许null键。Map中主要有HashMap、TreeMap两个实现类。HashMap是Java中的一种键值对集合,它允许存储不重复的键和对应的值,使用哈希表(数组+链表/红黑树)实现。HashMap中的键和值都可以为null。Map集合介绍HashMap和TreeMap的区别:HashMap是无序的,TreeMap是有序的HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.当push的数量达到100w的时候,TreeMap的效率比HashMap的效率就低了,也就是随着容量的增大,TreeMap的效率降低速度比HashMap的效率降低速度要快。小容量使用TreeMap,大容量(100w级)使用HashMap。。Map集合介绍方法名称说明voidclear()删除该Map对象中的所有key-value对。booleancontainsKey(Objectkey)查询Map中是否包含指定的key,如果包含则返回true。booleancontainsValue(Objectvalue)查询Map中是否包含一个或多个value,如果包含则返回true。Vget(Objectkey)返回Map集合中指定键对象所对应的值。V表示值的数据类型Vput(Kkey,Vvalue)向Map集合中添加键

温馨提示

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

评论

0/150

提交评论