Java语言程序设计-容器框架与泛型
java泛型实现原理

Java泛型是Java编程语言中的一种特性,它允许程序员创建具有类型参数的类、接口和方法,以便在编译时强制执行类型安全性。
泛型的实现原理可以分为以下几个关键方面:1.类型擦除:Java中的泛型是通过类型擦除来实现的。
这意味着在编译时,泛型类型会被擦除为其边界类型或者Object类型。
这样做是为了保持与Java早期版本的兼容性,并且避免了在运行时额外生成大量的重复类。
2.类型参数转换:在类型擦除之后,泛型类中的类型参数会被转换为相应的边界类型或者Object类型。
编译器会插入必要的类型转换代码,以确保在运行时可以正确地处理类型。
3.类型擦除的影响:由于类型擦除的影响,泛型类中的参数化类型信息在运行时是不可用的。
这意味着在运行时,无法直接访问泛型类的参数化类型信息,而只能访问其擦除后的类型。
4.类型边界和限制:泛型中的类型边界和限制规定了泛型类型可以接受的类型范围。
这些边界可以是类、接口或者其他类型,用于限制泛型的类型参数必须满足特定的条件。
5.类型安全性和编译时检查:泛型的主要目的是为了提高类型安全性,并且在编译时进行类型检查,以确保类型的一致性。
这样可以在编译时捕获许多类型错误,并防止运行时出现类型相关的异常。
6.通配符和边界通配符:Java中的泛型还支持通配符和边界通配符,用于处理一些特定的泛型类型。
通配符允许程序员在泛型中使用未知类型,而边界通配符则允许限制通配符的类型范围。
Java泛型是Java编程语言中一个强大的特性,它提供了一种类型安全的编程方式,可以在编译时捕获许多潜在的类型错误。
尽管Java的泛型是通过类型擦除来实现的,但它仍然提供了许多有用的功能,使得Java编程更加灵活和可靠。
java泛型定义

java泛型定义
Java泛型是一种在编译时实现类型安全的特性,它允许我们在定义类、接口和方法时使用类型参数。
通过使用泛型,我们可以在编译时发现类型不匹配的错误,从而避免了在运行时出现类型转换异常的情况。
在Java中,泛型是通过在类名或方法名后面添加尖括号(`<`和`>`)来实现的。
泛型类型参数可以是任何有效的Java标识符,通常使用单个大写字母来表示。
例如,`<T>`表示类型参数,`<E>`表示元素类型。
泛型类型参数可以在类、接口和方法中使用。
在类或接口中使用泛型时,我们可以在类或接口名后面添加尖括号,并在括号中指定类型参数。
例如,我们可以定义一个泛型类`List<T>`,其中`T`表示列表中的元素类型。
在方法中使用泛型时,我们可以在方法名和参数列表之间添加尖括号,并在括号中指定类型参数。
例如,我们可以定义一个泛型方法`public <T> T get(int index)`,其中`T`表示方法返回值的类型。
除了定义泛型类和方法外,我们还可以使用泛型通配符来限制类型参数的范围。
通配符可以使用`?`表示,例如`List<?>`表示元素类型未知的列表。
总之,Java泛型是一个非常强大的特性,它可以帮助我们写出更加类型安全、可读性更好的代码。
在使用泛型时,我们应该了解泛型的基本概念和语法,以便正确地定义和使用泛型。
《JAVA程序设计》教学大纲

