版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章集合课程内容Java集合简介Collection接口List接口Set接口Map接口Collection接口和Collections类Java中的泛型Java集合简介Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述一组不同数据类型。Collection接口是一组允许重复的对象。Set接口继承Collection,但不允许重复,使用自己内部的一个排列机制。List接口继承Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。Map接口是一组成对的键-值对象,即所持有的是key-value
pairs。Map中不能有重复的key。拥有自己的内部排列机制。参考代码:Demo01.javaCollection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection是List和Set接口的父接口。AbstractCollection抽象类Collection接口的iterator()方法返回一个Iterator。Iterator接口方法能以迭代方式逐个访问集合中各个元素,Iterator要依赖Collection或其实现类。参考代码:Demo02-03.javaList接口List接口继承了Collection接口,从而用来定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置(索引)的操作。ArrayList和LinkedListListIteratorVector和ArrayListQueue接口参考代码:Demo04-06.javaList接口LinkedList类和ArrayList类在“集合框架”中有两种常规的List实现:ArrayList和LinkedList。使用两种List实现的哪一种取决于您特定的需要。如果要支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList提供了可选的集合。但如果,您要频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素,那么,LinkedList实现更好。List接口ListIteratorListIterator接口继承Iterator接口以支持添加或更改底层集合中的元素,还支持双向访问。ListIterator没有当前位置,光标位于调用previous和next方法返回的值之间。一个长度为n的列表,有n+1个有效索引值:Vector和ArrayListArrayList和Vector作为List接口的两个典型实现,完全支持
List接口的全部功能。它们都是基于对象数组实现的List类,所以ArrayList和Vector类封装了一个动态再分配的Object[]数组。Vector是JDK1.0时API中就有,其中很多方法和List重复。最主要的一个特点就是Vector是线程安全的,而ArrayList是线程不安全的,所以ArrayList的效率要高一些。Set接口Set接口继承Collection接口,而且它不允许集合中存在重复项,每个具体的Set实现类依赖添加的对象的equals()方法来检查独一性。Set接口没有引入新方法,所以Set就是一个Collection,只不过其行为不同Set里不能存放重复的元素。是依据对象的hashCode码,然后用equals()方法对比,看两个对象是否是重复。参照:/ch05/SetDemo1.ajva
~SetDemo3.javaSet接口Hash表Hash表是一种数据结构,用来查找对象。Hash表为每个对象计算出一个整数,称为HashCode(哈希码)。Hash表是个链接式列表的阵列。每个列表称为一个buckets(哈希表元)。对象位置的计算 index
=HashCode
%
buckets
(HashCode为对象哈希码,buckets为哈希表元总数)。当你添加元素时,有时你会遇到已经填充了元素的哈希表元,这种情况称为HashCollisions(哈希冲突)。这时,你必须判断该元素是否已经存在于该哈希表中。如果哈希码是合理地随机分布的,并且哈希表元的数量足够大,那么哈希冲突的数量就会减少。同时,你也可以通过设定一个初始的哈希表元数量来更好地控制哈希表的运行。初始哈希表元的数量为
buckets=size
*
150%+1(size为预期元素的数量)。如果哈希表中的元素放得太满,就必须进行rehashing(再哈希)。再哈希使哈希表元数增倍,并将原有的对象重新导入新的哈希表元中,而原始的哈希表元被删除。load
factor(加载因子)决定何时要对哈希表进行再哈希。在Java编程语言中,加载因子默认值为0.75,默认哈希表元为101。Set接口Comparable接口和Comparator接口在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer等Java内建类实现Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过Comparator接口来定义您自己的比较方式。还记得Arrays这个类吗?我们可以对一个对象数组排序,但存放到这个对象数组中的对象一定要实现Comparable接口或在sort方法上指定个
Comparator接口。与此类似,我们要对集合中的元素排序,也要实现这两个比较器接口。Set接口HashSet类“集合框架”支持Set接口两种普通的实现:HashSet和TreeSet(TreeSet实现SortedSet接口)。在更多情况下,您会使用HashSet存储无重复自由的集合。考虑到效率,添加到
HashSet的对象需要采用恰当分配哈希码的方式来实现
hashCode()方法。虽然大多数系统类覆盖了Object中缺省的
hashCode()和equals()实现,但创建您自己的要添加到
HashSet的类时,别忘了覆盖hashCode()和equals()。Set接口SortedSet接口一个特殊的Set接口:SortedSet,它保持元素的有序顺序。
添加到SortedSet实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeSet类是它的唯一一份实现。(1)
Comparator
comparator():返回对元素进行排序时使用的比较器,如果使用
Comparable接口的compareTo()方法对元素进行比较,则返回null(2)
Object
first():返回有序集合中第一个(最低)元素(3)Object
last():返回有序集合中最后一个(最高)元素(4)SortedSetsubSet(ObjectfromElement,ObjecttoElement):返回从fromElement(包括)至toElement(不包括)范围内元素的SortedSet视图(子集)(5)SortedSetheadSet(ObjecttoElement):返回SortedSet的一个视图,其内各元素皆小于toElement(6)SortedSettailSet(ObjectfromElement):返回SortedSet的一个视图,其内各元素皆大于或等于fromElementSortedSet接口一般我们不直接使用,如果我们想要一个有序的Set,我们可以用它的实现类
TreeSet。参照:/ch05/TreeSetDemo1.java/ch05/TreeSetDemo2.javaMap接口Map接口不是Collection接口的继承。Map接口用于维护键/值对(key/valuepairs)。该接口描述了从不重复的键到值的映射。key不允许重复,而value可以重复。Map接口HashMap和Hashtable类都是Map接口的典型实现.Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的的实现。Hashtable不允许将null做为key或value,但HashMap允许参照:/ch05/MapDemo1.java/ch05/MapDemo2.javaMap接口SortedMap接口和TreeMap实现类SortedMap是Map派生的子接口之一,SortedMap有一个实现类
TreeMap.TreeMap是一个有序的Map现实。自然序:TreeMap中的所有key必须实现Comparable接口,所有
key的类型要一致。定制序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有key进行排序。采用定制排序时不要求Map的key实现Comparable接口。参照:/ch05/MapDemo3.java/ch05/MapDemo4.javaMap接口Properties类Properties类是Hashtable类的子类,其实它是关联属性文件和Map的一种封装。Properties类中的key和value都是String类型,换句话说:
Properties是key和value都为String的一个Map.参照:/ch05/Properties1.java/ch05/Properties2.javaCollection接口和Collections类Collection是个java.util下的接口,它是各种集合结构的父接口。Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。Collection层次结构中的根接口。Collections此类提供操作Set、List、Map等集合的工具类。Collections提供大量的方法对集合元素排序、查找和修改等操作,还提供了将集合对象实现同步控制的方法。参照:/ch05/TestSort.javaJava中的泛型JDK1.5以后,Java引入了“参数化类型(parameteriqedtype)”的概念,允许我们在创建集合时指定集合元素的类型。泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全、简单。在JavaSE1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。Java中的泛型泛型在使用中还有一些规则和限制:•1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。3、泛型的参数类型可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T
extendssuperclass>。习惯上成为“有界类型”。5、泛型的参数类型还可以是通配符类型。例如Class<?>
classType=Class.forName(
java.lang.String);参照:/ch05/泛型/GenDemo.java/ch05/泛型/GenDemo2.javaJava中的泛型所谓泛型,就是允许在定义类、接口时指定类型参数,这个参数类型将在声明变量、创建对象时确定(即传
入实际的类型参数,也可称为类型实参)。JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量,创建集合对象时传入类型实参。Java中的泛型在Java语言中,我们可以将某种类型的变量赋值给其父类型所对应的变量,例如,String是Object的子类型,因此,我们可以将String类型的变量赋值给Object类型的变量,甚至可以将String[]类型的变量(数组)赋值给Object[]类型的变量,即String[]是
Object[]的子类型。对于泛型来讲,上述情形有所变化List<String>不是List<Object>的子类1、同一个类的参数不同,但具有相同的行为,从而可以把相同的类当成许多不同的类来处理。2、类的静态方法和静态变量在实例间共享,这与1是相同的,所以静态初始化或静态变量声明和初始化中不允许使用类型形参。class
Cup<T>{static
T
info;//这一句是错误的public
static
setInfo(T
ss){};//这一句也是错误的}参照:/ch05/泛型/NotType.java3、当创建带泛型声明的接口、父类之后,可以为访问接口创建实现类,或从该父类来派生子类。但当使用这些接口、父类时不能再包含类型形参。参照:/ch09/SubClassType.java4、String是Object的子类,而List<String>不可以看成是List<Object>的子类。参照:/ch05/泛型/NotSubClass.javaJava中的泛型通配符为了表示各种泛型的父类,我们需要使用类型通配符,类型通配符是一个问号(?),将?作为类型实参传给泛型类。public
void
getInfo(List<?>
c){for(int
i=0;i<c.size();i++)System.out.println(c.get(i));}Java中的泛型设定类型通配符的上限public
void
counter(List<?>
computers){for(Object
puters)System.out.println((LapTop)obj);}List<LapTop>不是List<Computers>的子类但我们可以用List<?>表List<LapTop>的父类当然我们也可以写成:public
void
counter(List<?
extends
Computers>
computers){for(Object
puters)System.out.println((LapTop)obj);}设定类型形参的上限public
class
A<TextendsNumber>{public
static
void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 热量 比热容课件2026-2027学年初中物理人教版(2024)九年级全一册
- 2026专利流程面试题目及答案
- 2026年一建水利防渗帷幕施工测试试卷(含答案及解析)
- 2026年一建民航实务考前考点梳理通关试卷及答案
- 2026创编故事面试题及答案
- 2026年一建经济考前终极模拟卷试卷及答案
- 2026东莞集团面试题目及答案
- 2026公路行业面试题及答案
- 信号与系统(第6版)全套课件 陈晓龙 第1-8章 信号与系统的基本概念-系统的状态空间分析
- 2026交付专员面试题目及答案
- 2026国考公务员行测真题试卷及答案(回忆版)
- 2025北师大二附高一数学分班考试真题含答案
- 2026年文物保护工程从业资格考试(责任工程师近现代重要史迹及代表性建筑)经典试题及答案
- 雨课堂学堂在线学堂云《人工智能安全与伦理(北京航空航天)》单元测试考核答案
- 新能源项目典型案件争议解决实务-笔记
- 实习协议书模板设计
- 新人教版七年级上册英语全册课件(2024年新版教材)
- 2022年全国职业院校技能大赛赛项-ZZ-2022002农机维修赛项正式赛卷-植保无人机维修评分标准
- 呼吸道感染的抗病毒药物合理应用
- GB 40161-2021过滤机安全要求
- 北师大版七年级上册数学课件第五章 一元一次方程
评论
0/150
提交评论