Java面试后端经验分享(不是面经的面经)
写在前面
之前写过一篇 Java 面试知识点汇总,由于我不断补充,现在知识点已经比较庞杂,很多人私信我,说那一篇全是知识点太过庞杂,问我有没有整合的。正好春招和秋招在即,我花费了几个月的时间,把知识点整合成不同的模块并针对不同的知识点以及结合本人自己的面试经历,整合出这篇 java 面试全攻略。希望对大家有所帮助!(本文同步发表在CSDN上史上最全!20/21届春招/秋招 实习/校招 JAVA面试全攻略!复习回顾这一篇就够了!)
PS:面经由于还有一些流程没有走完,过几天会一起整理出来回馈给大家
文章目录
一、面试那点事
在讲述知识点之前,我需要先说明一下互联网面试那点事。
互联网面试基本流程是:笔试 + 2 轮或 3 轮技术面(又叫业务面)+ HR 面试
笔试和 HR 面试这个是需要自己平时的积累的:
- 笔试基本就是 2 个小时的编程,题目个数在 4 个左右,难度在 LeetCode 中等水平(不同公司难度也不一样)。但是你笔试基本不要想着去 AC,我参加了 20 + 场笔试,很少有全部 AC 的情况,但是我笔试基本都过了,因为笔试只是互联网公司考核的一个方面而不是全部,还会考核你的学历和简历,所以笔试即便答的很差劲,心态也不要爆炸,放平心态继续准备其他的内容,甚至我有一次 4 道题目,只有一道题目得了一半的分,其他题目都是零分,但是还是给我过了笔试。但是这并不代表编程能力不重要,恰恰相反,在后面的业务面试中,所有的公司,我是说所有的!都会进行编程的考察,也就是手撕代码环节!这个容不得半点差池,大部分情况保证跑通面试官给的用例基本就可以,但是少数会比较较真,我面试华为的时候,面试官把我的代码拷贝到他本地去跑用例。所以这个手撕代码的环节是无可避免的。准备的话:剑指 offer67 题和 LeetCode 的 hot100 题这两个是必刷的,而且一遍肯定是不够的,要刷到自己很熟练为止。
- HR 面就基本是个人情况的了解,但是也存在问技术的问题,但是前面的业务技术面都过了,这个就问题不大,HR 更多是考察你的性格、人品跟公司是否相符。也是需要慎重对待的。
业务技术面(Java 相关)
本文重点!
所有语言都需要掌握的技术点:
- 常见算法和数据结构
- 操作系统
- 数据库
- 计算机网络
Java 语言主要的技术点:
- Java 基础
- 集合框架
- 多线程
- JVM
- 项目 + 常见中间件
二、知识框架
复习的时候需要构建自己的知识框架,用时髦的词就是思维导图,这个不是自己去画一个思维导图然后就不管了,我觉得这是一个不断复习不断在脑海中构建导图的过程,复习一个知识点的时候,把这个知识点相关的内容全部串联起来,形成一个思维框架(俗称举一反三)。这样你就神功大成了!
常见算法和数据结构
- 数组、链表、队列、栈的各种操作(性能,场景)
- 各类排序算法以及复杂度分析(快排、归并、堆),不同排序算法的稳定性
- 理解并可以分析时间和空间复杂度。
- 动态规划、贪心。
- 回溯算法
- 二叉树、前中后虚(图考察的很少,只有笔试偶尔遇到)
- DFS、BFS 算法
- 单调栈、单调队列
手撕代码环节最常见的考察就是一维数组、二维数组的操作,一维数组找特定子序列,二维数组特定找路径,涉及的算法动态规划、回溯、DFS、BFS 等等。
PS:如果实在没有好的解法,就考虑使用暴力法,因为大部分面试官不会去专业的网站评测,所以就没有超时这个隐患,但是面试官很有可能会询问时空复杂度并进而询问优化方案。
操作系统
- 进程通信 IPC(几种方式),进程与线程定义与区别
- 进程调度算法、磁盘扫描算法
- 虚拟内存、页面置换算法
- 内核态和用户态的转换的条件、中断、系统调用
- 互斥与死锁
- linux 常用命令(问的时候都会给具体某一个场景)
- Linux 的 IO 模型 BIO/NIO/AIO、 IO 多路复用
- Linux 内核 select poll epoll、边缘触发和水平触发
- 僵尸进程和孤儿进程
数据库
- 索引(包括分类及优化方式,失效条件,底层结构 B 树、B + 树的区别优缺点)
- 优化(explain,慢查询,show profile)、数据库的范式
- 辅助索引、主键索引、聚簇索引、非聚簇索引、索引回表、索引覆盖、索引下推
- 联合索引和最左匹配原则
- 引擎对比(InnoDB,MyISAM)
- 数据库的锁(行锁,表锁,页级锁,读锁,写锁,悲观锁,乐观锁)
- 隔离级别,依次解决的问题(脏读、不可重复读、幻读)、隔离级别与加锁的关系
- 事务的 ACID
- 分库分表,主从复制,读写分离。
- sql 语法(join,union,子查询,having,group by)主要考察 sql 语句的书写
计算机网络
- OSI7 层模型(TCP4 层)、每层的协议、
- 常见协议为位置在 OSI 七层协议的位置(HTTP/TCP/UDP/DNS/IMAP/ARP/ 路由器 / 交换机)
- http/https 1.0、1.1、2.0、https 加密过程(对称加密和非对称加密)
- get/post 以及 http 幂等性
- http 协议头相关、http 常见的状态码
- TCP 与 UDP 比较
- TCP 三次握手、四次挥手、拥塞控制(过程、阈值)、流量控制与滑动窗口
- TCP 的 time_wait 和 close_wait
- url 到页面的过程
- 网络攻击(CSRF、XSS、DDos)
Java 语言
1. 基础
- 面向对象、四个特性、重载重写、继承、多态、反射
- 常见关键字 final、static、abstract、finalize、transient、native
- StringBuffer、StringBuilder 和 String、字符常量池
- 六大设计原则、常见的设计模式(代理、工厂、单例、装饰者、观察者)
- 异常、常见的异常类
- 序列化
- 深拷贝和浅拷贝、值传递和引用传递
- 抽象类和接口
- 基本类型的默认值和取值范围以及字节数
2. 多线程
- synchronized 关键字底层原理、锁升级原理、轻量级锁、重量级锁
- Lock 锁机制、线程通信、、ThreadLocal、Atom 包、AQS、CAS 原理
- volatile 关键字、内存屏障、happen-before 原则
- 同步队列、等待队列、阻塞队列
- 线程池、线程池的执行流程、线程池的主要参数(coresize、阻塞队列、maxsize、拒绝策略)、线程池的任务递交方式和状态变化。
- thread 类的常见方法:sleep、join、yield;sleep 和 wait 方法的区别
- 线程的五种状态、run 方法和 start 方法
- 守护线程和用户线程
3. 集合框架
- hashmap(这个基本是必考题)hashcode 函数、equals 函数、扩容机制、put 和 get 操作、jdk1.7 和 jdk1.8 的变化、hashmap 的尾部遍历、红黑树的引入
- hashmap 的线程安全问题,synchronizedMap、hashtable、concurrentHashMap
- concurrentHashMap 的 jdk1.7 和 jdk1.8 的变化,底层实现线程安全的方式
- 常见的集合框架哪些是线程安全的,哪些是线程不安全的
- arraylist 和 linkedlist、vector
- 集合的遍历、迭代器
4.JVM
- JVM 内存模型、堆、栈、PC 计算器、永久代分别存储的内容
- GC 垃圾回收,三种 GC 算法,七种 GC 收集器
- CMS 和 G1 的优缺点、执行流程
- 年老代和年轻代、分代垃圾回收算法
- 四种引用类型、GCroot 的可达性分析法
- 对象创建的过程、对象的内存分配
- 类加载的过程、类加载器
- 双亲委派机制、tomcat 的反双亲委派机制
- JVM 调优,常见的调优参数
- 内存泄漏和内存溢出
项目 + 中间件
面试的第一个环节就是自我介绍,最好提前准备好腹稿,介绍的基本内容就是你的教育经历 + 工作经历 + 简单的性格介绍。而工作经历中的项目将成为接下来面试官询问的重点,所以最好能准备一个拿得出手的项目。
如果在面试之前已经有工作经历和项目经历,就需要深挖你项目的亮点:
- 开发的时候使用的技术和中间件
- 遇到的问题、如何解决问题
- 是否有优化方案,如何优化你的项目
上面这三个问题基本上是最常见也是最基本的问题,准备项目的时候,一定要把上面这些问题准备好。如果是第一次找工作,最后也是提前编写一个项目练练手,现在比较火爆的项目就是 —— 秒杀系统。因为这个项目基本会用到主流的中间件(spring、Redis、消息队列 MQ、kafka)。而且我在跟面试官交流的时候,面试官对这个项目也是认可的,前提你真的深入其中。
三、知识点系统总结
为了更清晰的展示内容,我开了一个公众号并弄了一个十分钟系列板块,并花了 2 个多月的时间,把我之前所有复习的知识点整理成了大约 40 篇文章,这不是简单的问题 + 解答的形式,而是较为系统的把这个知识点的相关内容展开。相信读者读了这些文章之后有一个较为深刻的的认识。(目前还在不断整理中…)
四、面试常见问题总结
这是我复习过程思考的过程 + 复习过程看的面经 + 知识点的反问。目的是尽可能广的涵盖知识点,这不是面经而是一个查漏补缺的目录。
- 设计 超过 200 个 问题
- 涵盖 超过 300 个 知识点
Java 语言基础
- == 和 equals 的区别?
- 拆箱和装箱分别是什么?分别应用在什么场景?
- String str=“abc” 与 String str=new String (“abc”) 一样吗?为什么?
- String str=“abc” 和 String str=new String (“abc”); 产生几个对象? String str = new String (“hello”)+new String (“123”); 产生了几个对象?
- 字符常量池的位置?字符常量池存储的内容?
- 给定三个变量:i1、i2、i3。Integer i1 = 120;Integer i2 = 120;int i3= 120;i1 和 i2 一样吗?i1 和 i3 呢?为什么?如果把 120 换成 130 呢,i1,12,i3 的关系又如何,为什么?
- throw 和 throws 的区别?
- try-catch-finally 中哪个部分可以省略?
- try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
- 常见的异常类有哪些?
- java 异常的执行流程?
- 为什么要使用克隆?如何实现对象克隆?
- 深拷贝和浅拷贝区别是什么?
- 值传递和引用传递的区别是什么?
- 什么是 java 序列化?什么情况下需要序列化?如何避免序列化对象中的属性序列化?
- 什么是反射?反射的应用场景?
- 代理模式有什么用?应用场景是什么?
- 动态代理的实现方式都有什么?哪种实现效率高?
- 动态代理是什么?与静态代理的区别在于?
- 抽象类和接口的区别?普通类和抽象类有哪些区别?
- 抽象类必须要有抽象方法吗?抽象类能使用 final 修饰吗?
- 局部内部类和匿名内部类为什么只能访问 final 的局部变量?
- 什么是多态?
- BIO、NIO、AIO 有什么区别?
- 同步、异步、阻塞、非阻塞?
- java 中 IO 流分为几种?
- final 在 java 中有什么作用?抽象类能使用 final 修饰吗?
- java 中的 Math.round (-1.5) 等于多少?
- 管道的类型?
- 什么是半双工?什么是全双工?
- 在多线程下选用什么处理大规模字符串?
- Java 中的设计原则?
- 什么是组合?什么是聚合?
- 说一下你熟悉的设计模式?
- 简单工厂和抽象工厂有什么区别?
- 装饰者模式和适配器模式以及代理模式的区别?
- 说出几个在 JDK 库中使用的设计模式?
- jdk1.8 新增的变化?
JVM
- 说一下 jvm 的主要组成部分?及其作用?
- jvm 运行时数据区组成?
- 堆栈的区别?
- 运行时数据区哪些是线程共享,哪些是线程私有?
- Java 中成员变量、局部变量、静态变量、常量分别存储在那些内存区域中?
- 说一下类加载的执行过程?
- Java 中都有哪些加载器?
- 什么是双亲委派模型?
- 反射中,Class.forName () 和 ClassLoader.loadClass () 区别
- 说一下对象创建的过程?
- 对象有哪几部分构成?虚拟机如何访问对象?
- java 中都有哪些引用类型?
- 怎么判断对象是否可以被回收?
- 内存泄露和内存溢出分别是什么?什么原因造成?如何避免?
- 给对象分配内存如何保证线程安全?
- 说一下 jvm 有哪些垃圾回收算法?
- 说一下 jvm 有哪些垃圾回收器?
- 详细介绍一下 CMS 垃圾回收器?
- 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
- 简述分代垃圾回收器是怎么工作的?
- G1 为什么能建立可预测的停顿时间模型?
- Minor Gc 和 Full GC 有什么不同呢?
- 什么对象会进入老年代?
- 如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?
- 常量池都包括哪些内容?常量池的位置?
容器类集合框架
- java 容器都有哪些?
- Collection 和 Collections 有什么区别?
- List、Set、Map 之间的区别是什么?
- 如何决定使用 HashMap 还是 TreeMap?
- ArrayList 和 LinkedList 的区别是什么?
- ArrayList 和 Vector 的区别是什么?
- 说一下 HashMap 的实现原理?
- java 如何判断 HashMap 中的元素是否相等?添加的元素是自定义类的时候,需要注意什么?
- HashMap 为什么引入红黑树?
- JDK1.8 的 HashMap 有哪些优化?
- 请写出 HashMap 的添加操作和扩容操作的代码?
- HashMap 和 Hashtable 有什么区别?HashMap 和 HashSet 呢?
- final 关键字用于什么场景?
- ConcurrentHashMap 如何实现线程同步?
- Map 遍历的两种方式?
- 哪些集合类是线程安全的?
- Iterator 怎么使用?有什么特点?Iterator 的 fail-fast 属性是什么?
- Iterator 和 ListIterator 有什么区别?
- Arrays 和 Collections 的常用方法
- Array 和 ArrayList 有何区别?
- 在 Queue 中 poll () 和 remove () 有什么区别?
- 怎么确保一个集合不能被修改?
多线程
- 什么是锁消除?什么是锁粗化?
- 乐观锁有哪几种?主要思想是什么?
- 多线程锁的升级原理是什么(锁膨胀)?
- 什么是死锁?如何预防死锁?死锁和活锁的区别是什么?
- 并行和并发有什么区别?同步、异步、阻塞、非阻塞有什么区别?同步等同于阻塞吗?
- 线程和进程的区别?线程有哪些状态?
- 守护线程是什么?
- 创建线程有哪几种方式?线程的 run () 和 start () 有什么区别?
- ThreadLocal 是什么?有哪些使用场景?
- sleep 和 wait 方法有什么区别?notify () 和 notifyAll () 有什么区别?
- 现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?
- volatile 有什么用?synchronized 和 volatile 的区别是什么?
- synchronized 和 Lock 有什么区别?
- Lock 实现锁的底层原理?
- 说一下 atomic 的原理?
- 乐观锁的实现方式?
- 说一下 synchronized 底层实现原理?
- 线程池都有哪些状态?
- 线程池中 submit () 和 execute () 方法有什么区别?
- 创建线程池有哪几种方式?
- 创建线程池的各个参数代表的含义?
计算机网络
- OSI 七层模型?HTTP 协议对应第几层?IP 协议呢?
- 从一个 URL 到获取页面的过程?
- session 的实现原理?cookie 的原理?
- session 和 cookie 的关系?禁用 cookie 后对 session 的影响?
- forward 和 redirect 的区别?
- 内网和外网 IP 地址的区别?ABC 三类 IP 地址的划分
- 网关和子网掩码的关系是什么?
- MAC 地址和 IP 地址的关系是什么?
- 什么是 DNS 服务器?
- IP 如何映射到 MAC 地址的?
- TCP 是如何保证可靠传输数据的?
- TCP 和 UDP 的区别?
- TCP 三次握手和四次挥手的过程?
- TCP 为什么需要三次握手?只进行两次会出现什么问题?
- TCP 第三次握手失败的情况 TCP 是如何处理的?
- 为什么连接的时候是三次握手,关闭的时候却是四次握手?
- http1.0 与 http1.1 的区别?什么是 keep-alive 模式?
- 简单说一下 http2.0?
- 什么是幂等性?http 的方法是否都符合幂等性?若不符合,怎么避免?
- https 与 http 的区别?
- https 加密的过程?
- https 是否存在安全问题?如何避免?
- get 方法和 post 方法的区别?
- 什么 XSS 攻击?如何预防?
- 什么是 CSRF 攻击?如何预防?
- 什么是 DDoS 攻击?如何预防
- 什么是 SQL 注入攻击?如何预防?
数据库
- 什么是超键?什么是主键?二者有什么关系?
- 数据库的三范式是什么?
- char 和 varchar 的区别是什么?
- delete 和 truncate 有什么区别?谁效率更好?
- 存储过程和函数的区别?
- 视图的操作会对基本表产生影响吗?
- count(*)和 count(列名)谁的效率更高?
- 索引是什么?
- 索引的分类?索引失效条件?
- 索引优化方式?
- 怎么验证 mysql 的索引是否满足需求?
- 索引的底层结构是什么?说说各种的特点和缺点?
- 什么是事务?
- 事务的 ACID 特性?
- 事务并发会造成的问题?
- 事务的隔离级别?
- 说一下乐观锁和悲观锁?说一下 mysql 的行锁和表锁?
- 事务的隔离级别和加锁的关系?
- 两种常见的数据库引擎?分别具有什么特点?
- 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?
- 什么是主从复制?什么是读写分离?
- 数据库从哪几方面进行调优?
- 索引优化方向?
- mysql 问题排查都有哪些手段?怎么验证 mysql 的索引是否满足需求?
操作系统
- 什么是僵尸进程?什么是孤儿进程?有什么危害?
- CPU 的上下文切换有几种?系统中断进行了几次上下文切换?
- 进程的通信方式?效率最高的通信方式是什么?
- 进程调度算法有几种?应用最广泛的是什么?
- 进程和线程的区别?
- 虚拟内存的作用与特性?
- 虚拟内存的实现方式?分别有何种缺陷?
- 页面置换算法?
- 什么是中断?产生中断的方式?
- 什么是系统调用?
- 什么会导致用户态陷入内核态?
- 陷阱和中断的区别?
- 互斥和同步的关系?
- 死锁产生的条件?
- 信号量的 PV 实现?
- 生产者消费者的代码实现?
- 如何动态查看服务器日志文件?
- 如何打包压缩文件?
- 修改 /test 下的 aaa.txt 的权限为属主有全部权限,属主所在的组有读写权限, 其他用户只有读的权限?
- 查找 text.txt 文件中的 abc 的位置?
- 在 /home 目录下查找以.txt 结尾的文件名?
- 普通文件 IO 页缓存需要复制几次?具体过程是什么?
- 常见的 IO 模型?
- IO 多路复用的 select、poll 和 epoll 函数的区别?
五、算法(还在不断刷题补充中…)
PS:这是个人平时刷题的时候一些记录,大家可以参考一下。刷题这个东西,讲究题感,看十道题目不如做一道题目,这个没法取巧,知识点还可以突击背诵,这个是真的日积月累。尤其对应届生来说,哪有那么多项目经验,那有那么多实习经历,手撕代码才是一个码农的基本素养!共勉!
Java 场景题
回溯、二分查找
二分查找算法的万能公式(LeetCode35、704、1095)
动态规划
【面试刷题 - 力扣经典】409 最长回文串、647 回文子串、5 最长回文子串
LeetCode55 跳跃游戏、LeetCode45 跳跃游戏(进阶版)
LeetCode56. 合并区间、354. 俄罗斯套娃信封问题(合并区间进阶)
单调栈
LeetCode42. 接雨水、LeetCode11. 盛最多水的容器
剑指 offer
写在最后
以上的问题的答案在前面整理的公众号文章都是能找到的,当然肯定有想直接要答案的同学,个人建议:不要直接看答案,至少看一遍我总结的 40 篇系统文章
能看书是最好最完善的了,
其次是看一下系统总结的文章,
下下策是直接看问题 + 答案,因为这种方式只是一个很浅的了解,面试官稍微变化一下可能就露馅了。我也总结了答案,形成了一个 PDF,所以我放在公众号上,大家可以免费获取,直接在后台回复:题目整合 。就可以直接获取了,也不用转发,也不用发朋友圈,也不用花钱,完全免费分享给大家!
不要直接看答案!
不要直接看答案!
不要直接看答案!
【Java 面试那点事】
这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!
这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】
面试路上,你不孤单!
【PDF 截图】