系统温习------黑马程序员Java+AI智能辅助编程全套视频教程
异常
异常代表程序出现的问题。
Java异常体系:

Error:代表系统级别错误。
Exception:异常,代表程序可能出现的问题,通常用Exception以及它的孩子来封装程序出现的问题。
运行时异常 :RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常。
编译时异常 :编译阶段就会出现错误提醒。提醒程序员这里的程序很容易出错。
异常的基本处理:
抛出异常(throws):在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。
捕获异常(try...catch):直接捕获程序出现的异常。


异常的作用:
异常用来定位程序bug的关键信息。
可以作为方法内部的一种特殊返回值 ,以便通知上层调用者,方法的执行问题。
一定要有返回值,但是返回又没有意义,此时可以返回一个异常给上层调用者,返回的异常还能告知上层调用者执行成功与否。



自定义异常:java无法为这个世界上全部的问题都提供异常类来代表,如果企业自己的某种问题想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。

1、继承Exception类做父类
2、重写Exception的构造器
3、哪里需要用这个异常返回,哪里就throw。

1、继承RuntimeException类做父类
2、重写RuntimeException的构造器
3、哪里需要用这个异常返回,哪里就throw。
异常的处理方案:
方案一:底层异常层层往上抛出 ,最外层集中捕获异常,记录下异常信息,并响应适合用户观看的信息进行提示。
方案二:最外层捕获异常后,尝试重新修复。


泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:<E>)称为泛型类、泛型接口、泛型方法,它们统称为泛型。
作用:泛型提供了在编译阶段约束所能操作的数据类型 ,并自动进行检查 的能力。这样可以避免强制类型转换,及其可能出现的异常。
本质:把具体的数据类型作为参数传给类型变量。
泛型类:

修饰符 class 类名<类型变量,类型变量,...>{ }
泛型接口:
修饰符 interface 接口名<类型变量,类型变量,...>{ }

类型变量建议用大写英文字母,常见的有E、T、K、V。
泛型方法:

修饰符 <类型变量,类型变量,...> 返回值类型 方法名(形参列表){ }

方法参数可以接一切类型
返回值不需要强制类型转换
通配符:就是"?",可以在**"使用泛型"的时候代表一切类型**。E、T、K、V在定义泛型的时候使用。
泛型的上下限:
泛型上限:?extends Car:?能接收的必须是Car或者其子类。
泛型下限:?super Car:?能接收的必须是Car或者其父类。
泛型不支持基本类型,只能支持对象类型(引用数据类型)。
原因è泛型擦除:泛型工作在编译阶段,等编译后泛型就没用了 ,所以泛型在编译后都会被擦除 ,所有类型会恢复成Object类型。
基本类型的数据 è 对象数据 (包装类)
包装类把基本类型的数据包装成对象的类型。

valueOf方法已经提前在缓存数组中封装好了-128到127的所有对象,这些对象是共享的,拿的都是同一个对象。


自动装箱:基本数据类型可以自动转换为包装类型。
自动拆箱:包装类型可以自动转换为基本数据类型。

包装类具备的其他功能:
把基本类型的数据转换成字符串类型 
把字符串类型的数值转换成数值本身对应的真实值 
集合框架
集合体系结构:Collection(单列集合) Map(双列集合)
Collection每个元素只包含一个值;Map每个元素包含两个值(键值对)。

List系列集合的特点:添加的元素是有序、可重复、有索引。
Set系列集合的特点:添加的元素无序、不重复、无索引。
Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。

toArray()默认转成的是Object类型的数组,而将其转为字符串数组需要添加参数:(String[ ]::new).
Collection集合的遍历方式:
①迭代器遍历。迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。
Collection集合获取迭代器的方法:

Iterator迭代器中的常用方法:


②增强for循环
格式:for(元素的数据类型 变量名 :数组或者集合){
}
增强for可以用来遍历集合或者数组。
增强for遍历集合,本质是迭代器遍历集合的简化写法。
③Lambda表达式



并发修改异常问题:遍历集合的同时又存在增删集合元素的行为时可能出现业务异常,这种现象被称之为并发修改异常问题。
解决并发修改异常问题的方案:
①如果集合支持索引 ,可以使用for循环遍历 ,每删除数据后做i-- ;或者可以倒着遍历 ;②可以使用迭代器遍历 ,并用迭代器提供的删除方法删除数据。
增强for循环/Lambda遍历均不能解决并发修改异常问题 ,因此它们只适合做数据的遍历,不适合同时做增删操作。
List集合特有的方法:List集合支持索引。

ArrayList与LinkedList底层采用的数据结构不同 ,应用场景不同。
ArrayList底层是基于数组 存储数据的。LinkedList底层是基于链表存储数据的。
数组的特点:
查询速度快(根据索引查询数据快):查询数据通过地址值和索引定位,查询任意数据耗时相同。
增删数据效率低:后面很多的数据需要前移。
ArrayList在第一次添加数据前,内部的数组长度为0;在第一次添加数据时扩容,扩容到10。元素加满后二次增长,增长的长度是老容量的1.5倍。
LinkedList底层原理:基于链表存储数据。
链表的特点:链表中的数据是一个一个独立的结点组成 的,结点在内存中是不连续 的,每个结点包含数据值和下一个结点的地址。
查询慢,无论查询哪个数据都要从头开始找 ;链表增删相对快。
LinkedList基于双链表 实现。特点:对首尾元素进行增删改查的速度极快。

LinkedList新增了很多首尾操作的特有方法。
LinkedList的应用场景之一:设计队列(队列只在首尾增删元素)
LinkedList的应用场景之一:设计栈(栈仅在首部增删数据)
ArrayList适用于查询比较多,增删相对少的业务场景。
LinkedList适用于查询比较少,增删相对多的业务场景。
电影信息管理模块

每部电影都是一个电影对象,设计电影类。
需要定义一个电影操作类,其对象专门用于处理电影数据的业务。
操作类中需要定义一个集合存放全部的电影对象。
电影操作类中有一个初始化菜单界面的启动方法;各项业务通过switch分支语句分割开来,用户通过输入指令执行特定业务。各项业务为独立功能应单独写各个方法。 注意封杀明星这项业务涉及到并发修改异常 ,本项目中集合采用ArrayList支持索引,故可采用倒着遍历 或者每次循环最后让循环变量回退一位即可。