Java语言特性与设计模式
Java语言特性与设计模式
一,设计模式
常用设计模式的实现,设计模式的使用场景,每个设计模式用来解决什么样的问题;
三大类型,共23种;
常用设计模式
- 单例模式
- 工厂模式(常用,且为主要考察点)
Spring如何创建Bean - 代理模式:Motan服务的动态代理
用在不适合,不能直接引用另一个对象的场景,通过代理模式对被代理的对象进行访问行为的控制,分为静态代理(在编译是已经创建好了代理类)和动态代理(在JVM运行中动态创建的代理类)
动态代理:有JDK动态代理、CGLIB、JavaAsesst?
例子:在魔毯RPC中是使用JDK的动态代理通过反射把远程请求进行封装试服务看上去就在使用本地方法; - 构造者模式:PB序列化中的Builder
适用于一个对象有许多复杂的属性,需要根据不同的情况创建不通的具体对象 - 责任链模式:Netty消息处理的方式
像工厂的流水线,链上每一个节点完成对对象的某一种处理, - 适配器模式:SLF4J如何支持Log4J
类似于常见的转接头,把两种不匹配的对象进行适配,可以起到对不同的对象解耦的作用 - 观察者模式:GRPC是如何支持流式请求的
适用于一个对象的某个行为触发一系列的事件 - 其他模式
创建型的有五种:
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 单例模式(Singleton)
- 建造者模式(Bulider)
- 原型模式(Prototype)
结构型的有七种:
- 适配器模式(Adapter)
- 装饰器模式(Decorator)
- 代理模式(Proxy)
- 外观模式(Facade)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 享元模式(Flyweight);
行为型的有十一种:
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 观察者模式(Observer)
- 迭代器模式(Iterator)
- 职责链模式(Chain of Responsibility)
- 命令模式(Command)
- 备忘录模式(Memento)
- 状态模式(State)
- 访问者模式(Visitor)
- 中介者模式(Mediator)
- 解释器模式(Interpreter)
二,Java语言特性
常用集合
重点理解集合类的实现,如HashMap、TreeMap、ConcurrentHashMap的具体实现;
1. HashMap
2. ConcurrentHashMap
3. ArrayList&LinkedList
4. HashSet
5. TreeMap
HashMap
数组加链表实现的,数组中的每一项是一个链表通过计算存入对象的HashCode来计算对象在数组中要存入的位置,用链表来解决散列冲突,链表中的节点要存入的是键值对;
还需要知道填充因子的作用,与Map扩容的Rehash机制
容量大小是2的幂次方的原因是可以通过按位与操作来计算余数, 比求模(%)效率高
是非线程安全的,在多线程Put的情况下,在容量超过填充因子的情况下进行Rehash,因为HashMap为了避免尾部遍历在链表的插入时,是插入链表的头部,多线程场景下可能会产生死循环;
ConcurrentHashMap(线程安全)
使用分段锁思想来降低并发场景下的锁定发生频率,在JDK1.7和JDK1.8中实现差别非常大,
1.8中使用CAS自旋锁,是一种乐观锁模式,来提高性能,在并发度较高的场景下性能一般;
1.8中引入了红黑树,用来解决Hash冲突时链表的顺序查找问题;
红黑树的启动条件是,默认链表的长度大于8且Map容量大于64时转为红黑树方式
JUC(Java常用工具包)
在后面的多线程课程中详细讲解;
- ConcurrentXXX
- AtomicXXX
- Executor
- Caller&Future
- Queue
- Locks
动态代理与反射
需要了解动态代理与反射的使用场景,例如在ORM框架中会大量使用代理类,RPC调用时会使用反射机制调用实现类的方法;
数据类型
1. 空间占用
2. 基本数据结构
3. 自动转型与强制转型
4. 封箱与拆箱
对象引用
1. 强引用
2. 弱引用
3. 软引用
4. 虚引用
这些引用在GC时的处理策略不通
强引用:不会被GC回收
软引用:在空间不足时会被GC回收
弱引用:在每次GC时都会被回收
虚引用:必须和引用队列联合使用,用于跟踪一个对象被垃圾回收的过程
异常处理机制
try catch finally
- 异常时try catch的处理流程
- Error和Exception的区别
扩展知识点
扩展点适当了解
1. 注解处理机制
2. SPI机制
三,Java版本特性
V1.8(长期支持)
- Lanbda表达式
- Stream API(流式处理)
- 方法引用(进一步简化Lanbda表达式)
- 接口可以提供默认方法(可以简化掉一些简单的抽象类)
- Metaspace替换PermGen的永久代(方法区替换)
区别在于Metaspace并不在虚拟机中而是使用本地内存;
替换的目的是提升对原数据的处理,提升GC效率方便后续Hosbot?与Jroket合并;
V1.9-1.10
- 增加了模块系统
- 默认G1回收器
- 接口私有方法
- 局部变量推断
- Graal编译器
V1.11(最新的长期支持版本,未来的主要版本)
- ZGC(激动人心的功能,新的垃圾回收器)
为大内存堆设计,非常强悍的性能,10毫秒以下的GC停顿 - 字符串API增强(提供了字符赋值等功能)
- 内建HTTP Client
四,面试考察点
必要条件
- 基本概念和基本原理
正确的,清晰的,如网络协议的四七层模型,TCP协议的流量控制的实现原理等 - 常用的工具和模型,实现方式和使用姿势
如HashMap在1.8中的实现方式;
单例模式有哪几种实现方式,什么场景下该使用静态方法实现,什么场景下该使用双重检查实现 - 经常使用到的知识点
如常用的Linux命令有哪些,都用来解决什么样的问题; - 实际应用中容易犯错的点
==与equase的区别是什么
对象的强引用使用不当可能会导致内存泄露(对不同对象引用方式的作用) - 与面试方向相关的知识点
如面试中间件研发,可能会考察存储和网络等知识点考察
加分项
- 知识点与典型的业务场景或使用经验关联
如设计模式,不仅要说出设计模式和使用场景,还要能指出哪些著名框架在处理什么样的问题时使用了哪一种设计模式,自己在什么项目的什么场景时使用了哪种设计模式,取得了什么样的效果(这样才会给面试官留下好印象) - 以反例来描述实际场景中误用的危害
如介绍反射机制时,除了介绍反射的实现方式和应用场景外,还可以提到大量的使用反射会对性能产生负面影响,应避免滥用; - 与知识点相关的优化点
例如在介绍TCP建连与断连的时候能够指出线上出现大量Time_wait时可以调整系统参数来加快连接的回收与复用 - 与知识点相关的最新技术趋势
如在介绍ConcurrentHashMap时能够知道1.8版本的改进细节;
如在介绍HTTP时能够说出HTTP2或QUIC的特点和实现等; - 在了解的前提下,尽量增加回答内容深度
在介绍TCP的滑动窗口时能讲到流量与拥塞控制,进一步能指出不同的解决拥塞的算法;(会被追问,如没有详细了解可能适得其反)
四,真题部分
高频面试真题
- 进程与线程的区别和联系
- 简单介绍一下进程的切换过程
- 你经常使用哪些Linux命令,主要用来解决什么问题?
- 为什么TCP建连需要2次握手而断连需要4次?
- 为什么TCP关闭链接时需要TIME_WAIT状态,为什么要等2MSL?
- 一次完整的HTTP请求过程是怎样的?