一、Java的异常体系

◆RuntimeException :不可预知的,程序应当自行避免
◆非RuntimeException :可预知的, 从编译器校验的异常

1.Error和Exception的区别
从概念角度解析Java的异常处理机制
➢Error :程序无法处理的系统错误, 编译器不做检查
➢Exception : 程序可以处理的异常,捕获后可能恢复
➢总结:前者是程序无法处理的错误,后者是可以处理的异常

从责任角度看:
Error属于JVM需要负担的责任;
RuntimeException是程序应该负担的责任;
Checked Exception可检查异常是Java编译器应该负担的责任;

2.常见Error以及Exception
RuntimeException
1.NullPointerException -空指针引用异常
2.ClassCastException -类型强制转换异常
3.IlegalArgumentException -传递非法参数异常
4.IndexOutOfBoundsException -下标越界异常
5.NumberFormatException -数字格式异常
非RuntimeException
1.ClassNotFoundException -找不到指定class的异常
2.IOException – IO操作异常
Error
1.NoClassDefFoundError -找不到class定义的异常
2.StackOverflowError -深递归导致栈被耗尽而抛出的异
3.OutOfMemoryError -内存溢出异常

3.NoClassDefFoundError的成因
1.类依赖的class或者jar不存在
2.类文件存在,但是存在不同的域中
3.大小写问题, javac编译的时候是无视大小写的,很有可能编译出来的class文件就与想要的不一样

4.Java的异常处理机制
➢抛出异常:创建异常对象,交由运行时系统处理
➢捕获异常:寻找合适的异常处理器处理异常,否则终止运行

5.Java异常的处理原则
具体明确:抛出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因;
提早抛出:应尽可能早的发现并抛出异常,便于精确定位问题;
延迟捕获:异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域来处理异常。

6.高效主流的异常处理框架
在用户看来,应用系统发生的所有异常都是应用系统内部的异常
➢设计一个通用的继承自RuntimeException的异常来统一处理
➢其余异常都统一转译为上述异常AppException
➢在catch之后,抛出上述异常的子类,并提供足以定位的信息
➢由前端接收AppException做统一处理

7.try-catch的性能
Java异常处理消耗性能的地方
try-catch块影响JVM的优化
异常对象实例需要保存栈快照等信息,开销较大

二、Java集合框架

1.数据结构考点
数组和链表的区别;
链表的操作,如反转,链表环路检测,双向链表,循环链表相关操作;
队列,栈的应用;
二叉树的遍历方式及其递归和非递归的实现;
红黑树的旋转;

2.算法考点
内部排序:如递归排序、交换排序(冒泡、快排)、选择排序、插入排序;
外部排序:应掌握如何利用有限的内存配合海量的外部存储来处理超大的数据集,写不出来也要有相关的思路。

3.Java集合框架

HashMap : put方法的逻辑
1、如果HashMap未被初始化过,则初始化
2、对Key求Hash值,然后再计算下标
3、如果没有碰撞,直接放入桶中
4、如果碰撞了,以链表的方式链接到后面
5、如果链表长度超过阀值,就把链表转成红黑树
6、如果链表长度低于6 ,就把红黑树转回链表
7、如果节点已经存在就替换旧值
8、如果桶满了(容量16*加载因子0.75) , 就需要resize (扩容2倍后重排)

因为HashMap几乎是面试必问,涉及方面太多不做具体整理,需要自己从网上搜集有关的问题进行学习,下面只做重点的梳理
成员变量:数据结构,树化阈值
构造函数:延迟创建
put和get的流程
哈希算法,扩容,性能

ConcurrentHashMap : put方法的逻辑
1.判断Node[]数组 是否初始化,没有则进行初始化操作
2.通过hash定位数组的索引|坐标,是否有Node节点,如果没有则使用CAS进行添加(链表的头节点) , 添加失败则进入下次循环。
3.检查到内部正在扩容,就帮助它一块扩容。
4.如果f!=null ,则使用synchronized锁住f元素(链表/红黑二叉树的头元素)
4.1如果是Node(链表结构)则执行链表的添加操作。
4.2如果是TreeNode(树型结构)则执行树添加操作。
5.判断链表长度 已经达到临界值8 ,当然这个8是默认值,大家也可以去做调整,当节点数超过这个值就需要把链表转换为树结构。

ConcurrentHashMap同样也是面试常问,涉及知识点也很多,建议多花时间到网上搜索相关内容学习。

4.HashMap、Hashtable、 ConccurentHashMap三者的区别
➢HashMap线程不安全, 数组+链表+红黑树
➢Hashtable线程安全, 锁住整个对象 ,数组+链表
➢ConccurentHashMap线程安全, CAS+同步锁,数组+链表+红黑树
➢HashMap的key、 value均可为null ,而其他的两个类不支持

以上为博主面试几乎必问问题,还有的问题比较冷门也比较复杂,不一一列出,大部分都属于Java基础的扩展部分,建议多在此处下下功夫。