拉勾网《32个Java面试必考点》学习笔记之三------设计模式与Java语言特性
本文为拉勾网《32个Java面试必考点》学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频《32个Java面试必考点》.若本文侵犯了相关所有者的权益,请联系:[email protected]将会删除相关内容
设计模式
该内容需掌握主要两点
- 常用设计模式的实现
- 各设计模式的使用场景
常用设计模式有单例模式,工厂模式,代理模式,构造者模式,责任链模式,适配器模式,观察者模式等.
在回答设计模式问题时,可结合实际业务场景,体现对设计模式的理解和应用能力.
单例模式线程安全实现的常见三种方法:
- 静态初始化(饿汉).不管是否使用都会创建
- 双检锁(懒汉).单例变量必须要用volatile修饰.
- 单例注册表.spring中bean的单例模式就是用该方法实现.
工厂模式在实际业务中经常用到,也是面试的主要考察点.是创建不同类型实例常用的方式.
spring中的bean都是由不同工厂类创建的.
代理模式在不适合或不能直接引用另一个对象的场景,可以用代理模式对被代理的队形进行访问行为的控制.Java的代理模式分为静态代理和动态代理,静态代理是指在编译时就创建好的代理类,例如在源代码中编写的类.动态代理指在JVM运行过程中动态创建的代理类,如JDK动态代理,CDLIB,javaasist等.
例如,在Mybatis中getMapper时会通过MapperProxyFactory及配置文件动态生成的Mapper代理对象,代理对象会拦截Mapper接口的方法调用,创建对应方法的MapperMethod类并执行execute方法,然后返回结果.
责任链模式类似工厂流水线,其中的每个节点完成对对象的某一种处理.
Netty框架的处理消息的Pipeline就是采用的责任链模式.
适配器模式类似于转接头,将两种不匹配的对象进行适配,也可以起到对两个不同的对象进行解耦的作用.
SLF4J可使项目与Log4、logback等具体日志实现框架进行解耦,其通过不同适配器与不同框架进行适配,完成日志功能的使用.
观察者模式也可称为发布订阅模式,适用于一个对象某个行为需要触发一系列操作的场景.
GRPC中stream流式请求的处理.
构造者模式适用于一个对象拥有很多复杂的属性,需要根据不同情况创建不同的具体对象.
创建Protocol Buffer对象时,需要用到Builder
Java语言特性
常见集合类和Java并发工具包(JUC)是常见考点
ps.JUC在后面会有详细讲解.
集合类主要掌握如何实现.
动态代理与反射是java语言的特色,需要掌握动态代理与反射的使用场景.
ORM框架中会大量使用代理类,PRC调用时使用反射机制调用实现类的方法.
数据类型也是面试的常见问题.如每种数据类型占用多大空间,数据类型的自动转换与强制转换,基础数据类型与Wrapper数据类型的自动装箱与拆箱等.
对象引用(可自行搜索)
Java基础常考点–Map
能考查到数据结构,java的基础实现以及对并发问题的处理思路的掌握程度.
HashMap
-
通过数组加链表实现.
数组中的元素为一个链表,通过计算存入对象的hashcode,确认存入位置,用链表解决散列冲突.链表的节点存入的是键值对.
-
填充因子的作用
-
Map扩容的rehash机制
-
容量是二的幂次方.
是为了方便按位与操作计算余数,比求模更快
-
多线程风险的原因
对线程put时,会在超过填充因子的情况下rehash.HashMap为避免尾部遍历,链表插入采用头插法,多线程场景下可能产生死循环.
ConcurrentHashMap
-
分段锁思想
1.7中采用segment分段加锁,降低并发锁定程度.
-
CAS自旋锁
1.8中采用CAS自旋锁(一种乐观锁实现模式)提高性能.但在并发度较高时,性能一般.
-
红黑树
1.8引入红黑树解决hash冲突时的链表查找问题.在链表长度大于8且总容量大于64时启用.扩容后链表长度小于6时重新转为一般链表.(8,6,64为默认参数)
Java版本特性
1.8
- Lambda表达式
- StreamAPI
- 方法引用
- 接口默认方法
- Metaspace替换PremGen
1.9-1.10
- 模块系统
- 默认G1回收器
- 接口私有方法
- 局部变量判断
- Graal编译器
1.11
- ZGC
- 字符串API增强
- 内建HTTP Client
面试考察点
- 基本概念和基本原理
要求:正确清晰
- 网络协议4/7层模型的概念
- TCP协议流量控制的实现原理
- 等
- 实现方法和使用方式
- HashMap在JDK1.8中的实现方式
- 单例模式有哪几种实现方式,什么场景该使用静态方法实现,什么场景该使用双检锁实现
- 等
- 经常用到的知识点
- 常用的Linux命令有哪些,用来解决什么样的问题
- 等
- 实际应用中容易犯错的点
- ==与equals区别是什么
- 对象强引用使用不当会导致内存泄露,考察不同引用方式和作用的理解
- 等
- 与面试方向相关的知识点
- 中间件:存储,网络相关的考察
- 等
加分项
- 知识点与典型的业务场景关联.
如,谈到设计模型时,可以讲XX框架在解决XX问题时使用了那种设计模式.
- 以反例来描述实际场景中误用的危害.
如,大量使用反射会影响性能.
- 与知识点相关的优化点.
如,讲到tcp建连和断连时,如遇到洪水攻击或大量TIME_WAIT时,可以调整系统参数预防.
- 与知识点相关的最新技术趋势.
如,讲到ConcurrentHashMap,可以介绍1.8的改进细节.
或,讲到HTTP时,能说出HTTP2和QUIC的特点和实现.
- 在了解的前提下,尽量增加回答内容深度.
如,讲到tcp的滑动窗口时,能讲到流量与拥塞控制,进一步能指出解决拥塞的不同算法.
ps.面试官可能会顺着细节追问,回答不上来会适得其反.
真题汇总-1
- 进程和线程的区别和联系
从资源占用,切换效率,通信方式等方面解答
- 简单介绍一下进程的切换过程
线程上下文的切换代价,要回答,切换会保存寄存器,栈等线程相关的现场,需要由用户态切换到内核态,可以用vmstat命令查看线程上下文的切换状况
- 你经常使用哪些Linux命令,主要用来解决哪些问题?
参考之前操作系统汇总中提到的命令
- 为什么TCP建连需要3次握手而断连需要4次?
参考之前内容
- 为什么TCP关闭链接时需要TIME_WAIT状态,为什么要等2MSL?
参考之前内容
- 一次完整的HTTP请求过程是怎样的?
DNS解析,TCP建连,HTTP请求,HTTP响应等.
真题汇总-2
- HTTP2和HTTP的区别有哪些?
- 在你的项目中你使用过那些设计模式?主要用来解决哪些问题?
- Object中的equals和hashcode的作用分别是什么?
- final,finally,finalize的区别与使用场景
- 简单表述一下Java的异常机制
- 先上使用的那个版本jdk,为什么使用这个版本(有什么特色)?