# 1、受检异常和非受检异常的区别
非受检异常(unchecked exception):Error、RuntimeException
受检异常(checked exception):编译时异常IOException/SqlException
1、异常是主逻辑的补充逻辑,修改一个补充逻辑,就会导致主逻辑的修改,影响代码的规范和原则。
2、实现类的变更,它最终会影响调用者,破坏了一些封装性。
3、降低代码可读性。
# 3、从一道面试题了解Integer的实现
# 4、 动态代理原理分析
JDK动态代理是通过接口的方法名,在动态生成代理类里面去调用业务实现类的同名方法,去实现拦截。
CGlib动态代理是通过继承具体需要被代理的业务类,去动态生成业务类的子类,去重写业务方法,实现代理。
# 5、设计模式的优雅落地
软件设计六大原则:单一职责原则:优点:类的复杂度降低、可读性好、可维护性强、变更引起的风险降低
缺点:增加类或接口的维护成本
里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。
依赖倒置原则:通过抽象,使各个类或者模块实现彼此独立,互不影响,实现模块之间的松耦合。如:面向接口编程。
接口隔离原则:尽量保证接口的纯洁性、单一性。
开闭原则:对扩展开放,对修改关闭。
迪米特法则:尽量将被依赖的类的实现逻辑封装进类的内部 ,不对外暴露。
# 策略模式
落地支付网关
# 适配器模式
利用接口定义好规则,适配器实现接口,按接口规则接入各SDK,适配多套SDK,
# 工厂模式
# 6、从底层设计分析List和Set的区别
list有序且允许重复
set无序且不允许重复
HashSet/TreeSet 是对HashMap/TreeMapd的一个包装
ArrayList可变长度的动态数组(Object[] 默认长度10,扩容一次,长度变成原来的1.5倍。删除一个元素时,会让右边的元素全部左移一位)
# 7、从原理层面分析ClassLoader加载机制
我们都知道,我们写的程序是一个Java文件,然后最终会编译成一个class文件,通过若干个class文件,组织成一个完整的Java程序。当程序在运行的时候,调用一个main方法,作为一个入口,来执行程序的相关功能。
程序启动时,并不是一次性加载所有的class文件到内存中,而是根据程序的需要,通过类加载机制,去动态加载。
# 9、如何将一个Java对象序列化到文件中
# 10、乐观锁和悲观锁的原理及应用
锁:是一个同步机制,它是保证在多线程并行执行的时候,对共享资源访问的安全性。
乐观锁(CAS、数据库的version字段):每次获取或者修改共享资源数据时,认为是安全的,不会有锁的冲突。不会主动对共享资源加锁。但是在更新时,会判断是不是有其他线程对之前的数据做过变更。
悲观锁(synchronized锁):
# 11、BIO、NIO和AIO面试
Blocking IO同步阻塞IO
JDK1.4之前,Java.io,java.net都有对应的IO
IO:文件流,网络流
同步:是否要亲自去监听操作,不断进行关注:是否已经完成对应操作
阻塞:IO操作如果没有完成,在单线程的环境下,其他客户端是不能够连接上进行IO操作的。
JDK1.4之后,推出一个新的IO
NIO New IONon-Blocking IO 同步非阻塞的IO
非阻塞:不关心IO操作是否完成,直接返回
阻塞:在当线程的环境之后,如果IO操作没有完成,那么当线程就会等待,没有办法进行其他操作
AIO
异步的理解:用户触发了IO操作之后,就不关心,委托给操作系统进行完成,当操作系统完成这个IO操作之后,再告诉自己就OK。
# 12、Spring中对象注入的几种方式及区别
set注入:
构造注入:
静态工厂注入
# 13、Mysql数据库的隔离级别及其区别
事务具备ACID(原子性、一致性、隔离性、持续性)
事务并发问题:1.脏读、不可重复读( 修改)、幻读(新增或删除)
# 14、MySql有哪些存储引擎,区别?InnodbMyisam存储文件.frm表定义文件
.lbd数据文件.frm表定义文件
.myd数据文件
.myi索引文件
锁表锁、行锁表锁
事务ACID不支持
CRUD读、写读多
count扫表有专门存储的地方
索引结构B+TreeB+Tree