异常的重要继承关系如图所示,其中
●
Throwable 是其它异常类型的顶层父类
●
Error 表示无法恢复的错误,例如 OutOfMemoryError 内存溢出、StackOverflowError 栈溢出等
○
这类异常即使捕捉住,通常也无法让程序恢复正常运行
●
Exception 表示可恢复的错误,处理方式有两种
○
一是自己处理,用 catch 语句捕捉后,可以进行一些补救(如记录日志、恢复初始状态等)
○
二是用 throw 语句将异常继续抛给上一层调用者,由调用者去处理
●
Exception 有特殊的子类异常 RuntimeException,它与 Exception 的不同之处在于
○
Exception 被称之为检查异常,意思是必须在语法层面对异常进行处理,要么 try-catch,要么 throws
○
RuntimeException 和它的子类被称为非检查异常(也可以翻译为字面意思:运行时异常),在语法层面对这类异常并不要求强制处理,不加 try-catch 和 throws 编译时也不会提示错误
●
常见的非检查异常有
○
空指针异常
○
算术异常(例如整数除零)
○
数组索引越界异常
○
类型转换异常
○
...重载是对象的方法之间,它们方法名相同,但方法的参数列表不同
●
重写是父子类(包括接口与实现类)中两个同名方法,它们方法名相同,且方法的参数列表相同
●
重载在编译阶段,由编译器根据传递给方法的参数来区分方法,例如
●
而重写是在运行阶段,由虚拟机解释器去获取引用对象的实际类型,根据类型才能确定该调用哪个方法,例如
●
有没有发生重写,可以使用 @Override 来检查
括号内的说明是为了严谨,自己知道就行,回答时不必说出,这样比较简洁
●
个人觉得,在回答方法重载时,不必去细说什么参数的类型、个数、顺序,就说参数列表不同就完了
●
个人觉得,重点在于点出:重载是编译时由编译器来区分方法,而重写是运行时由解释器来区分方法
●
语法细节,问了再说,不问不必说
○
重写时,子类方法的访问修饰符要 >= 父类方法的访问修饰符
○
重写时,子类方法抛出的检查异常类型要 <= 父类方法抛出的检查异常类型,或子类不抛异常
○
重写时,父子类的方法的返回值类型要一样,或子类方法返回值是父类方法返回值的子类
1.2 == 与 equals 的区别
异常的重要继承关系如图所示,其中
●
Throwable 是其它异常类型的顶层父类
●
Error 表示无法恢复的错误,例如 OutOfMemoryError 内存溢出、StackOverflowError 栈溢出等
○
这类异常即使捕捉住,通常也无法让程序恢复正常运行
●
Exception 表示可恢复的错误,处理方式有两种
○
一是自己处理,用 catch 语句捕捉后,可以进行一些补救(如记录日志、恢复初始状态等)
○
二是用 throw 语句将异常继续抛给上一层调用者,由调用者去处理
●
Exception 有特殊的子类异常 RuntimeException,它与 Exception 的不同之处在于
○
Exception 被称之为检查异常,意思是必须在语法层面对异常进行处理,要么 try-catch,要么 throws
○
RuntimeException 和它的子类被称为非检查异常(也可以翻译为字面意思:运行时异常),在语法层面对这类异常并不要求强制处理,不加 try-catch 和 throws 编译时也不会提示错误
●
常见的非检查异常有
○
空指针异常
○
算术异常(例如整数除零)
○
数组索引越界异常
○
类型转换异常
○
...
2、集合类
2.1 你知道的数据结构有哪些
线性结构
●
动态数组:相对于普通数组可以扩容
○
java 中 ArrayList 就属于动态数组
○
数组的特点是其中元素是连续存储的
●
链表:由多个节点链在一起
○
java 中的 LinkedList 就属于链表
○
链表的特点是其中元素是不连续存储的,每次需要根据当前节点,才能找到相邻节点
●
栈:符合 First In Last Out(先进后出)规则
○
java 中的 LinkedList 可以充当栈
○
它的 push 方法向栈顶添加元素
○
它的 pop 方法从栈顶移除元素
○
它的 peek 方法从栈顶获取元素(不移除)
●
队列:符合 First In First Out(先进先出)规则
○
java 中 LinkedList 也可以充当队列
○
它的 offer 方法用来向队列尾部添加元素(入队)
○
它的 poll 方法用来从队列头部移除元素(出队)
非线性结构
●
优先级队列:在队列基础上增加了优先级,队列会根据优先级调整元素顺序,保证优先级高的元素先出队
○
java 中 PriorityQueue 可以作为优先级队列
○
它底层用大顶堆或小顶堆来实现
○
它适用于实现排行榜、任务调度等编码
○
它特别适合于流式数据的处理,利用它能够大大节省内存
●
Hash 表(哈希表,也叫散列表):由多对 key - value 组成,会根据 key 的 hash 码把它们分散存储在数组当中,其中 key 的 hash 码与数组索引相对应
○
java 中的 HashMap,Hashtable 都属于哈希表
○
它特别适用于实现数据的快速查找
●
红黑树:可以自平衡的二叉查找树,相对于线性结构来说,拥有更好的性能
○
java 中的 TreeMap 属于红黑树
●
跳表:多级链表结构,也能达到与红黑树同级的性能,且实现更为简单
○
java 中的 ConcurrentSkipListMap 用跳表结构实现
○
redis 中的 SortedSet 也是用跳表实现
●
B+ 树:可以自平衡的 N 叉查找树
○
关系型数据库的索引常用 B+ 树实现
P.S.
●
以上数据结构不必全部掌握,根据自己实际情况,捡熟悉的回答即可
●
以上仅是这些数据结构的简述,关于它们的详细讲解,请参考黑马《数据结构与算法》课程:
○
上篇 https://www.bilibili.com/video/BV1Lv4y1e7HL
○
下篇 https://www.bilibili.com/video/BV1rv4y1H7o6