1.异常:
(1)try:执行可能产生异常的代码
(2)catch:捕获异常
(3)finally:无论是否发生异常,代码总能执行throw:抛出异常,位于方法体内部,可作为单独语句使用,抛出一个异常对象,且只能是一个
(4)throws:声明方法内抛出了异常,必须跟在方法参数列表后面,不能单独使用,声明抛出异常类型,可以跟多个异常。
(5)调用方法输出异常信息:e.printStackTrace();
(6)异常对象常用的方法:voidprintStackTrace()输出异常的堆栈信息
(7)StringgetMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分
(8)Exception异常层次结构的父类
①ArithmeticException算术错误情形,如以零作除数
②ArrayIndexOutOfBoundsException数组下标越界
③NullPointerException尝试访问null对象成员
④ClassNotFoundException不能加载所需的类
⑤IllegalArgumentException方法接收到非法参数
⑥ClassCastException对象强制类型转换出错
⑦NumberFormatException数字格式转换异常,如把"abc"转换成数字
(9)引发多种类型的异常
排列catch语句的顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句演使用多重catch处理异常
异常分为Checked异常和运行时异常 Checked异常必须捕获或者声明抛出 运行时异常不要求必须捕获或者声明抛出 try-catch-finally中存在return语句的执行顺序
2.集合:
父接口Collection
子接口List
ArrayList:
线程不安全,多个线程同时访问同一个集合对数据结果不确定。
基于可变长度的数组,有下标的,访问快,随机访问或者查询效率高。
删除和修改效率低,因为需要涉及到移动元素,复制数组。
当我们需要对一些数据频繁查询的时候,删除和修
改少的时候,使用ArrayList最为合适。
3.List接口的实现类:
(1)Vector和ArrayList一样,底层也是Object类型的数组,当我们调用无参构造方法的时候,初识长度直接赋值为10,扩容是原来集合长度的两倍。
(2)Vector是源自于JDK1.0,线程安全的,效率低。
(3)ArrayList源自于JDK1.2,非线程安全的,效率高。实际开发中我们通常使用多态的方式来创建对象,目的是为了以后方便代码维护。LinkedList:数据结构是基于双向链表的,每一个元素中包含元素本身和上一个元素的地址,下一个元素的地址。非线程安全的,增删,修改快,因为不需要移动元素,直接修改指针指向新的引用即可,查询效率低,没有初始化大小,理论上说没有数据大小上限。在我们需要遍历LinkedList结构的时候,千万不要使用普通for循环使用get来获取元素,因为每次获取一个对应的元素,都需要找到它相邻的那个元素,以此类推。
(4)LinkedList中的get方法是将当前的表结构中的元素一分为二去进行查找,即便如此,插叙效率也很低。
(5)ArrayList、Vector、LinkedList使用场景:ArrayList使用率较高,因为我们大多数系统中都是查询多,删除添加较少。指定位置添加、删除、正常添加要涉及到扩容,复制数组…效率低。比如我们经常访问的购物网站,查询很多次,才下单,下单相当于修改的操作或者删除。
(6)Vector和ArrayList特点是一样的,唯一区别就是线程安全,在我们需要线程安全的系统中,并且查询较多可以使用这个。
(7)LinkedList删除、添加效率高,因为不需要移动元素,查询较慢,不过我们使用增强for循环和迭代器相对而言,能够提高查询效率。
双向链表:增删快,查询慢,线程不安全。
单向链表:每一个元素都包含下一个元素的地址,也就是说我们可以通过当前元素,找到下一个,但是不能 找到上一个元素。
增强for循环和迭代器,在遍历线性表的时候,差异不大,因为有下标的存在。
4.泛型:
创建集合的时候,直接写在接口名称或者类名之后<类型>,表示规范约束我们当前的集合中的数据类型,统一。
在类声明的时候使用,这种方式表示创建当前类对象的时候,可以传入一个具体的类型,供当前类中的所有方法使用,起到一个约束并且便捷操作的效果。
声明接口的时候使用,这种方式表示在创建实现类的时候可以传入一个具体的类型,供当前接口中的所有方法使用,起到一个约束并且便捷操作的效果。
形参列表中使用泛型:
异常、集合、泛型
最新推荐文章于 2024-09-16 20:08:29 发布