复习巩固近期所看知识点。
知识点巩固复习
AOP配置
- 切面实现了跨多个应用对象逻辑的模块化;
- AOP配置就是动态代理的典型应用;
- AOP配置共有三种方式,基于API,基于注解,基于XML配置文件;
- 基于API的配置方式需要定义拦截类实现相关接口,并实现相关拦截方法,在xml中配置拦截规则,使用bean和property标签;
- 基于
@Aspect
注解,在对象类中添加要被拦截的方法,用@Aspect
注解表明是切面类,用@Pointcut
注解表明切点(拦截规则),使用@Before
、@After
等注解定义通知(拦截方法),xml配置中添加注解类; - 基于XML标签,配置拦截处理类,
<aop:config>
、<aop:pointcut>
标签配置拦截规则,<aop:aspect>
标签配置拦截方法; - 调用
getBean()
返回的是代理类的示例。
克隆
- 深克隆和浅克隆的根本差别;
Arrays.copyOf()
的原理;- 深克隆的三种实现方式,将父类和子类都实现克隆、字节流、JSON工具类;
- 实现克隆需要实现
Cloneable
接口,重写clone()
; - 利用字节流要求对象可以被序列化,否则会抛异常,
People p2 = (People) StreamClone.clone(p1)
; - 先调用
toJson()
、再调用fromJson()
,People p2 = gson.fromJson(gson.toJson(p1), People.class)
。
建造者模式
- 包含四个角色:抽象建造者,具体建造者,产品角色,指挥者;
- 抽象建造者主要有两种方法:创建复杂对象的组件,返回复杂对象;
- 具体建造者实现或继承抽象建造者,包含各个部件的具体构造方法和对象返回;
- 指挥者负责安排建造次序,将具体建造者作为参数传入指挥者的构造函数。
装饰着模式
- 构件和装饰类;
- 用煎饼的例子进行说明;
- 四个角色的关系:具体构件extends抽象构件,抽象装饰类extends抽象构件,具体装饰类extends抽象装饰类,所以其余三个角色都是抽象构件的子类。
模板模式
- 抽象方法,具体方法和钩子方法;
- 各个子类都一致的部分,定义为父类的具体方法,不一致则定义为抽象方法;如不同子类准备什么样的课件,在不同子类中具体实现,钩子方法可以与步骤挂钩,以决定步骤是否运行,如是否需要编写课堂笔记。
- 举例:HttpServlet即一套处理http请求的模板
单例模式
- 饿汉式和懒汉式区别和优缺点;
DCL
中为什么要double check?为什么要用volatile
修饰Singleton对象?- 静态内部类和枚举方式线程安全的原理;
适配器模式
- 对象适配器和类适配器的区别;
- 角色有三个:目标抽象类,适配器类,适配者类三者的关系;
- 电压适配器
ConcurrentHashMap
- JDK7和JDK8的区别;三个方面:数据结构,并发能力,并发安全
- put()和get()方法的原理和HashMap类似;
CopyOnWriteArrayList
- 适用的场景是什么?
- 原理:CopyOnWrite机制;
- 缺点和底层数据结构;
add()
、set()
、get()
三个方法的原理
SpringBoot
- Spring、SpringBoot、SpringCloud的区别?
- SpringBoot的启动流程
MySQL
- 执行流程;
- 如何选择数据库引擎?InnoDB:MyISAM:MEMORY
阻塞队列
- 常用的阻塞队列有哪些?
- 三组添加和移除方法;
LinkedBlockingQueue
、SynchronousQueue
、DelayedWorkQueue
、PriorityBlockingQueue
、ArrayBlockingQueue
ArrayBlockingQueue
安全并发的原理- 如何选择阻塞队列?
JUC
- JUC原子类的优势;
- 六大原子类;
- Atomic*基本类型原子类的方法,问题和改进;
- AtomicInteger和synchronized的区别?
- countDownLatch的两个应用场景。
线程
- 本质上说,线程只有两种实现方式;
Runnable
和Callable
的区别?- 线程停止的正确方式;
- 线程的六种状态如何相互转换?注意如何转换到BLOCKED
- wait()和sleep()方法的异同;
- 生产者消费者模式的三种实现;
- 为什么使用while循环判断队列状态而不是用if?
- Condition和wait()的关系
ThreadLocal
- ThreadLocal不是用来解决资源共享的;
- 关于static修饰符的两个注意点;
- ThreadLocal和sychronized的区别?
- 两个应用场景是什么?通过举例来进行表述;
- 怎么设置,获取
ThreadLocal
变量; Thread
ThreadLocal
ThreadLocalMap
的关系;get()
和set()
的底层原理;- 内存泄漏问题。
Redis
- 两种过期策略是?
- 内存淘汰策略;
- 分布式锁;
- 实现消息队列;
- 实现高可用的手段;
- 三种数据持久化方式;
- 什么是哨兵/主从模式?
Future
- Future类的运作流程;
- Future接口的五个方法;
- get()执行时可能发生的情况;
- cancel()方法可能的情况;
- FutureTask的用法。
JMM
- JMM的三大核心是什么?
- Java的原子操作有哪些?
- 什么叫可见性?
- 主内存与工作内存的关系。
CAS
- CAS的原理,用等价代码来解释;
- CAS在ConcurrentHashMap和原子类中的应用;
- CAS的缺点
AQS
- 为什么需要AQS?用hr和面试官的例子说明;
- AQS的三大核心部分;
- state在不同工具类中所表示的不同含义;