




已阅读5页,还剩101页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第五章Java高级特征 静态变量 方法与初始化程序块final关键字抽象类Interfacepackage其它 2 Static关键字 Static关键字可用来修饰类的变量 方法和内部类Static是静态的意思 也是全局的意思 它定义的东西属于全局和类相关 不与具体实例相关 也就是说它调用的时候 只是通过类名直接调用方法 ClassName method 而不是创建一个对象 再通过对象名调用方法 newClassName method 一定要注意Static的变量 方法不可以通过对象来调用的 他与具体的实例无关 3 类变量 static classvariable 在该类所有实例之间是共享的 在加载该类时 只分配一次空间 并初始化 例 classEmployee staticintcom 则运行时 4 类变量 static classvariable 类变量可用来在实例之间进行通信或跟踪该类实例的数目 例 publicclassCount privateintserialNumber privatestaticintcounter 0 publicCount counter serialNumber counter 具体实例 见教材P118例5 1 5 类变量可以是public或private对于public类型的类变量 可以在类外直接用类名调用而不需要初始化 publicclassStaticVar publicstaticintnumber publicclassOtherclass publicvoidmethod intx StaticVar number 类变量 static classvariable 6 类 class static 方法 可以直接被调用 而不需要生成任何实例publicclassGeneralFunction publicstaticintaddUp intx inty returnx y publiccalssUseGeneral publicvoidmethod intc GeneralFunction addUp 9 10 7 类 class static 方法 续 静态方法可以直接通过类名调用 静态方法中不能用this和super关键字 不能直接访问所属类的实例变量和实例方法 只能访问所属类的静态成员变量和成员方法以及方法体内定义的局部变量 自己的参数和静态变量因为static方法独立于任何实例 因此static方法必须被实现 而不能是抽象的abstract 8 子类不能重写父类的静态方法 但可以声明与父类静态方法相同的方法从而将父类的静态方法隐藏 另外子类不能把父类的非静态方法重写为静态的 见教材P120示例main 方法是个静态方法 在该方法中访问所在类的成员变量和方法 必须创建相应的实例对象 否则会出现编译错误 见教材P121示例 类 class static 方法 续 9 static代码块 static代码块也叫静态代码块 是在类中独立于类成员的static语句块 可以有多个位置可以随便放它不在任何的方法体内JVM加载类时会执行这些静态的代码块 如果static代码块有多个 JVM将按照它们在类中出现的先后顺序依次执行它们 每个代码块只会被执行一次 例如 10 publicclassTest5 privatestaticinta privateintb static Test5 a 3 System out println a Test5t newTest5 t f t b 1000 System out println t b static Test5 a 4 System out println a publicstaticvoidmain String args static Test5 a 5 System out println a publicvoidf System out println hhahhahah 11 final关键字 根据程序上下文环境 Java关键字final有 这是无法改变的 或者 终态的 含义 它可以修饰非抽象类 非抽象类成员方法 非抽象类成员变量 12 final关键字 续 在类的声明中可以使用final例 finalclassEmployee classManagerextendsEmployee final类不能被继承 因此final类的成员方法没有机会被覆盖 默认都是final的 在设计类时候 如果这个类不需要有子类 类的实现细节不允许改变 并且确信这个类不会被扩展 那么就设计为final类 13 final关键字 续 在类的成员方法中可以使用final 该方法不能被重写 如果一个类不允许其子类覆盖某个方法 则可以把这个方法声明为final方法 为什么使用final方法 把方法锁定 防止任何继承类修改它的意义和实现 高效 编译器在遇到调用final方法时候会转入内嵌机制 大大提高执行效率 例如 14 publicclassTest1 publicvoidf1 System out println f1 无法被子类覆盖的方法publicfinalvoidf2 System out println f2 publicvoidf3 System out println f3 privatevoidf4 System out println f4 publicclassTest2extendsTest1 publicvoidf1 System out println Test1父类方法f1被覆盖 publicstaticvoidmain String args Test2t newTest2 t f1 t f2 调用从父类继承过来的final方法t f3 调用从父类继承过来的方法 t f4 调用失败 无法从父类继承获得 15 final关键字 续 在类的成员变量中可以使用final 该变量实际上是常量 一般大写 并赋值但不能改变 finalintNUMBER 100 final修饰的变量有三种静态变量实例变量局部变量另外 final变量定义的时候 可以先声明 而不给初值 这中变量也称为final空白 无论什么情况 编译器都确保空白final在使用之前必须被初始化 但是 final空白在final关键字final的使用上提供了更大的灵活性 为此 一个类中的final数据成员就可以实现依对象而有所不同 却有保持其恒定不变的特征 16 packageorg leizhimin publicclassTest3 privatefinalStringS final实例变量S privatefinalintA 100 publicfinalintB 90 publicstaticfinalintC 80 privatestaticfinalintD 70 publicfinalintE final空白 必须在初始化对象的时候赋初值publicTest3 intx E x publicstaticvoidmain String args Test3t newTest3 2 t A 101 出错 final变量的值一旦给定就无法改变 t B 91 出错 final变量的值一旦给定就无法改变 t C 81 出错 final变量的值一旦给定就无法改变 t D 71 出错 final变量的值一旦给定就无法改变System out println t A System out println t B System out println t C 不推荐用对象方式访问静态字段System out println t D 不推荐用对象方式访问静态字段 System out println Test3 C System out println Test3 D System out println Test3 E 出错 因为E为final空白 依据不同对象值有所不同 System out println t E Test3t1 newTest3 3 System out println t1 E final空白变量E依据对象的不同而不同 privatevoidtest System out println newTest3 1 A System out println Test3 C System out println Test3 D publicvoidtest2 finalinta final空白 在需要的时候才赋值finalintb 4 局部常量 final用于局部变量的情形finalintc final空白 一直没有给赋值 a 3 a 4 出错 已经给赋过值了 b 2 出错 已经给赋过值了 17 final关键字 续 final参数当函数参数为final类型时 你可以读取使用该参数 但是无法改变该参数的值 publicclassTest4 publicstaticvoidmain String args newTest4 f1 2 publicvoidf1 finalinti i i是final类型的 值不允许改变的 System out print i 18 抽象类 什么是抽象类 一个类如果只声明方法而没有方法的实现 则称为抽象类 必须在类声明中增加abstract关键字 在无方法体的方法前也要加上abstract publicabstractclassDrawing publicabstractvoiddrawDot intx inty publicvoiddrawLine intx1 inty1 intx2 inty2 调用drawDot 方法 19 抽象类 续 为什么要使用抽象类 程序中定义抽象类的目的是为一类对象建立抽象的模型 在同类对象所对应的类体系中 抽象类往往在顶层 这一方面使类的设计变得清晰 另一方面抽象类也为类的体系提供通用的接口定义抽象类和抽象方法可以向用户和编译器明确表明该类的作用和用法 使类体系设计更加清晰 并能够支持多态 20 例如 21 抽象类 对抽象类 和接口 的理解涉及到对问题领域本质的理解 对于设计意图的理解是否正确在面向对象的概念中 所有的对象都是通过类来描绘的 但反过来 并不是所有的类都是用来描绘对象的 如果一个类中没有包含足够的信息来描绘一个具体的对象 这样的类就是抽象类 抽象类往往用来表征我们在对问题领域进行分析 设计中得出的抽象概念 是对一系列看上去不同 但是本质上相同的具体概念的抽象 比如 如果我们进行一个图形编辑软件的开发 就会发现问题领域存在着圆 三角形这样一些具体概念 它们是不同的 但是它们又都属于形状这样一个概念 形状这个概念在问题领域是不存在的 它就是一个抽象概念 正是因为抽象的概念在问题领域没有对应的具体概念 所以用以表征抽象概念的抽象类是不能够实例化的 22 抽象类 续 抽象类的特点抽象类可有构造方法 普通的成员变量或方法 也可以派生抽象类的子类抽象类不能直接用来生成实例 一般可通过定义子类进行实例化 可以生成抽象类的变量 该变量可以指向具体的一个子类的实例abstractclassEmployee abstractvoidraiseSalary inti classManagerextendsEmployee voidraiseSalary inti Employeee newManager 23 接口interface 什么是Java接口 Java中的接口是一系列方法的声明 是一些方法特征的集合 一个接口只有方法的特征没有方法的实现 因此这些方法可以在不同的地方被不同的类实现 而这些实现可以具有不同的行为 功能 接口把方法的特征和方法的实现分割开来 在编程的时候 面向接口编程可以使设计者和编程者分离 使各层之间实现强内聚低耦合 当有代码发生变动时 使代码的波动量控制在最小 避免向外扩散 24 接口interface 为何使用接口 问题描述两个类中的两个类似的功能 调用他们的类动态的决定一种实现 那他们提供一个抽象父类 子类分别实现父类所定义的方法 问题的出现Java是一种单继承的语言 一般情况下 那个具体类可能已经有了一个超类 解决是给它的父类加父类 或者给它父类的父类加父类 直到移动到类等级结构的最顶端 这样一来 对一个具体类的可插入性的设计 就变成了对整个等级结构中所有类的修改 25 接口interface 接口是可插入性的保证在一个等级结构中的任何一个类都可以实现一个接口 这个接口会影响到此类的所有子类 但不会影响到此类的任何超类 此类将不得不实现这个接口所规定的方法 而其子类可以从此类自动继承这些方法 当然也可以选择置换掉所有的这些方法 或者其中的某一些方法 这时候 这些子类具有了可插入性 并且可以用这个接口类型装载 传递实现了他的所有子类 我们关心的不是那一个具体的类 而是这个类是否实现了我们需要的接口 接口提供了关联以及方法调用上的可插入性 软件系统的规模越大 生命周期越长 接口使得软件系统的灵活性和可扩展性 可插入性方面得到保证 26 接口interface interface是在抽象类概念的基础上演变而来的 一个interface所有成员方法都是抽象的 并且只能定义staticfinal成员变量 27 interface示例 28 实现interface 用implements代替extends声明子类 该子类中必须实现接口 及其超类 中的所有方法 例 interfaceSayHello voidprintMessage classSayHelloImplimplementsSayHello voidprintMessage System out println Hello 29 interface的使用 interface可以作为一种数据类型使用 如 publicclassStockMonitor publicvoidwatchStock StockWatcherwatcher StringtickerSymbol doubledelta 30 interface中注意问题 不能向interface定义中随意增加方法 publicinterfaceStockWatcher finalStringsunTicker SUNW finalStringoracleTicker ORCL finalStringciscoTicker CSCO voidvalueChanged StringtickerSymbol doublenewValue voidcurrentValue StringtickerSymbol doublenewValue publicinterfaceStockTrackerextendsStockWatcher voidcurrentValue StringtickerSymbol doublenewValue 31 接口interface 可以通过实现接口实现多重继承 一个类可只继承一个父类 并实现多个接口 interfaceI1 interfaceI2 classE classMextendsEimplementsI1 I2 一个interface可作为类名使用 实现多态 interfaceHuman classChineseimplementsHuman classJapaneseimplementsHuman Humane newChinese Humane newJapanese 32 接口interface Java接口的特征Java接口中的成员变量默认都是public static final类型的 都可省略 必须被显示初始化 即接口中的成员变量为常量 大写 单词之间用 分隔 Java接口中的方法默认都是public abstract类型的 都可省略 没有方法体 不能被实例化publicinterfaceA intCONST 1 合法 CONST默认为public static final类型voidmethod 合法 method 默认为public abstract类型publicabstractvoidmethod2 method2 显示声明为public abstract类型 33 接口interface 接口中没有构造方法 不能被实例化publicinterfaceA publicA 错 接口中不能包含构造方法voidmethod 34 接口interface 一个接口不能实现 implements 另一个接口 但它可以继承多个其它的接口publicinterfaceA voidmethodA publicinterfaceB voidmethodB publicinterfaceCextendsA B C称为复合接口 voidmethodC publicinterfaceCimplementsA 错 35 接口interface Java接口必须通过类来实现它的抽象方法publicclassAimplementsB 当类实现了某个Java接口时 它必须实现接口中的所有抽象方法 否则这个类必须声明为抽象的不允许创建接口的实例 实例化 但允许定义接口类型的引用变量 该引用变量引用实现了这个接口的类的实例publicclassBimplementsA Aa newB 引用变量a被定义为A接口类型 引用了B实例Aa newA 错误 接口不允许实例化 36 补充 与Java接口相关的设计模式 定制服务模式设计精粒度的接口 每个Java接口代表相关的一组服务 通过继承来创建复合接口适配器模式当每个系统之间接口不匹配时 用适配器来转换接口默认适配器模式为接口提供简单的默认实现代理模式为Java接口的实现类创建代理类 使用者通过代理来获得实现类的服务标识类型模式用接口来标识一种没有任何行为的抽象类型常量接口模式在接口中定义静态常量 在其它类中通过importstatic语句引入这些常量 37 抽象类和接口的比较 共同点接口和抽象类都可以有抽象方法 不同点抽象类可以有实例变量 而接口不能拥有实例变量 接口中的变量都是静态 static 的常量 final 抽象类可以有非抽象方法 而接口只能有抽象方法 38 抽象类 从语法定义层面看abstractclass和interface从编程的角度来看 abstractclass和interface从设计理念层面看abstractclass和interface 39 从语法定义层面看abstractclass和interface abstractclassDemo abstractvoidmethod1 abstractvoidmethod2 interfaceDemo voidmethod1 voidmethod2 40 从编程的角度来看 abstractclass和interface abstractclass在Java语言中表示的是一种继承关系 一个类只能使用一次继承关系 一个类却可以实现多个interface 其次 在abstractclass的定义中 可以赋予方法的默认行为 但是在interface的定义中 方法却不能拥有默认行为 41 从设计理念层面看abstractclass和interface abstractclass在Java语言中体现了一种继承关系 要想使得继承关系合理 父类和派生类之间必须存在 is a 关系 即父类和派生类在概念本质上应该是相同的 对于interface来说则不然 并不要求interface的实现者和interface定义在概念本质上是一致的 仅仅是实现了interface定义的契约而已 实例说明 42 抽象类 考虑这样一个例子 假设在我们的问题领域中有一个关于Door的抽象概念 该Door具有执行两个动作open和close 此时可以通过abstractclass或者interface来定义一个表示该抽象概念的类型 定义方式分别如下所示 interfaceDoor voidopen voidclose abstractclassDoor abstractvoidopen abstractvoidclose 43 抽象类 其他具体的Door类型可以extends使用abstractclass方式定义的Door或者implements使用interface方式定义的Door 看起来好像使用abstractclass和interface没有大的区别 如果现在要求Door还要具有报警的功能 我们该如何设计针对该例子的类结构呢 44 解决方案一 简单的在Door的定义中增加一个alarm方法 如下 abstractclassDoor abstractvoidopen abstractvoidclose abstractvoidalarm 或者interfaceDoor voidopen voidclose voidalarm 45 那么具有报警功能的AlarmDoor的定义方式如下 classAlarmDoorextendsDoor voidopen voidclose voidalarm 或者classAlarmDoorimplementsDoor voidopen voidclose voidalarm 46 方案一带来的问题是什么 这种方法违反了面向对象设计中的一个核心原则ISP InterfaceSegregationPrinciple 接口隔离原则 在Door的定义中把Door概念本身固有的行为方法和另外一个概念 报警器 的行为方法混在了一起 这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为 报警器 这个概念的改变 比如 修改alarm方法的参数 而改变 反之依然 47 解决方案二 既然open close和alarm属于两个不同的概念 根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中 定义方式有 这两个概念都使用abstractclass方式定义 两个概念都使用interface方式定义 一个概念使用abstractclass方式定义 另一个概念使用interface方式定义 对于它们的选择却反映出对于问题领域中的概念本质的理解 对于设计意图的反映是否正确 合理 如果两个概念都使用interface方式来定义 那么就反映出两个问题 1 没有理解清楚问题领域 AlarmDoor在概念本质上到底是Door还是报警器 2 如果对于问题领域的理解没有问题 比如 通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的 那么在实现时就没有能够正确的揭示我们的设计意图 因为在这两个概念的定义上 均使用interface方式定义 反映不出上述含义 48 如果我们对于问题领域的理解是 AlarmDoor在概念本质上是Door 同时它有具有报警的功能 我们该如何来设计 实现来明确的反映出我们的意思呢 前面已经说过 abstractclass在Java语言中表示一种继承关系 而继承关系在本质上是 is a 关系 所以对于Door这个概念 我们应该使用abstarctclass方式来定义 另外 AlarmDoor又具有报警功能 说明它又能够完成报警概念中定义的行为 所以报警概念可以通过interface方式定义 如下所示 abstractclassDoor abstractvoidopen abstractvoidclose interfaceAlarm voidalarm classAlarmDoorextendsDoorimplementsAlarm voidopen voidclose voidalarm 49 这种实现方式基本上能够明确的反映出对于问题领域的理解 正确的揭示设计意图 其实abstractclass表示的是 is a 关系 interface表示的是 like a 关系 大家在选择时可以作为一个依据 当然这是建立在对问题领域的理解上的 比如 如果我们认为AlarmDoor在概念本质上是报警器 同时又具有Door的功能 那么上述的定义方式就要反过来了 50 类分组package语句 包 package 是相关类与接口的一个集合 它提供访问控制与命名空间管理 Java平台中的类与接口都是根据功能以包组织的 包机制的好处 程序员容易确定包中的类是相关的 并且容易根据所需的功能找到相应的类 每个包都创建一个新的命名空间 因此不同包中的类名不会冲突 同一个包中的类之间有比较宽松的访问控制 51 创建包 用package语句指定源文件中的类属于一个特定包 package包名包定义语句在每个源程序中只能有一条 即一个类只能属于一个包 包定义语句必须在程序的第一行 之前可有空格及注释 包名用 分隔 52 import语句 将package引入源程序 格式 import包名 import包名 类名 import语句必须在源程序之前 在package声明之后 package 缺省是package import 缺省是importjava lang 类声明 53 包名与包中类的存储位置 包分隔符相当于目录分隔符 包存储的路径由包根路径加上包名指明的路径组成 包的根路径由CLASSPATH环境变量指出 CLASSPATH abc financeDept 54 源文件 java 与类文件 class 的管理 源文件可以按照包名指明的路径放置 如 类文件也应该放在反映包名的一系列目录下 55 一般将源文件与类文件分别存放 可采用如下方式 源文件 java 与类文件 class 的管理 示例 56 包装类 WrapperClass 包装类将基本类型表示成类 每个包装类对象都封装了基本类型的一个值 PrimitiveDataTypeWrapperClassbooleanBooleanbyteBytecharCharactershortShortintIntegerlongLongfloatFloatdoubleDouble 57 包装类 包装类中包含了很多有用的方法和常量 如数字型包装类中的MIN VALUE和MAX VALUE常量 定义了该类型的最大值与最小值 byteValue shortValue方法进行数值转换 valueOf和toString实现字符串与数值之间的转换 例 包装类对象的创建 Integerquantity newInteger 123456 Doubleamount newDouble 345987 246 58 数组和集合的区别 数组数组是JAVA语言内置的数据类型 它是一个线性的序列 数组创建之后 容量固定 且在其生命周期里是不能改变的 访问速度很快 但也损失了其它一些特性 还有一点 JAVA里面的数组是会做边界检查的 所以当你越界访问时 会抛出RuntimeException 数组元素可以是基本数据类型 复合数据类型 但是所有元素类型必须相同数组会在编译的时候作类型检查 从而防止插入错误类型的对象什么是集合 集合可理解成一个容器容器将它所含的元素都看成是JAVA中所有类的根类Object类型的 这样只需创建一种容器 就能把所有的类型的对象全部放进去 59 CollectionsFramework集合框架是一个统一的架构 用来表示和操作集合 集合框架主要是由接口 抽象类和实现类构成 Collection和Map是Java容器中的两种基本类型 区别在于Collection每个位置只能保存一个元素 将元素添加入任意Collection都可以使用add 方法 Map保存的是健值对 使用put 为Map添加元素 它需要一个健和一个值作参数 60 为什么要使用集合类当你事先不知道要存放数据的个数 或者你需要一种比数组下标存取机制更灵活的方法时 你就需要用到集合类 理解集合类集合类存放的都是对象的引用 而非对象本身 61 Set 集 是最简单的一种集合 它的对象不按特定方式排序 只是简单的把对象加入集合中 对集中成员的访问和操作是通过集中对象的引用进行的 所以集中不能有重复对象 集也有多种变体 可以实现排序等功能 子接口SortedSet是一个按照升序排列的元素的Set 如TreeSet 它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中 它实现的是SortedSet接口 62 List 列表 是一个有序集合 其对象以线性方式存储 提供了按索引访问的方式 Vector就是一种常用的List列表在数据结构中分别表现为 数组和向量 链表 堆栈 队列 63 MAP映射其中每项都是成对的 映射中存储的每个对象都有一个相关的关键字 Key 对象 关键字决定了对象在映射中的存储位置 关键字应该是唯一的 关键字本身并不能决定对象的存储位置 它通过一种散列 hashing 技术来处理 产生一个被称作散列码 hashcode 的整数值 散列码通常用作一个偏置量 该偏置量是相对于分配给映射的内存区域起始位置的 由此确定关键字 对象对的存储位置 64 65 Collection接口常用的方法 Booleanadd Eo 确保此collection包含指定的元素 可选操作 Booleancontains Objecto 如果此collection包含指定的元素 则返回true Booleanremove Objecto 从此collection中移除指定元素的单个实例 如果存在的话 可选操作 intsize 返回此collection中的元素数 Object toArray 返回包含此collection中所有元素的数组 Iteratoriterator 返回在此collection的元素上进行迭代的迭代器 66 集合类的基本方法的使用 一个简单的例子CollectionToArray javaimportjava util publicclassCollectionToArray publicstaticvoidmain String args Collectioncollection1 newArrayList 创建一个集合对象collection1 add 000 添加对象到Collection集合中collection1 add 111 collection1 add 222 System out println 集合collection1的大小 collection1 size System out println 集合collection1的内容 collection1 collection1 remove 000 从集合collection1中移除掉 000 这个对象System out println 集合collection1移除000后的内容 collection1 System out println 集合collection1中是否包含000 collection1 contains 000 System out println 集合collection1中是否包含111 collection1 contains 111 Collectioncollection2 newArrayList collection2 addAll collection1 将collection1集合中的元素全部都加到collection2中System out println 集合collection2的内容 collection2 collection2 clear 清空集合collection1中的元素System out println 集合collection2是否为空 collection2 isEmpty 将集合collection1转化为数组Objects collection1 toArray for inti 0 i s length i System out println s i 67 Set Set不能包含重复的元素 两种Set实现 HashSet和TreeSet Set接口定义 publicinterfaceSet BasicOperationsintsize booleanisEmpty booleancontains Objectelement booleanadd Objectelement Optionalbooleanremove Objectelement OptionalIteratoriterator 68 HashSet java lang Objectjava util AbstractCollectionjava util AbstractSetjava util HashSet类型参数 E 此set所维护的元素的类型所有已实现的接口 Serializable Cloneable Iterable Collection Set直接已知子类 JobStateReasons LinkedHashSet 69 HashSet 构造方法HashSet 构造一个新的空set 其底层HashMap实例的默认初始容量是16 加载因子是0 75 HashSet Collectionc 构造一个包含指定collection中的元素的新set HashSet intinitialCapacity 构造一个新的空set 其底层HashMap实例具有指定的初始容量和默认的加载因子 0 75 HashSet intinitialCapacity floatloadFactor 构造一个新的空set 其底层HashMap实例具有指定的初始容量和指定的加载因子 70 HashSet 方法booleanadd Ee 如果此set中尚未包含指定元素 则添加指定元素 voidclear 从此set中移除所有元素 Objectclone 返回此HashSet实例的浅表副本 并没有复制这些元素本身 booleancontains Objecto 如果此set包含指定元素 则返回true BooleanisEmpty 如果此set不包含任何元素 则返回true Iteratoriterator 返回对此set中元素进行迭代的迭代器 booleanremove Objecto 如果指定元素存在于此set中 则将其移除 intsize 返回此set中的元素的数量 set的容量 71 HashSet 实现Set接口的hashtable 哈希表 依靠HashMap来实现的 应该为要存放到散列表的各个对象定义hashCode 和equals 若增加两个相同的对象 要重写hashCode 和equals 方法 HashSeths newHashSet hs add newStudent 1 zhangshan hs add newStudent 2 lisi hs add newStudent 2 lisi 此时只需在Student类中增加以下方法即可 publicinthashCode returnnum name hashCode 对于name 可以直接调用String类的hashCode 类 publicbooleanequals Objecto Studentst Student o return num st num 实例 HashSetTest java HashSetDemo java 72 补充 HashTable 下面是创建了一个数字的哈希表 它将数字的名称用作键 Hashtablenumbers newHashtable numbers put one 1 numbers put two 2 numbers put three 3 要获取一个数字 可以使用以下代码 Integern numbers get two if n null System out println two n 73 TreeSet TreeSet是依靠TreeMap来实现的 TreeSet是一个有序集合 TreeSet中元素将按照升序排列 缺省是按照自然顺序进行排列 意味着TreeSet中元素要实现Comparable接口 可以在构造TreeSet对象时 传递实现了Comparator接口的比较器对象 74 TreeSet HashSet和TreeSet的比较HashSet是基于Hash算法实现的 其性能通常都优于TreeSet 通常都应该使用HashSet 在需要排序的功能时 才使用TreeSet 实例 TreeSetTest java 75 List List是有序的集合 元素可以重复 List接口定义 publicinterfaceListextendsCollection PositionalAccessObjectget intindex Objectset intindex Objectelement Optionalvoidadd intindex Objectelement OptionalObjectremove intindex OptionalabstractbooleanaddAll intindex Collectionc Optional SearchintindexOf Objecto intlastIndexOf Objecto List的实现 ArrayList LinkedList Vector 历史集合类 76 ArrayList publicclassArrayListextendsAbstractListimplementsList RandomAccess Cloneable Serializable是List接口的大小可变数组的实现 即ArrayList可看作是能够自动增长容量的数组 每个ArrayList实例都有一个容量 该容量是指用来存储列表元素的数组的大小 它总是至少等于列表的大小 在添加大量元素前 应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量 这可以减少递增式再分配的数量 实例 ArrayListTest java ArrayListToArrayTest java 77 迭代器 Collection提供了一个iterator 方法 可以返回一个迭代器 迭代器是指向两个元素之间的指针 凡是继承自Collection的接口或间接的实现类都有这个方法 BooleanhasNext Enext voidremove 78 迭代器 booleanhasNext 如果仍有元素可以迭代 则返回true 换句话说 如果next返回了元素而不是抛出异常 则返回true 返回 如果迭代器具有多个元素 则返回true 79 迭代器 Enext 返回迭代的下一个元素 返回 迭代的下一个元素 抛出 NoSuchElementException 没有元素可以迭代 80 迭代器 voidremove 从迭代器指向的collection中移除迭代器返回的最后一个元素 可选操作 每次调用next只能调用一次此方法 如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的collection 则迭代器的行为是不确定的 抛出 UnsupportedOperationException 如果迭代器不支持remove操作 IllegalStateException 如果尚未调用next方法 或者在上一次调用next方法之后已经调用了remove方法 81 迭代器 如 ArrayListal1 newArrayList Iteratorit al iterator it next while it hasNext System out println it next 通用方式访问集合中的元素另外定义打印函数publicstaticvoidprintElements Collectionc Iteratorit c iterator while it hasNext System out println it next 82 迭代器示例 Java的Collection的Iterator能够用来 使用方法iterator 要求容器返回一个Iterator 第一次调用Iterator的next 方法时 它返回集合序列的第一个元素 使用next 获得集合序列的中的下一个元素 使用hasNext 检查序列中是否元素 使用remove 将迭代器新返回的元素删除 实例 IteratorDemo java ListIteratorTest java 83 LinkedList publicclassLinkedListextendsAbstractSequentialListimplementsList Deque Cloneable SerializableList接口的链接列表实现 实现所有可选的列表操作 并且允许所有元素 包括null 除了实现List接口外 LinkedList类还为在列表的开头及结尾get remove和insert元素提供了统一的命名方法 这些操作允许将链接列表用作堆栈 队列或双端队列 84 LinkedList LinkedList是采用双向循环链表实现的 利用LinkedList实现栈 stack 队列 queue 双向队列 double endedqueue 85 Deque publicinterfaceDequeextendsQueue一个线性collection 支持在两端插入和移除元素 名称deque是 doubleendedqueue 双端队列 的缩写 通常读为 deck 大多数Deque实现对于它们能够包含的元素数没有固定限制 但此接口既支持有容量限制的双端队列 也支持没有固定大小限制的双端队列 此接口定义在双端队列两端访问元素的方法 提供插入 移除和检查元素的方法 每种方法都存在两种形式 一种形式在操作失败时抛出异常 另一种形式返回一个特殊值 null或false 具体取决于操作 插入操作的后一种形式是专为使用有容量限制的Deque实现设计的 在大多数实现中 插入操作不能失败 86 Queue publicinterfaceQueueextendsCollection在处理元素前用于保存元素的collection 除了基本的Collection操作外 队列还提供其他的插入 提取和检查操作 每个方法都存在两种形式 一种抛出异常 操作失败时 另一种返回一个特殊值 null或false 具体取决于操作 插入操作的后一种形式是用于专门为有容量限制的Queue实现设计的 在大多数实现中 插入操作不会失败 87 LinkedList ArrayList和LinkedList的比较ArrayList底层采用数组完成 而LinkedList则是以一般的双向链表 double linkedlist 完成 其内每个对象除了数据本身外 还有两个引用 分别指向前一个元素和后一个元素 如果经常在List的开始处增加元素 或者在List中进行插入和删除操作 则应该使用LinkedList 否则的话 使用ArrayList将更加快速 88 List总结 所有的List中只能容纳单个不同类型的对象组成的表 而不是Key Value键值对 例如 tom 1 c 所有的List中可以有相同的元素 例如Vector中可以有 tom koo too koo 所有的List中可以有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 软件测试工具的使用与效果评估试题及答案
- 计算机四级网软件测试技术的应用试题及答案
- 石油开采业的环境保护与生态文明建设考核试卷
- 监理师考试思维导图的使用技巧试题及答案
- 网络技术应急响应机制试题及答案
- 硝酸铈制备工艺与稀土材料研究考核试卷
- 网络技术考试知识点查缺补漏的关键试题及答案
- 金属废料加工绿色制造技术研究考核试卷
- 通信原理与终端设备基础考核试卷
- 数据库性能测试方法试题及答案
- 理论联系实际谈一谈如何维护政治安全?参考答案1
- 2025年中国冷库用叉车数据监测研究报告
- 2025年高考第二次模拟考试物理(浙江卷)(参考答案)-20250416-113627
- 2025年化妆师职业技能考试试题及答案
- GA 1812.1-2024银行系统反恐怖防范要求第1部分:人民币发行库
- 人工智能设计伦理知到智慧树章节测试课后答案2024年秋浙江大学
- 《陆上风电场工程概算定额》NBT 31010-2019
- 干部人事档案转递单表样
- 关于中国文化遗产北京故宫的资料
- 新中考考试平台-考生端V2.0使用手册
- 换热器热量及面积计算公式
评论
0/150
提交评论