前言
疫情到现在已经持续有3年的时间了,由于疫情的影响,无数行业都受到了影响,互联网在这样的一个大环境下还是有着被裁掉的风险,大环境格外困难。
我发现一个奇怪的现象:那些跳槽的人,总是从一个坑,跳进令一个坑中。毕竟一年过去了,会的还是原来的知识,人的身价就摆在那里,无论怎么折腾,也不会拿到更好的 offer。这样的跳槽其实没有意义,也许就有人问,现在都是互联网寒冬了,要怎样才能把握好机会,拿到跟好跟适合自己的 offer 呢?技术才是我们程序员的立身之本,在再好的机遇面前我们也要有这个实力去抓住它。
进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全,其中概括的知识点有:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,我这里整理了 2022年9月最新的Java面试经历与大型互联网公司面试常问的面试题和答案及面试经验总结(一次性查漏补缺个够),相信很多人都在准备面试,如何拿到心仪的 Offer,进入梦寐以求的大厂,实现自己的职业理想,达到程序员的小康水平。希望能给那些有需要朋友在求职路上起到帮助,拿到自己满意的 offer。
面试前的准备
老实说,我自己平常没事就会看一些面试题,所以我都是直接去面的。不过我还是要建议大家如果准备面试的话,需要做以下准备
背题:看一看最近的面经文,了解现在公司都在面什么类型的题,准备一些常见题,开背吧!如果一些基础的 js 都不会那问题就有点小大了。
算法:做一些算法题,leetcode 上面的一二三星就够了,前端算法很简单,基本都是初中数学的难度吧。
项目:项目回顾,把你做的项目从技术架构到源码都要做到足够了解,至少面试的时候不要被面试官问住了。并且要体现出你在工作中的作用,体现出自驱性(大公司都很看重自驱性)
亮点:准备亮点,回答问题的时候不用全部回答上来,但是在面试的过程中一定要有亮点(不然你就会得到反馈,面试官说你还行,但是没有过~) 我一般会准备几个点,每个点都保证可以睡上半小时。另外一定要了解得很深入,并且能够用自己的话流畅的表达出来!!(我准备的几点,性能优化、工程化、缓存、http)
内推:最好找人内推,成功率会提高一些
练手:先找几家不太想去的公司(规模差不多)练练手,如果第一次面试就去心仪的公司面试,淘汰率会非常高。
心态:心态很重要,面试不过很正常,不证明你不优秀,只是不适合,总结面试经验,为下一次做准备。
答题:怎么把自己会的问题说好,这个很关键
逻辑清晰:一定要逻辑清晰,不然即使你知道这个问题的答案,面试官也不会满意,如果你逻辑清晰,即使这个答案不会,面试官也会给你加分
独特理解:现在的面试题大同小异,那么如何体现出你的优势就很重要。结合业务以及你自身的知识储备来讲
深入思考:对每个问题一定要有深入的思考,不然就很难进入大公司了,深度上要有一个拔高才能在面试中获得好的成绩
流畅表达:面试就是一个表达的过程,一些问题心里明白不行,还要流畅的表述出来,基本上如果面试官觉得你表达的很流畅,当你讲到一半就不会再让你说下去了,证明已经通过了
刷题绝对是最重要的,这些面试题还有自己之前收集整理的一份核心架构进阶知识点。存在网盘也没太大的用处,所以在这里免费分享出来给有需要的朋友。
由于文章篇幅限制,不可能将所有面试题以文字形式把大厂面试题展示出来,本篇为大家精选了一些面试题,如果你需要这份完整版的面试笔记,获取面试资料只需:私聊我即可
一般公司都会有两到三轮的技术面试,大厂的技术面试轮次还可能更多,但是每轮考察的内容又不是很一致,下面列举一些大厂高频常问的问题
大厂高频常问的 Java 面试题如下:
java 基础
- HashMap1.7 和 1.8 的实现区別
- HashMap 中插入、添加、删除除元素的时间复杂度?
- ConcurrentHashMap 的实现原理?
- newString(),一共创建了几个对象?
- 序列化和反序列化的底层实现原理?
- hashCode 和 equals 方法的区别和联系?
- 讲讲 String、StringBuilder、StringBuffer?
- Object 类中常见的方法,为什么 wait notify 会放在 Object 里边?
- Arraylist 与 LinkedUstKU 空间是多少?
- HashMap 的默认空间、扩容因子等?
- 若 hashcode 方法永远退回 1 或者一个常量会产生什么结果?
- 浅拷贝和深拷贝的区别?
- 反射的作用与实现原理?
- Java 提供的排序算法是怎么实现的?
多线程
- 说说 synchronized 实现原理(对象监视器)?
- volatile 实现原理(禁止指令重排、刷新内存)?
- ThreadLocal 原理分析,ThreadLocal 为什么会出现 OOM,出现的深层次原理?
- CAS 无锁的概念、什么是乐观锁和悲观锁?
- AQS 同步队列是什么?
- 什么是 ABA 问题,出现 ABA 问题 JDK 是如何解决的?
- 常见的原子操作类?
- 偏向锁、轻量级锁、重量级锁、自旋锁的概念?
- 一个线程连着调用 start 两次会出现什么情況?
- 线程池的实现?
- 重要参数及原理?
- 说说四种线程池?
- 任务拒接策略有哪几种?
- 线程状态以及 API 怎么操作会发生这种转换?
JVM
- JVM 运行时内存区域划分?
- 常见的 GC 回收算法及其含义?
- 什么是类加载器?
- 什么是双亲委派模型机制?
- 一个类的生命周期、类是如何加载到 JVM 中的?
- 说说类加载的过程?
- 什么是强引用、软引用、裝引用、虚引用?
- Minor GC 与 Full GC 分别在什么时候发生?
- 什么时候触发 Full GC?
- Java 中的大対象如坷进行存储?
- 为什么新生代内存需要有两个 Survivor 区?
设计模式
- 单例模式
- 动态代理
- 工厂模式
- 责任链模式
MySQL
- MySQL 常见的存储引擎以及他们之间的区别?
- MySQL 索引为什么使用 B+树?
- MySQL 覆盖索引是什么?
- MySQL 索引失效的条件,索引在什么时候不会起效果?
- MySQL 如何进行优化的?
什么是 explain 命令?
- MySQL 遇到的死锁问题、如何排查与解决?
- 常见的数据库优化方案,在你的项目中数据库如何进行优化的?
- 什么是 redo 日志,什么是 undo 日志?
分布式数据库
- 说说常见的几种分布式 ID 的设计方案?
- 分库与分表带来的分布式困境与应对之策(如何解决分布式下的分库分表,全局表?)
- 如何拆分服务、水平分割、垂直分割?
Redis
- Redis 使用场景?
- Redis 有哪些数据类型?
- 说说 Redis 持久化机制?
- Redis 为什么是单线程的?
- 什么缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级?
- 说说 Redis 常见的回收策略?
- Hash—致性算法?
- Redis 和数据库数据一致性的问题?
- Redis 中 zSet 跳跃表问题?
Nignx
- 请解释什么是 C10K 问题或者知道什么是 C10K 问题吗?
- 正向代理和反向代理?
- Nginx 几种常见的负载均衡策略?
- Nginx 服务器上的 Master 和 Worker 进程分别是什么?
Zookeeper
- 什么是 Zookeeper 通知机制?
- Zookeeper 集群管理(文件系统、通知机制)
- 讲讲 Zookeeper 分布式锁?
- 获取分布式锁的流程
- Zookeeper 数据复制?
- zookeeper 是如何保证事务的顺序一致性的?
- zookeeper 是如何选取主 leader 的?
- zk 节点宕机如何处理?
- zookeeper 负载均衡和 nginx 负载均衡区别?
- 说说 zookeeper watch 机制?
消息队列问题及集群分布式
- 消息队列使用的场景介绍和作用(应用耦合、异步消息,流量削锋等)
- 如何解决消息队列丢失消息和重复消费问题?
- 什么是 CAP、Base?
- 说说最终一致性理论?
- 什么是 RPC、如何实现 RPC、RPC 的实现原理?
- 什么是 Dubbo?
- Dubbo 的基本原理、执行流程?
- 集群 Session 解决方案?
- 分布式事务?
- 说说三种分布式锁的实现?
- 集群、负载均衡、分布式、数据一致性的区别和联系?
网络编程
- 三次搌手和四次揮手、为什么揮手需要四次
- 什么是 TCP 粘包/拆包
- TCP 粘包/拆包的解决办法
- 从游览器中输入 URL 到页面加载的发生了什么?
- 什么是长连接和短连接?
Spring
- 讲讲静态代理模式的优点及其瓶颈?
- 对 Java 接口代理模式的实现原理的理解?
- 如何使用 Java 反射实现动态代理?
- 谈谈对 Cglib 类增强动态代理的实现?
- 什么是 AOP?
- 讲解 OOP 与 AOP 的简单对比?
- 讲解 JDK 动态代理和 CGLIB 代理原理以及区别?
- 什么是 IOC?
- Spring IOC 怎么管理 Bean 之间的依赖关系,怎么避免循环依赖?
- BeanFactory 和 FactoryBean 有什么区别,BeanFactory 和 ApplicationContext 又有什么不同?
- 谈谈 Spring Bean 创建过程中的设计模式?
微服务
- 什么是 Spring Boot ?
- Spring Boot 有哪些优点?
- Spring Boot 中的监视器是什么?
- 如何实现 Spring Boot 应用程序的安全性?
- 如何集成 Spring Boot 和 ActiveMQ ?
- 如何监视所有 Spring Boot 微服务?
- 如何使用 Spring Boot 实现异常处理?
- 什么是 Spring Cloud ?
- 使用 Spring Cloud 有什么优势?
- 服务注册和发现是什么意思?Spring Cloud 如何实现?
- 负载平衡的意义什么?
- 什么是 Hvstrix ?它如何实现容错?
- 讲讲 Hvstrix 断路器?
综合题
这块的题目,面试官一般会问的比较深入。比如如何设计一个抢购系统,String转Integer等,这部分需要考验的就是一个人的临场应变能力,以及在平时工作中系统设计能力的积累,以及考虑问题是否周到等。也有可能会对你简历上面写的系统的设计进行详细的询问,所以在你写简历的时候,千万不能把自己不熟悉的内容写上去,而且自己又讲不清,这样一般会被直接pass掉。当然也会问一些常用的maven的命令,设计模式的题目(这部分问的比较多的就是单例模式)。
HR面试
这块一般会问一些离职原因,当然也会问一些平时工作中遇到的问题,自己是如何解决的。如果聊得好,这时候HR会跟你谈薪资。问到目前薪资的时候,我目前是实事求是的告知的。这里,可能会有很多人报高一些,差不多的话,问题一般不大,如果太夸张的话,后续可能会有问题,比如让你提供银行流水等,差太多的话,可能会有诚信问题。
另外就是薪资涨幅的问题,我的原则是会事先对公司的规模这块进行考虑,然后结合目前的薪资,一般会设置一个范围(后来发现这样很不好,会处于被动),在当前薪资的基础上上浮30%的样子(可能各地有差异,不过这个会比较安全)。如果你很擅长谈这个,请忽略之。
此外,最重要的可能就是五险一金的缴纳了。一般小的公司会让你选择是避税还是不避税,这里面还是有点学问的。避税的话,可能你的公积金会很少。目前我遇到过两种,一种是每个月按照固定的额度给你交公积金,不论你以后的工资是否上涨,都跟公积金没有关系;还有一种是按照一个额度给你交,一般是工资的7%给你交,或者按照最低标准给你交。遇到这种情况,请自己慎重考虑是否需要接收offer。
最后,福利这块也可以问问,比如问一些年终奖,年假,加班调休等。
1.1 字节跳动一面
- 首先自我介绍,balabala……(此处省略三分钟)
- 找一个你的项目说一下,首先你的项目介绍,承担了什么职责,做了哪些工作,难点(因人而异,这就不再赘述了,balabal……(省略三分钟))
- 从你项目中看出,你使用的是 mysql,mysql 的 int 数据类型都有哪些?从小到大说一下,各占多少字节?
- java 中的 int 都有哪些?字节占多少
- 问你一个关于计算机网络的,tcp 的三次握手说一下?
- tcp 和 udp 的区别?
- 你说你熟悉 linux,我给你一个案例,搜索出 log 文本中出现次数最多的 IP,并且给出次数
- 说下 java 的 gc?
- 说一下 hashmap 这个数据结构?
- 进行一次查找的话 haspmap 的时间复杂度是多少?
- 给你一个算法你看一下,有一个无限长的整型数组,从小到大排序,非递增。那么怎么找到数组中一个 key?
- 闲聊
之后就问了我最近看了哪本书,学到了什么,最近还在学的什么技术呢?问了我职业规划,兴趣爱好,还说了说公司的语言选型,我后来问了下对于我的面试表现评价,人家不方便说,又问了新人培养等问题。
1.2 字节跳动二面
- 自我介绍(balabla)
- 然后说一说 mysql 的索引结构吧
- 看一道题吧,这个题怎么建立索引
(1)第一道题: mysql 订单表有几个属性:订单 id,用户 user_id、下单日期 date(精确到天)等,请问索引怎样建立 a. 查询某个用户的所有订单 b. 查询某一天的所有订单 c. 查询某一天某个用户的所有订单 (2)第二道题: 10G 文件,每一行一个 uint32 数字。有一台 1G 内存的机器 - A. 找出最大的 k 个数 - B. 找出重复数字 (3)第三道题: 我手中有一堆扑克牌, 但是观众不知道它的顺序。 第一步, 我从牌顶拿出一张牌, 放到桌子上。 第二步, 我从牌顶再拿一张牌, 放在手上牌的底部。 第三步, 重复第一/二步的操作, 直到我手中所有的牌都放到了桌子上。 最后, 观众可以看到桌子上牌的顺序是:13 98 请问, 我刚开始拿在手里的牌的顺序是什么?用代码实现以下
1.3 字节跳动三面
这个面试官应该是一个总监级别的,说话非常的硬气,肯定是一个资深大佬,一共面了 40 多分钟。常规的面试基础都没问,纯怼项目和算法了。
- 自我介绍
- 你觉得你目前遇到的困难有哪些?项目上的难点?
- 你的项目数据库多大?QPS 多少?哪些 sql 比较慢?(项目上的事我就不说了……balaba)
- 那你觉得以后 qps 更大的话,你该怎么设计?
- 给你一个算法题,你来看一下思路
- 那留两分钟咱们聊一聊,你有什么想问我的
1.4 字节跳动四面
HR 面,大约 35 分钟,主要是问个人职业规划、薪资待遇,以及对字节跳动的期许等等
写在最后
面试的时候最重要的是诚实。自己不会的就说不会,然后可以自己尝试着说出一些自己的思路,如果没有思路,也直说,人无完人,不可能面面俱到,因为你胡编的话,再深入问一下,你就露馅了。
面试之前一定要做充分的准备。比如提前半个月或者一个月,就要开始看一些基础内容,对当前的工作做一个总结,找出自己的亮点。亮点很重要,一般面试的时候,有了亮点,面试的过程你就能掌握一定的主动权。
总结
就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验 Java 程序员的技术功底。
所有的面试题目都不是一成不变的,上面的面试题只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。上面分享的2022最新1000+Java面试题的答案都整理成了PDF文档。
最新2022整理收集的一些Java学习资料(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,如果有需要的小伙伴可以私信我哈
最后希望大家能从文章中得到帮助获得收获,也可以评论出你想看哪方面的技术。文章会持续更新,希望能帮助到大家,哪怕是让你灵光一现。喜欢的朋友可以点点赞和关注,也可以分享出去让更多的人看见,一起努力一起进步!