《JAVA程序设计》教学大纲一、课程概述本课程是一门面向计算机科学与技术专业学生的JAVA程序设计课程,通过本课程的学习,学生将掌握JAVA语言的基本知识和编程技巧,并能够运用JAVA语言进行程序开发和问题解决。
二、课程目标1.了解JAVA语言的发展背景、特点和应用领域。
2.掌握JAVA语言的基本语法和编程规范。
3.熟悉JAVA的核心类库,并能够灵活运用。
4.掌握常见数据结构和算法,并能够使用JAVA实现。
5.培养学生的问题分析和解决能力,提高编程能力和代码质量。
三、教学内容与安排1.JAVA语言基础1.1JAVA语言概述1.2程序的编写与运行1.3数据类型与变量1.4运算符与表达式1.5控制语句与循环结构1.6数组与字符串1.7类与对象1.8方法与函数1.9异常处理2.JAVA面向对象编程2.1类与对象的概念2.2封装与继承2.3多态与接口2.4内部类与匿名类2.5泛型与枚举3.JAVA的图形化编程3.1 AWT与Swing框架3.2 常用的Swing组件与布局管理器3.3事件处理与监听器4.JAVA的输入输出流4.1字节流与字符流4.2文件的读写操作4.3序列化与反序列化4.4网络编程的基本概念5.JAVA的多线程编程5.1线程的概念与生命周期5.2线程的创建与启动5.3线程同步与互斥5.4线程的通信与协作6.数据结构与算法6.1线性表与链表6.2栈与队列6.3树与二叉树6.4图的表示与遍历6.5哈希表与排序算法四、教学方法1.理论与实践相结合的教学方法,通过讲解理论知识和实际案例的演示,培养学生的编程思维和实际操作能力。
2.采用小组合作学习的方式,鼓励学生互相交流、合作解决问题,培养团队合作精神和解决问题的能力。
3.通过课堂练习、编程作业、实验项目等形式,加强学生对知识的掌握和实际应用能力的培养。
五、学时分配-本课程总学时:72学时-理论学时:40学时-实验与实践学时:32学时六、评估与考核1.平时成绩:包括课堂表现、课堂作业和小组合作项目成果等。
java程序员常用技能树

作为Java程序员,以下是一些常见的技能树:1. Java核心知识:- Java基础语法和面向对象编程(OOP)概念- 集合框架和泛型- 多线程编程- 异常处理和日志记录- I/O操作和文件处理2. Java开发工具和环境:- Java开发工具包(JDK)- 集成开发环境(IDE),如Eclipse、IntelliJ IDEA或NetBeans - 版本控制工具,如Git或SVN3. 数据库和SQL:- 关系型数据库,如MySQL、Oracle或SQL Server- SQL语言,包括查询、更新和管理数据库- 数据库连接和操作,使用JDBC等4. Web开发:- Java Web开发框架,如Spring、Spring Boot或Java EE- Servlet和JSP技术- 前端技术,如HTML、CSS和JavaScript- RESTful API设计和开发- Web服务器,如Tomcat或Jetty5. 数据持久化:- 对象关系映射(ORM)框架,如Hibernate或MyBatis- NoSQL数据库,如MongoDB或Redis- 缓存技术,如Memcached或Ehcache6. 测试和调试:- 单元测试框架,如JUnit或TestNG- 调试工具,如IDE的调试器、日志记录和断点调试- 性能测试和代码覆盖率工具7. 设计模式:- 常见设计模式,如单例模式、工厂模式、观察者模式等- 软件架构原则,如SOLID原则8. 分布式系统和微服务:- 分布式系统概念和架构- 微服务架构和相关技术,如Spring Cloud或Dubbo- 消息队列,如Kafka或RabbitMQ9. 安全性和认证:- Web安全知识,如跨站脚本攻击(XSS)和跨站请求伪造(CSRF)- 认证和授权机制,如OAuth或JWT10. 性能优化和调优:- JVM优化和调优,如垃圾回收机制、堆内存配置等- 线程池和并发编程优化- 数据库查询和索引优化这只是Java程序员常用技能树的一个概述,并不是详尽无遗的。
Java泛型方法

