拉勾网《32个Java面试必考点》学习笔记之三------设计模式与Java语言特性

本文为拉勾网《32个Java面试必考点》学习笔记.只是对视频内容进行简单整理,详细内容还请自行观看视频《32个Java面试必考点》.若本文侵犯了相关所有者的权益,请联系:txzw@live.cn.将会删除相关内容

知识点汇总

该内容需掌握主要两点

  1. 常用设计模式的实现
  2. 各设计模式的使用场景

设计模式
常见集合类和Java并发工具包(JUC)是常见考点
Java语言特性

知识点详解


常用设计模式

单例模式,工厂模式,代理模式,构造者模式,责任链模式,适配器模式,观察者模式等.

在回答设计模式问题时,可结合实际业务场景,体现对设计模式的理解和应用能力.

单例模式

线程安全实现的常见三种方法:

	1. 静态初始化(饿汉).不管是否使用都会创建
	2. 双检锁(懒汉).单例变量必须要用volatile修饰.
	3. 单例注册表.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语言的特色,需要掌握动态代理与反射的使用场景.

      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

面试考察点

  1. 基本概念和基本原理
    要求:正确清晰

     * 网络协议4/7层模型的概念
     * TCP协议流量控制的实现原理
     * 等
    
  2. 实现方法和使用方式

     * HashMap在JDK1.8中的实现方式
     * 单例模式有哪几种实现方式,什么场景该使用静态方法实现,什么场景该使用双检锁实现
     * 等
    
  3. 经常用到的知识点

     * 常用的Linux命令有哪些,用来解决什么样的问题
     * 等
    
  4. 实际应用中容易犯错的点

     * ==与equals区别是什么
     * 对象强引用使用不当会导致内存泄露,考察不同引用方式和作用的理解
     * 等
    
  5. 与面试方向相关的知识点

     * 中间件:存储,网络相关的考察
     * 等
    

加分项

  1. 知识点与典型的业务场景关联.

     如,谈到设计模型时,可以讲XX框架在解决XX问题时使用了那种设计模式.
    
  2. 以反例来描述实际场景中误用的危害.

      如,大量使用反射会影响性能.
    
  3. 与知识点相关的优化点.

     如,讲到tcp建连和断连时,如遇到洪水攻击或大量TIME_WAIT时,可以调整系统参数预防.
    
  4. 与知识点相关的最新技术趋势.

     如,讲到ConcurrentHashMap,可以介绍1.8的改进细节.
     或,讲到HTTP时,能说出HTTP2和QUIC的特点和实现.
    
  5. 在了解的前提下,尽量增加回答内容深度.

     如,讲到tcp的滑动窗口时,能讲到流量与拥塞控制,进一步能指出解决拥塞的不同算法.
    

ps.面试官可能会顺着细节追问,回答不上来会适得其反.

真题汇总

  1. 进程和线程的区别和联系

     从资源占用,切换效率,通信方式等方面解答
    
  2. 简单介绍一下进程的切换过程

     线程上下文的切换代价,要回答,切换会保存寄存器,栈等线程相关的现场,需要由用户态切换到内核态,可以用vmstat命令查看线程上下文的切换状况
    
  3. 你经常使用哪些Linux命令,主要用来解决哪些问题?

     参考之前操作系统汇总中提到的命令
    
  4. 为什么TCP建连需要3次握手而断连需要4次?

     参考之前内容
    
  5. 为什么TCP关闭链接时需要TIME_WAIT状态,为什么要等2MSL?

     参考之前内容
    
  6. 一次完整的HTTP请求过程是怎样的?

     DNS解析,TCP建连,HTTP请求,HTTP响应等.
    
  7. HTTP2和HTTP的区别有哪些?

  8. 在你的项目中你使用过那些设计模式?主要用来解决哪些问题?

  9. Object中的equals和hashcode的作用分别是什么?

  10. final,finally,finalize的区别与使用场景

  11. 简单表述一下Java的异常机制

  12. 先上使用的那个版本jdk,为什么使用这个版本(有什么特色)?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值