写在前面
之前写过一篇Java面试知识点汇总,由于我不断补充,现在知识点已经比较庞杂,很多人私信我,说那一篇全是知识点太过庞杂,问我有没有整合的。正好春招和秋招在即,我花费了几个月的时间,把知识点整合成不同的模块并针对不同的知识点以及结合本人自己的面试经历,整合出这篇java面试全攻略。希望对大家有所帮助!
文章目录
一、面试那点事
在讲述知识点之前,我需要先说明一下互联网面试那点事。
互联网面试基本流程是:笔试 + 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的