Java泛型⽅法1. 定义泛型⽅法(1) 如果你定义了⼀个泛型(类、接⼝),那么Java规定,你不能在所有的静态⽅法、静态初块等所有静态内容中使⽤泛型的类型参数。
例如:public class A<T> {public static void func(T t) {//报错,编译不通过}}(2) 如何在静态内容(静态⽅法)中使⽤泛型,更⼀般的问题是,如果类(或者接⼝)没有定义成泛型,但是就想在其中某⼏个⽅法中运⽤泛型(⽐如接受⼀个泛型的参数等),该如何解决?定义泛型⽅法就像定义泛型类或接⼝⼀样,在定义类名(或者接⼝名)的时候需要指定我的作⽤域中谁是泛型参数。
例如:public class A<T> { ... }表明在类A的作⽤域中,T是泛型类型参数。
定义泛型⽅法,其格式是:修饰符 <类型参数列表> 返回类型⽅法名(形参列表) { ⽅法体 }。
例如:public static <T, S> int func(List<T> list, Map<Integer, S> map) { ... },其中T和S是泛型类型参数。
泛型⽅法的定义和普通⽅法定义不同的地⽅在于需要在修饰符和返回类型之间加⼀个泛型类型参数的声明,表明在这个⽅法作⽤域中谁才是泛型类型参数;不管是普通的类/接⼝的泛型定义,还是⽅法的泛型定义都逃不出两⼤要素:明哪些是泛型类型参数;这些类型参数在哪⾥使⽤。
(3) 类型参数的作⽤域class A<T> { ... }中T的作⽤域就是整个A;public <T> func(...) { ... }中T的作⽤域就是⽅法func;类型参数也存在作⽤域覆盖的问题,可以在⼀个泛型模板类/接⼝中继续定义泛型⽅法,例如:class A<T> {// A已经是⼀个泛型类,其类型参数是Tpublic static <T> void func(T t) {// 再在其中定义⼀个泛型⽅法,该⽅法的类型参数也是T}}//当上述两个类型参数冲突时,在⽅法中,⽅法的T会覆盖类的T,即和普通变量的作⽤域⼀样,内部覆盖外部,外部的同名变量是不可见的。
《Java程序设计》课程教学大纲

《Java程序设计》课程教学大纲课程编号:08120031课程名称:Java程序设计/JAVA Programming总学时/学分:48/3(其中理论32学时,实验16学时)适用专业:计算机科学与技术一、课程目标通过本课程学习,学生应达到如下目标:目标1. 识别Java语言特点、基本语法、语言机制。
目标2. 将面向对象方法知识运用在程序设计案例中,能使用JAVA常用类、枚举、lambda 表达式、容器、泛型进行实例编程验证。
目标3. 利用JavaSE中的异常处理、输入输出等技术来表达处理程序应用问题。
目标4. 将图形用户界面和数据库编程技术运用中综合应用程序设计中。
目标5. 搭建Java开发环境,能设计实现各种Java技术的应用程序,且能测试运行。
二、课程目标对毕业要求的支撑三、教学过程安排四、实验或上机内容五、课程目标达成方法六、考核标准本门课程考核包括6个部分,分别为考试、作业、实验、讨论和测验。
具体要求及评分方法如下:1、期末考试试卷知识点要求2、作业3、实验4、讨论设置讨论课一次,要求学生按照讨论题目分组查阅资料,归纳总结,撰写报告。
5、测验随堂测验,老师给出题目,学生回答。
具体有任课老师给出评分标准。
七、教材及主要参考资料[1] 黑马程序员. Java基础入门(第2版)[M]. 清华大学出版社, 2018.[2] 郑人杰、马素霞、殷人昆. 软件工程概论(第2版)[M]. 机械工业出版社,2016.[3] Gay S.Horstmann. Java核心技术(第10版)[M]. 机械工业出版社,2016.[4] Y.Daniel Liang(美). Java语言程序设计(第10版)[M]. 机械工业出版社.2015.[5] 李刚. 疯狂Java讲义(第4版)[M]. 电子工业出版社,2018.[6] 封亚飞. 揭秘Java虚拟机[M]. 电子工业出版社,2017.[7] Bruce Eckel(美). Java编程思想(第4版)[M]. 机械工业出版社,2007.。
java中泛型的作用
java中泛型的作用泛型是Java语言的一项强大特性,它允许我们在定义类、接口、方法等时使用类型参数,从而使得代码更加灵活和可复用。
泛型的作用主要体现在以下几个方面:1.类型安全:泛型提供了一种编译时的类型检查机制,可以在编译阶段捕获一些类型错误。
通过使用泛型,我们可以在编译时检查参数类型是否匹配,避免了在运行时可能产生的类型转换异常。
2.代码复用:使用泛型可以编写更加通用的代码,提高代码的可复用性。
通过定义泛型类或泛型方法,我们可以将相似代码逻辑抽象出来,以适用于不同的类型,从而减少重复编写代码的工作量。
3. 集合类的类型安全:泛型集合类(如ArrayList、HashSet等)可以指定存储的元素类型,使得集合中的元素都是指定类型。
这样可以在编译时就避免了将错误类型的对象存入集合的问题,并且在读取集合中的元素时可以直接获取到正确类型的对象,避免了类型转换的繁琐与风险。
4. 简化代码:在没有泛型之前,我们可能需要编写各种类型的容器类,如IntList、StringList等,用于存储不同类型的元素。
而有了泛型,我们可以使用通用的容器类List,通过指定泛型参数的方式来存储不同类型的元素,从而大大简化了代码结构。
5.提高性能:使用泛型可以避免一些不必要的类型转换,从而提高程序的执行效率。
在编译时确定了泛型类型后,编译器会自动插入类型转换的代码,避免了动态类型检查所带来的性能损失。
6.编写更安全的API:通过使用泛型,我们可以将一些类型相关的约定和规范编码到API中,从而可以在编译时强制执行这些约定,提高代码的安全性和可靠性。
7.代码逻辑清晰:泛型可以使代码更具可读性和可维护性。
通过使用泛型,我们可以在编程时直观地表达出代码逻辑的意图,从而使代码更加清晰明了。
总之,泛型是Java语言中一项非常重要的特性,它提供了更高层次的抽象和灵活性,使得我们可以编写更加通用、类型安全且可复用的代码。
通过正确地使用泛型,我们可以提高代码的质量和可维护性,并且更容易适应未来的需求变化。
java泛型语法
java泛型语法Java泛型语法是Java编程语言中的一个重要特性,它允许我们编写更加通用和灵活的代码。
通过使用泛型,我们可以在编译时期检测类型错误,并在运行时期避免类型转换异常。
本文将介绍Java泛型的基本语法和使用方法。
一、泛型的定义和作用泛型是Java中的一种参数化类型,它允许我们在定义类、接口和方法时使用类型参数。
通过使用泛型,我们可以将类型作为参数传递给类、接口和方法,从而实现代码的复用和灵活性。
泛型的作用主要有以下几个方面:1. 类型安全:通过使用泛型,我们可以在编译时期检测类型错误,避免类型转换异常。
2. 代码复用:通过定义泛型类、接口和方法,我们可以实现对多种类型的支持,从而提高代码的复用性。
3. 简化代码:通过使用泛型,我们可以减少冗余的类型转换代码,使代码更加简洁。
4. 提高性能:通过使用泛型,我们可以避免使用Object类型,从而减少了装箱和拆箱的开销,提高了代码的执行效率。
二、泛型的基本语法Java中的泛型通过使用尖括号<>来定义类型参数。
在定义类、接口和方法时,我们可以将类型参数放在尖括号中,并在后续的代码中使用该类型参数。
1. 泛型类的定义:```public class GenericClass<T> {private T data;public T getData() {return data;}public void setData(T data) {this.data = data;}}```在上面的代码中,泛型类GenericClass使用了类型参数T。
我们可以在创建GenericClass对象时指定具体的类型,例如:```GenericClass<String> genericString = new GenericClass<>(); genericString.setData("Hello, World!");String data = genericString.getData();```上面的代码中,我们创建了一个GenericClass对象genericString,并指定了类型参数为String。
java泛型详解-绝对是对泛型方法讲解最详细的,没有之一
java泛型详解-绝对是对泛型⽅法讲解最详细的,没有之⼀1. 概述泛型在java中有很重要的地位,在⾯向对象编程及各种设计模式中有⾮常⼴泛的应⽤。
什么是泛型?为什么要使⽤泛型?泛型,即“参数化类型”。
⼀提到参数,最熟悉的就是定义⽅法时有形参,然后调⽤此⽅法时传递实参。
那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于⽅法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使⽤/调⽤时传⼊具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。
也就是说在泛型使⽤过程中,操作的数据类型被指定为⼀个参数,这种参数类型可以⽤在类、接⼝和⽅法中,分别被称为泛型类、泛型接⼝、泛型⽅法。
2. ⼀个栗⼦⼀个被举了⽆数次的例⼦:1 List arrayList = new ArrayList();2 arrayList.add("aaaa");3 arrayList.add(100);45for(int i = 0; i< arrayList.size();i++){6 String item = (String)arrayList.get(i);7 Log.d("泛型测试","item = " + item);8 }毫⽆疑问,程序的运⾏结果会以崩溃结束:1 ng.ClassCastException: ng.Integer cannot be cast to ng.StringArrayList可以存放任意类型,例⼦中添加了⼀个String类型,添加了⼀个Integer类型,再使⽤时都以String的⽅式使⽤,因此程序崩溃了。
为了解决类似这样的问题(在编译阶段就可以解决),泛型应运⽽⽣。
我们将第⼀⾏声明初始化list的代码更改⼀下,编译器会在编译阶段就能够帮我们发现类似这样的问题。
二级Java语言程序设计考试大纲(2023年版)
基本要求 1.掌握Java语言的特点、实现机制和体系结构。
2.掌握Java语言中面向对象的特性。
3.掌握Java语言提供的数据类型和结构。
4.掌握Java语言编程的基本技术。
5.会编写Java用户界面程序。
6.会编写Java简单应用程序。
7.会编写Java小应用程序(Applet)。
8.了解Java语言的广泛应用。
考试内容 一、Java语言的特点和实现机制 二、Java体系结构1.Java程序结构。
2.Java类库结构。
3.Java程序开发环境结构。
三、Java语言中面向对象的特性1.面向对象编程的基本概念和特征。
2.类的基本组成和使用。
3.对象的生成、使用和删除。
4.包与接口。
5.Java类库的常用类和接口。
四、Java语言的基本数据类型和运算1.变量和常量。
2.基本数据类型及转换。
3.Java类库中对基本数据类型的类包装。
全国计算机等级考试二级Java语言 程序设计考试大纲(2023年版)4.运算符和表达式运算。
5.字符串和数组。
五、Java语言的基本语句1.条件语句。
2.循环语句。
3.注释语句。
4.异常处理语句。
5.表达式语句。
六、Java编程基本技术1.输入输出流及文件操作。
2.线程的概念和使用。
3.程序的同步与共享。
4.Java语言的继承、多态和高级特性。
5.异常处理和断言概念。
6.Java语言的集合(Collections)框架和泛型概念。
七、编写用户界面程序基础1.用AWT编写图形用户界面的基本技术。
2.用Swing编写图形用户界面的特点。
3.Swing的事件处理机制。
八、编写小应用程序(Applet)基础1.Applet类的API基本知识。
2.Applet编写步骤及特点。
3.基于AWT和Swing编写用户界面。
4.Applet的多媒体支持和通信。
九、JavaSDK6.0的下载和安装 考试方式 上机考试,考试时长120分钟,满分100分。
1.题型及分值单项选择题40分(含公共基础知识部分10分)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例12.4】哈希映射演示。
12.5 常用映射类
Ø 树形映射:TreeMap
TreeMap采用了红黑树的结构来存取映射中的元素。
TreeMap实现了NavigableMap(可导航的映射)接口,而后者又 继承自SortedMap接口,因此,TreeMap允许对映射中的元素按照 键来排序。
12.1 核心接口
Ø 遍历容器
5. 通过Iterable接口的forEach默认方法 从JDK 8开始,Iterable接口增加了名为forEach的默认方法,该方 法以方式4的形式封装了迭代逻辑,以支持近年来重新开始流行的 函数式编程风格。
forEach方法接受一个Consumer类型的参数,而后者是函数式接口, 因而可以直接使用Lambda表达式作为forEach方法的参数。
与前述TreeSet一样,TreeMap也支持以(键的)自然顺序或自定 义顺序对元素进行排序,具体则取决于创建TreeMap对象时所使 用的构造方法。
【表12-8 】
12.6 遗留容器类
Java容器框架是从JDK 1.2开始出现的,在此之前的JDK中只有一些 简单的、零散的容器类,包括Vector、Stack和Hashtable等,通常 将这些类称为遗留容器类。
Comparator接口所定义的int compare(Object o1, Object o2)方法的 返回值意义与上述compareTo方法是一致的。
12.3 案例实践13:产品排序
【案例实践13】分别采用自然排序和自定义排序,对包含若干产 品的树形集合进行排序。
12.4 常用列表类
列表允许包含重复元素 (包括空对象),有两个常用的List接口实现 类——ArrayList和LinkedList,它们分别对应着列表的顺序存储方 式和链式存储方式。
为向下兼容,从JDK 1.2开始的后续版本(包括目前最新的JDK 11) 并未抛弃遗留容器类,而是基于容器框架对它们进行了重新设计。
考虑到很多早期的Java程序使用到了遗留容器类,另一方面,这 些类可能也被JDK中的其它API(如Swing)使用了,因此,哈希映射:HashMap和LinkedHashMap
LinkedHashMap还提供了两个LinkedHashSet所不具有的特性: 1. 支持以键被访问的先后顺序排序(默认以键被添加的先后顺序 排序),也就是说,当通过某个键访问了链式哈希映射之后,该 键会被放置到映射的末尾,即认为该键是“近期被访问最多”的键。
2. 提供了boolean removeEldestEntry(Map.Entry eldest)方法,子 类可以重写该方法以自定义最旧(即最早被访问)条目的自动删 除策略——这使得构建基于LRU(Least Recently Used,最近最少 使用到的)算法的缓存系统变得非常容易。
12.5 常用映射类
要使用自然排序,集合中元素对应的类必须实现Comparable接口。 TreeSet会采取某种排序算法 ,并根据重写的compareTo方法的返 回值,将集合中的所有元素按大小关系的升序进行排列。
12.2 常用集合类
Ø 树形集合:TreeSet
2. 自定义排序 通过构造方法指定一个比较器——实现了parator接 口的类的对象,以确定集合中全部元素的大小关系。
TreeSet采用了树形结构来存取集合元素。
TreeSet实现了NavigableSet(可导航的集合)接口,而后者又继 承自SortedSet接口,因此,TreeSet允许对集合元素进行排序,具 体包括自然排序和自定义排序。
12.2 常用集合类
Ø 树形集合:TreeSet
1. 自然排序 Comparable接口定义了int compareTo(Object o)方法,实现该接 口的类的对象可以相互比较大小,具体逻辑为: ① 若该方法返回0,则表示当前对象与对象o相等。一般应使该方 法返回0的逻辑与equals方法返回true的逻辑一致。 ② 若返回正数,则表示当前对象大于对象o。 ③ 若返回负数,则表示当前对象小于对象o。
12.1 核心接口
Ø 遍历容器
后续演示程序使用到的类:
1、产品类:Product.java
2、产品工具类:ProductUtil.java
12.2 常用集合类
Ø 哈希集合:HashSet和LinkedHashSet
哈希集合根据哈希码来存取集合中的元素。
集合中不允许出现重复元素,当向哈希集合中添加一个元素时, 其如何判断该元素是否已在集合中存在? 1、虚拟机调用x的hashCode方法 计算出该元素的哈希码h。 2、若h与集合中所有元素的哈希码均不相同,则说明x不存在。 3、若h与集合中某个元素e的哈希码相同,则继续调用x.equals(e) 进一步判断——若equals方法返回true,则说明x存在,否则x不存 在。
Map未继承Collection接口。
Map不允许包含重复的键——因为键是用来唯一标识键值对的。
12.1 核心接口
Ø 遍历容器
按照某种次序将容器中的每个元素访问且仅访问一次(也称为迭 代),有4种方式。
1. 将容器转换为数组
12.1 核心接口
Ø 遍历容器
2. 使用迭代器接口——Iterator 迭代器是一种允许对容器中元素进行遍历并有选择地删除元素的 对象,其本身并不是容器。迭代器以java.util.Iterator接口描述, 一般通过Collection接口的iterator方法得到。
12.1 核心接口
Ø 集合接口:Set 用以描述不能包含重复元素的集合型容器。
Set有一个常用的子接口SortedSet(有序集合),后者所 描述的集合中的所有元素按某种顺序呈升序排列,这种 顺序既可以是元素的自然顺序,也可以是根据创建集合 时指定的比较器所定制的比较规则而得到的顺序。
12.1 核心接口
因此,若重写了元素对应类的equals或hashCode方法中的某一个, 则必须重写另一个,并且要保证二者具有相同的判等逻辑——两 个使equals方法返回true的对象的哈希码总是相同的。
12.2 常用集合类
Ø 哈希集合:HashSet和LinkedHashSet
HashSet实现了Set接口,并且不保证元素的迭代顺序。
容器框架是用于描述和操作各种容器的统一架构 ,意义在于: 1. 简化编程:容器框架提供了丰富的数据结构和功能,使得编
程者能将更多的精力放在软件的业务而不是这些功能的实现 细节上。 2. 保证代码质量和运行效率:容器框架中的各种数据结构和算 法已经被广泛测试,相对于编程者自己实现这些数据结构和 算法来说,直接使用容器框架所编写的代码具有更高的质量 和更好的性能。 3. 支持跨API的互操作:编程语言的很多API在设计时就考虑了 对 容 器 框 架 的 支 持 。 例 如 , Swing中 的 JList组 件 支 持 以 Hashtable。
JAVA语言程序设计
第12章 容器框架与泛型
12.1 核心接口 12.2 常用集合类 12.3 案例实践13:产品排序 12.4 常用列表类 12.5 常用映射类 12.6 遗留容器类 12.7 容器工具类 12.8 泛型
第12章 容器框架与泛型
Java中的容器能够将若干元素按照某种方式组织为一个整体,以 方便对这些元素进行添加、删除、修改和查找等操作,前述第4 章的数组其实就是一种原始的容器。
12.1 核心接口
Ø 遍历容器
3. 使用size和get方法 与方式1类似,先获得容器内元素的总个数,然后依次取出每个位 置上的元素并访问之。
12.1 核心接口
Ø 遍历容器
4. 使用增强型for循环 尽管Collection作为容器框架的根接口定义了toArray、iterator和 size等方法,但并非所有的容器实现类都重写了这些方法,此外, 某些容器实现类不支持方式3中的get方法,故上述3种遍历方式各 自都有一定的局限性。
LinkedHashSet(链式哈希集合)继承自HashSet,其也是根据元 素的哈希码来决定元素的存储位置。
与HashSet不同的是,LinkedHashSet使用指针(即链)来维护元 素的次序,以保证其迭代顺序与添加元素的顺序一致。
【例12.1】哈希集合演示。
12.2 常用集合类
Ø 树形集合:TreeSet
有 3个 常 用 的 Map接 口 实 现 类 ——HashMap、 LinkedHashMap和 TreeMap。
Ø 哈希映射:HashMap和LinkedHashMap
哈希映射根据哈希码来存取映射中的元素。
HashMap实现了Map接口,其不保证元素的迭代顺序。
LinkedHashMap(链式哈希映射)继承自HashMap并实现了Map 接口,LinkedHashMap使用指针(即链)来维护元素的次序以保 证迭代顺序。
Ø 顺序列表:ArrayList
ArrayList的实质是基于可变长度数组的列表实现。
【例12.2】对包含若干产品的顺序列表进行添加、删除、修改和 查找等操作。
12.4 常用列表类
Ø 链式列表:LinkedList
LinkedList也实现了List接口,其实质是基于指针 (即链) 的列表实 现,简称为链表。
Ø 列表接口:List
列表可以包含重复的元素,并允许用户根据元素的索引(类似于 数组的下标)来访问元素。
【表12-3 】
Ø 队列接口:Queue
用以描述队列型容器——只允许在列表的两端分别做添加和删除 元素的操作,其中,允许删除元素(出队)的一端称为“队头”, 允许添加元素(入队)的另一端称为“队尾”,故队列具有FIFO( First In First Out,先进先出)特性。
12.1 核心接口
Ø 容器根接口:Collection