# Tjisejava0322 **Repository Path**: wang-junjie123/tjisejava0322 ## Basic Information - **Project Name**: Tjisejava0322 - **Description**: JAVA基础:集合 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-22 - **Last Updated**: 2021-03-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # tjise2_java20210322 #### 介绍 Java基础:异常、集合、IO流 #### 软件架构 软件架构说明 #### 课堂笔记 1. 异常 ```aidl 1.1 异常的概念 在jvm中有一个抛出信息的行为规范类 Throwable 类; jvm通过该接口向外部抛出运行时发生信息; Throwable有两个实现子类: Error: 错误,是jvm在运行过程中不应该发生的严重问题;一般会影响jvm继续运行,且是不可控的; Exception: 异常,是jvm在运行过程可以捕获的可以处理可以预料一些问题;一般异常不会影响jvm继续运行;但是异常需要进行捕获处理; 1.2 异常的分类 根据发生的时机分为: 编译时异常:发生在编译阶段的异常;要求必须进行异常处理,否则无法通过编译; 也叫作 检查性异常; 运行时异常:发生在运行阶段的异常;不要求进行异常处理,【一般通过良好的编程规范来进行规避】,数组越界异常、除数为0异常、空指针异常 根据异常是否需要进行预处理: 检查性异常:要求在编码时必须进行显式的异常处理;也叫作 编译时异常; 非检查型异常: 在编码是不要求记性显式的异常处理,但是在运行时会发生的异常; 也叫作 运行时异常; 1.3 异常的处理机制 非检查性异常【运行时异常】:注意编程规范;编程习惯; 其实也可以进行显式的异常处理; 异常处理机制一般是针对编译时异常【检查性异常】而言: 1)try-tach异常处理机制 try{ // 可能发生异常的语句块 }catch(要捕获的异常1 e){ // 捕获到了异常,在这里进行异常处理 }catch(要捕获的异常2 e){ // 捕获到了异常,在这里进行异常处理 }catch(要捕获的异常3 e){ // 捕获到了异常,在这里进行异常处理 }finally{ // 收尾处理 } 解析: try是可能发生的异常部分; catch是进行异常捕获处理的部分;catch() 括号中的异常类型是本catch块处理的异常类型; 可以有多个catch块进行多种异常处理,但是要去catch块处理的异常范围要从小到大排列; finally部分是进行资源回收收尾工作处理的, 无论是否发生异常,finally部分都会被执行; 多个catch语句块也可以合并为: catch(异常1|异常2|异常3 e) 但是,要求异常1、异常2、异常3之间不能有父子类的包含关系; 2)throws 异常处理机制 在方法声明的同时,使用throw将本方法中可能发生的异常向上层方法调用者抛出,由其进行处理;淡然,上层方法可以继续向上抛,直到jvm; throw 关键字的使用: throw关键字是可以手动生成一个一场对象,然后手动抛出; 注意,throw出来的异常对象需要进行显式的异常处理;一般和throws搭配使用; 使用throw和throws进行搭配,一般在业务逻辑上用于两层方法之间的信息交互;【如果被调用的方法出现了异常,则会采用其他方案进行处理】 自定义异常: 一般通过继承和重写Exception类来进行自定义异常; ``` 2. 集合 ```aidl 2.1 集合的概念 java集合是按照一定规则存储的数据集;集合要求存储的都是对象类型;因为基本类型有包装类型,且可以自动装箱,所有集合通过包装类类型可以兼容基本类型; 集合的不同的存储方式造成集合的不同的特性; 常见的集合的存储方式【储存数据结构】: hashmap方式:所有数据在集合的存储单元中采用hash散列的方式进行存储; 链表方式:数据以双向链表的形式进行储存; 树型方式:数据以二叉树【红黑树】方式进行储存; 集合不同的存储方式造成了集合具有不同的特性; 学习集合从以下几个方面进行: 集合中的元素是否有序?【有序:取出的顺序和存入顺序一致】 集合中的元素是否排序?【排序:按照自然顺序进行排列,整数顺序、字典顺序】 集合中的元素是否重复? 集合中的元素是否可以为null?【能不能存入null值?】 集合的这几个方面的特性由其底层的存储结构范式决定。 2.2 Collection接口 Collection接口规范的线性一维数据集的特性; 常用的代表性子接口有:Set接口、List接口; Set接口:Set是一组使用hash散列储存储的结合;s HashSet实现子类: 使用hash散列存储,没有下标,所以无法使用下标遍历; HashSet继承了Iterator接口,所以可以使用迭代器的方式进行遍历; 集合中的元素是否有序? 否 集合中的元素是否排序? 否 集合中的元素是否重复? 否 集合中的元素是否可以为null? 是 LinkedHashSet实现子类: 使用双向链表存储,没有下标,所以无法使用下标遍历; HashSet继承了Iterator接口,所以可以使用迭代器的方式进行遍历; 集合中的元素是否有序? 是 集合中的元素是否排序? 否 集合中的元素是否重复? 否 集合中的元素是否可以为null? 是 TreeSet实现子类: 使用红黑树【平衡二叉树】存储,没有下标,所以无法使用下标遍历; HashSet继承了Iterator接口,所以可以使用迭代器的方式进行遍历; 集合中的元素是否有序? 否 集合中的元素是否排序? 是 集合中的元素是否重复? 否 集合中的元素是否可以为null? 否 注意:存入TreeSet中的元素要么实现了Comparatable接口;要么使用Comparator接口作为构造参数创建Set对象; 总结: 使用Hash散列存储的集合特性:元素无序;不排序;可以为null,不重复; 使用双向链表存储的集合特性:元素有序;不排序;可以为null,不重复; 使用二叉树【红黑树】存储的集合特性:元素无序;排序;不可以为null,不重复; Set接口的实现类中最多只能存储一个null值; List接口: 是一组有序序列的数据集合; 一般底层存储使用数组和链表实现; 具有下标索引,可以像数组一样使用下标进行遍历; List接口的实现类中可以存储多个null值; ArrayList: 底层使用数组进行存储; LinkedList: 底层使用双向链表进行存储; 总结: ArrayList和LinkedList的使用方法是一样的; 区别在于应用场景不同: ArrayList底层是数组实现: 对于元素的存取速度快;增删速度慢; 如果存取操作多于增删操作,则使用ArrayList; LinkedList底层是双向链表实现: 对于元素存取速度慢;增删速度快; 如果增删操作多余存取操作,则使用LinkedList; 2.3 Map接口 Map接口和Collection接口是并列的; Collection中存储的是线性的单个元素对象; Map中存储的是线性的成对的元素对象; 这个成对的元素对是一个整体,进行线性存储; Map中存储的一个元素单元是一个键值对【key-value】; Map键值对中的value可以是任意对象类型; Map中有一个内部类接口 Entry 用于封装键值对; Map集合是对键值对类Entry进行操作的; Map存储的时候是对键值对的Key值进行管理; Map是对键值对中的Key进行hash散列存储的; Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。【Map可以转换为Collection集合】 Map集合的遍历是将Map集合转换为Collection的键集、值集、Entry集的遍历; HashMap实现子类: 使用hash散列存储,没有下标,所以无法使用下标遍历; 集合中的键值对中的key值是否有序? 否 集合中的键值对中的key值是否排序? 否 集合中的键值对中的key值是否重复? 否 集合中的键值对中的key值是否可以为null? 是 LinkedHashMap实现子类: 使用双向链表存储,没有下标,所以无法使用下标遍历; 集合中的元素是否有序? 是 集合中的元素是否排序? 否 集合中的元素是否重复? 否 集合中的元素是否可以为null? 是 TreeMap实现子类: 使用红黑树【平衡二叉树】存储,没有下标,所以无法使用下标遍历; 集合中的元素是否有序? 否 集合中的元素是否排序? 是 集合中的元素是否重复? 否 集合中的元素是否可以为null? 否 注意:存入TreeMap中的元素要么实现了Comparatable接口;要么使用Comparator接口作为构造参数创建Set对象; 2.4 泛型 泛型是对某一类未知的类型的统称;在集合中使用泛型来表示集合可以处理的类型范围; 编程规范:要求在能够明确泛型的地方一定要使用明确的泛型,可以减少不必要的非检查性异常; 泛型也有一些操作符: super etendes ? 等等【了解】 重点掌握泛型的使用; 在集合中如果指明了泛型类型可以避免一些强制的类型溯型; 如果集合指明了泛型,则该集合只能处理该类型的值; 如果指明泛型,泛型默认的类型是Object类型; 2.5 集合工具类、Comparator和Comparable接口的使用 Collections工具类中的常用的方法; Comparator和Comparable接口的使用; Comparable接口:是一个规范两个对象之间进行比较的行为接口;定义一个比较方法;如果某个类想要具有相互比较的行为能力,则需要实现该接口; ``` 3. IO流 ```aidl 3.1 IO流 IO流就是输入输出流:相对于处理来说,流入处理器的流叫做输入流;从处理流出到外部设备的流就是输出流; 分类: 根据流向:分为输入流和输出流; 根据流的数据单位:字节流和字符流; 字节流是以字节byte作为传输单位,是由二进制组成的;也叫作二进制字节流;不一定支持中文编码; 字符流是以字符char作为传输单位,是有char类型的字符组成的;支持中文编码; 根据功能分类; 3.2 File文件工具类 File工具类是专门用于处理文件的工具类;文件包括:目录和文档; 掌握File工具类常用的方法;【API】 文件路径的分隔符: windows使用 \ ,需要进行转义处理; 转义字符,构成编程语言基本要素的一些符号,如果使用到字符串中需要进行转义处理;形式 \被转移的字符 例如: " ' \ 等等 需要使用 \" \' \\ 进行转义 Unix使用 / 作为分隔,不需要进行转义,当然windows也进行了兼容; 绝对路径和相对路径: 绝对路径: 对于 UNIX 平台,绝对路径名的前缀始终是 "/"。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 "/" 且名称序列为空。 对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 ":" 组成。如果路径名是绝对路径名,还可能后跟 "\\"。 相对路径: 现对于当前的位置到目标位置的路径过程; 一般使用 ./ 表示当前位置; ../ 表示当前位置的上级目录; ``` #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)