百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

秋招面试总结(Java)-菜菜的坎坷之路

wptr33 2025-02-26 14:04 9 浏览


写在前面

本人渣硕,之前天真地认为实习期间活儿干完了就能转正,就没有准备提前批,也几乎完美错过了9月秋招正式批。倒在亚马逊的转正答辩后(感到痛心,舍不得组里和善的大佬们,技术好又有耐心又有趣),10月正式踏上秋招,目标是JAVA后台研发。至此告一段落,虽然没拿到什么牛逼的offer,但好歹互联网大厂基本都面了,写下来让自己以后复习,也算回馈牛客。

话不多说,面试问题几乎集中在JAVA基础、JVM、算法、数据库(MySQL、Redis)、计算机网络、操作系统等方面,会分类进行列举,限于篇幅项目相关的问题就不写出了。


高频问题

后面面经挺长的,嫌太长的可以只看这部分。基本上你在简历的技能树上写了以下关键词,那这些高频问题你会特别眼熟,有些会附上解答,有写错的地方欢迎指正~(敲黑板,这都是要考的重点)


设计模式

  • 单例模式
  • 懒汉、饿汉、双重校验锁、静态内部类
  • 工厂模式

JAVA基础

  • 抽象类和接口区别
  • 集合类的结构
  • Iterator、Collection(List、Set、Queue)、Map
  • ArrayList和LinkedList的区别

HashMap

  • 底层结构
  • 数组 + 链表
  • Put 的过程
  • 为什么长度是2的倍数
  • 找索引时 key 的 hash 值与数组的长度值减 1 进行与运算,长度为 2 的倍数时能减少碰撞
  • JDK 1.7 和 1.8 中 HashMap 的区别
  • 1.8 增加红黑树、头插变为尾插、扩容后元素位置要么在原位置,要么在原位置 + 扩容前旧容量
  • 为什么线程不安全
  • 扩容时链表可能形成闭环
  • ConcurrentHashMap 怎么保证线程安全
  • ConcurrentHashMap 和 HashMap 区别

线程池

  • 线程池常用参数
  • 核心线程数、最大线程数、阻塞队列、线程最大存活时间
  • 线程池工作流程
  • 线程池的类别和区别
  • 阻塞队列的类别和区别

JVM

  • 内存结构和各自存放的内容
  • 方法区、堆、虚拟机栈、本地方法栈、程序计数器
  • 新生代和老年代垃圾回收算法
  • 新生代 -> 复制,老年代 -> 标记-整理(CMS用的标记-清除)
  • CMS/G1的流程
  • 初始标记 -> 并发标记 -> 重新标记 -> 并发清除
  • CMS/G1的特点和区别
  • CMS:尽可能减少停顿时间,采用标记-清除,会造成内存碎片化
  • G1:可以预测停顿时间,采用标记-整理,减少内存碎片化, 将内存划分为 region 粒度
  • 判断垃圾是否可以回收的方法
  • 引用计数法、可达性分析法
  • 哪些对象可以作为GC ROOT

Spring

  • IOC 和 AOP 的含义和原理
  • Spring、SpringBoot、SpringMVC 的区别
  • SpringBoot 的启动流程
  • Bean 的生命周期
  • SpringMVC 的流程

MySQL

事务

  • 什么是事务
  • 事务的特性(ACID),详细说明各个特性的含义
  • 原子性、一致性、隔离性、持久性
  • 事务隔离级别
  • 未提交读 -> 已提交读 -> 可重复读 -> 串行化
  • 脏读、不可重复读、幻读的区别
  • 事务隔离级别怎么实现预防上述问题(eg: 可重复读怎么实现预防不可重复读)

索引

  • 常用索引(B树、Hash)
  • 聚簇索引和非聚簇索引的区别
  • 联合索引和单个索引的区别,联合索引的最左匹配原则
  • B树和B+树的区别
  • B+树的非叶子节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”
  • B+树查询必须查找到叶子节点,B树只要匹配到即可不用管元素位置,因此B+树查找更稳定(也不慢)
  • 对于范围查找来说,B+树只需遍历叶子节点链表即可,B树却需要重复地中序遍历

Redis

  • Redis 的五种数据结构
  • String、Hash、List、Set、Zset(SortSet)
  • Redis 为什么快
  • 纯内存、单线程、IO多路复用(一般会继续问IO多路复用相关问题)
  • Redis 持久化
  • RDB、AOF
  • Redis 高可用
  • 哨兵机制、Redis Cluster、持久化(上面那个)

计算机网络

  • 点击一个URL到页面返回,发生了什么
  • 客户端传给服务端时经过 TCP/IP 四层模型,中途依次加入HTTP报文、TCP报文、IP报文、MAC报文,然后逆序依次拆包
  • OSI 七层模型 & TCP/IP 四层模型
  • cookie 和 session 的区别

TCP & UDP

  • TCP 三次握手,四次挥手的流程(最好能画图,说明各阶段状态)
  • 为什么需要三次握手
  • 防止已过期的连接再次传到被连接的主机
  • 为什么需要四次挥手 / 断开连接时为什么比建立连接多一次
  • 服务端的 ACK 和 FIN 一般都会分开发送,ACK 表示自己收到了客户端的断开请求(但还有数据没传输完),FIN 表示自己传输完了数据
  • TCP 和 UDP 的区别
  • TIME_WAIT 的作用
  • 保证客户端发送的最后一个ACK报文能够到达服务器
  • 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失

HTTPS

  • HTTPS的优势
  • CA证书认证、加密传输
  • HTTPS建立连接流程
  • 为什么传输过程中采用对称加密,协商时采用非对称加密
  • 对称加密快

操作系统

进程 & 线程

  • 进程和线程的区别
  • 进程间通信方式
  • 管道、消息队列、信号量、共享内存
  • 线程间通信方式
  • 消息队列、全局变量

Linux(几乎为Linux命令)

  • 查找某个进程(ps aux |grep threadId)
  • 杀掉某个进程(kill,参数添加-9表示强制执行)
  • 查看某个端口是否被占用(netstat -anp |grep threadId)
  • 实时查看进程状态(top)

算法

  • 最大子序列和
  • 反转链表
  • 数组中查找两数之和为K的序列对

坎坷面经

大家可以找找上面的高频问题在下面的面试中也出现过多少次(笑),针对每个公司会有一个小结(碎碎念)。

按照顺序分别是:

腾讯 - 阿里 - 美团 - 字节跳动 - 京东 - 网易

携程 - 旷视 - 新浪 - 小米 - 搜狐 - 快手

Paypal - FreeWheel

乐元素 - SmartX - 当当

腾讯-医疗

一面

MySQL

  • 事务的特性
  • 如何删除表中的所有数据,delete和truncate的区别
  • char, varchar, text的区别
  • 一张表里数据量大,慢查询怎么办

Redis

  • redis 的数据结构
  • zset 的底层结构
  • redis 的常用命令

操作系统

  • 多线程和多进程的区别
  • 进程间通信方式
  • 线程间通信方式

计算机网络

  • TCP 三次握手,四次挥手
  • TCP 和 UDP 的区别
  • UDP 如何重组数据
  • 应用层和网络层是干嘛的
  • ARP 是网络层的吗

腾讯-地图

一面

MySQL

  • MySQL 引擎默认的隔离等级
  • MySQL 有哪些锁
  • 执行 select 和 update 会如何加锁

计算机网络

  • TCP和UDP的区别
  • TCP和UDP的报文头内容
  • HTTP
  • HTTP属于 TCP 还是 UDP
  • HTTP 1.1比1.0多了什么
  • HTTP Request Header 中有哪些内容
  • 如何判断是否是长连接
  • DNS 属于 TCP 还是 UDP,原理
  • Ping 使用的什么协议,原理

操作系统

  • 进程和线程区别
  • Linux进程有哪几种状态
  • Linux查找某个进程

算法

  • 二分查找
  • 最大子序列和

腾讯-小结

可以看出腾讯对于计算机网络方面的知识要求蛮多的,光熟悉 TCP、UDP、HTTP 相关这样基础的面试题是hold不住面试官的

楼主目前在开发中还没用到过计算机网络的知识去解决问题,但前人的经验告诉我们后台系统多半会遇到网络拥堵的情况,这个时候计算机网络就能派上用场了(帮助定位问题,调 bug)


阿里-健康

一面

JAVA

  • HashMap原理,用红黑树解决什么问题

MySQL

  • B+树的原理和优势

算法

  • 硬盘中有10G数据,内存1G,如何排序(多路归并排序)
  • 最大子序列和,除了动态规划还能怎么做

阿里-高德

一面

数据库

  • delete 和 truncate 区别
  • 如果索引值为null,走不走索引

JAVA

  • 常见的单例写法

JVM

  • 新生代和老年代的区别
  • 大量大对象进入老年代会有什么问题(频繁触发full GC)
  • 有很多个大对象,应该如何改进

开放式

  • 如何设计一个查询附近商家的功能

二面

开放式

  • 爬虫爬千万个手机号码,如何统计每个手机号码的出现次数

阿里-小结

阿里对于算法方面的考核会更加严格,普通的算法题期待你有多种解法,并且倾向于给你一个具体问题让你解决,然而我开放式问题都答得不咋样

开放式问题一般都是的业务问题(数据量大、用户量大(高并发场景)等等),需要衡量业务是正确稳定至上还是效率至上(同步、异步),还有资源消耗(空间换时间、分布式会导致调度的额外开销),尝试将大问题分解,自上而下/自下而上去解决


美团-金融

一面

JVM

  • JVM的结构
  • 新生代和老年代的垃圾回收算法
  • 虚拟机栈和本地方法栈的区别
  • 类信息会加载到JVM哪个区域

JAVA基础

  • HashMap 和 ConcurrentHashMap 的区别
  • final 的作用,加在变量、方法、类的区别
  • 新建一个 string 会创建几个对象
  • 哪些类是线程安全的
  • 线程池的参数;为什么需要超出最大容量的策略
  • ThreadLocal了解吗

Spring

  • AOP的实现原理
  • @Autowired和@Resource的区别
  • 什么情况下会用@Resource

MySQL

  • B+树的优势
  • 悲观锁和乐观锁了解吗
  • 数据库如何实现乐观锁

设计模式

  • 工厂模式怎么理解
  • 单例模式有哪几种实现方式
  • 懒汉和饿汉的区别,懒汉的缺点

算法

  • 反转链表

二面

JAVA基础

  • HashMap 和 ConcurrentHashMap 的区别
  • hash 冲撞怎么办?如何 rehash
  • HashMap 的遍历方式
  • 为什么 HashMap 是线程不安全的
  • volatile 和 synchronized 的区别

Spring

  • SpringBoot 的优势
  • SpringMVC 的 MVC 指什么?好处呢

Redis

  • 主从结构了解吗
  • 宕机之后如何恢复数据

消息队列

  • rabbitmq 和 kafka 的区别
  • rabbitmq 如何保证事务
  • 消息队列的优势

美团-数据平台

一面

JAVA基础

  • ConcurrentHashMap 的特点
  • JUC 包下其他并发类了解过吗
  • 多个消费者生产者,如何处理同一段数据(消费者-生产者模型)

操作系统

  • 线程间通信的方式

JVM

  • 阐述 JMM 内存模型
  • 垃圾回收算法有哪些
  • 标记-整理会触发 Stop The World 吗
  • 什么情况下触发mirror GC
  • JVM 结构
  • 新建的字符串会存到哪

消息队列

  • 设计时应该考虑什么问题
  • 如何保证高可用

算法

  • n个有序数组,找出 Top k

美团-到家

一面

JVM

  • JVM 存在的优势
  • 通过什么方式来判断是否回收
  • 哪些对象可以当 GC root
  • 虚拟机栈的对象为什么能当 root
  • 堆和栈区别

JAVA基础

  • ArrayList 和 LinkedList区别
  • HashMap 的底层数据结构
  • JDK 1.8 中 HashMap 有哪些变化
  • 静态变量和非静态变量的区别
  • 类和对象的区别
  • Synchronized 和 Lock 区别
  • Lock 底层实现
  • Exception 和 Error 的区别
  • 线程池常用参数
  • 在什么情况下使用这些参数(线程池工作流程)

设计模式

  • 手撕单例模式的双重检验锁
  • 为什么要有两次检验

Redis

  • Redis 为什么快
  • Redis 如何保证可用

MySQL

  • B树索引和hash索引区别
  • 聚簇索引和非聚簇索引

计算机网络

  • HTTPS 建立连接流程

算法

  • LeetCode11 water
  • 给定一个数,通过调换顺序,找到比这个数大的最小数

美团-餐饮

一面

Spring

  • 循环依赖,可以初始化成功吗

其他问题比较简单没印象了

二面

JVM

  • CMS和G1

JAVA基础

  • HashMap 和 HashTable 区别
  • ConcurrentHashMap 和 HashMap 有什么不同
  • 阐述乐观锁,悲观锁
  • 阐述 CAS

MySQL

  • B+和B树的区别
  • Innodb 和 Mysiam 索引区别
  • left join, right join 区别
  • 联合索引和普通索引的区别
  • 事务隔离等级
  • 事务特性(ACID)
  • 慢查询如何排查
  • explain 中 index 和 ref 区别

美团-小结

原来美团我面了这么多次,侧面反映我有多菜了(逃)。

美团会挖你使用原理,考察你是不是真正用过这个东西而不仅仅是在博客上看了些相关的热门面试题(虽然回头来看这些题也挺基础的吧),换个角度讲即是连环炮问题的个数会变多,所以在准备相关知识点的时候需要看得细致一点,不光是知道这个点的用途,还需要知道详细的用法、为什么这么设计就能达到理想的效果,针对这个点还有没有优化空间


字节跳动-未知部门

一面

JAVA基础

  • ArrayList 和 LinkedList 的区别
  • 为什么 ArrayList 可以直接访问到元素
  • HashMap 的内部数据结构
  • 除了Map还可以怎么实现key value结构
  • Synchronize是公平锁吗,可重入吗
  • Lock 和 Synchronize 的区别
  • Exception和Error的区别
  • OutOfMemoryError(OOM) 可能是哪些原因导致的
  • 并发控制可以用哪些方式实现
  • 线程池的大小应该如何设置
  • 一个类里有两个synchronize方法method1和method2, 如果有两个线程分别执行method1和method2,他们是串行执行还是并行执行

JVM

  • 堆和栈的区别
  • 递归调用是在堆上还是栈上

计算机网络

  • 阐述 TCP 连接流程
  • TCP 为什么需要第三次握手
  • HTTPS 和 HTTP 的区别
  • HTTPS 如何建立通信
  • 为什么要用对称加密 key 加密信息,而不用公钥直接加密信息

MySQL

  • 联合索引A,B,C,直接查询C走不走索引,A,C呢,A,B呢
  • 了解SQL注入吗
  • 从服务端如何防止SQL注入

算法

  • 反转字符串 (you me)-> (me you)
  • 如果上面输入的是一个char[]呢,不通过辅助操作char数组

字节跳动-国际支付

一面

JAVA基础

  • 重写 equal 为什么要重写 hashcode
  • 抽象类和接口区别
  • List 和 Set 区别
  • HashMap 的实现结构,hashcode 方式

计算机网络

  • HTTP 状态码4XX和5XX的区别
  • GET 和 POST 区别

MySQL

  • 事务特性
  • 事务隔离等级

算法

  • 求二叉树中左叶子节点的总和

二面

Redis

  • zset 的底层原理
  • String 的底层原理

算法

  • 链表对折 1 -> 2 -> 3 -> 4 -> 5 ----> 1 -> 5 -> 2 -> 4 -> 3

字节跳动-小结

宇宙条也爱抠原理,准确说互联网大厂都会问原理吧。回看问题觉得问得也不是很难,都是比较基础的知识,比如并发控制中的 Synchronize 和 Lock ,奈何我用得太少,这些关键字最好是自己能写个小 demo 来验证一下效果,不然光看别人的博客写得头头是道,临场了根本记不住那么多


京东-优惠券

一面

Redis

  • 基本数据结构
  • 持久化策略
  • 如何提高 Redis 的性能

消息队列

  • 如何保证可靠性
  • 如何保证消息的幂等性

JAVA基础

  • HashMap 线程安全吗?如果要线程安全怎么办
  • ConcurrentHashMap 怎么实现线程安全
  • volitale 怎么保证可见性

JVM

  • JVM 结构
  • 常量存在哪里
  • 如果有一个大对象,垃圾回收是怎么进行的

Spring

  • IOC 和 AOP 的底层原理



京东-数据产品(offer)

一面

JVM

  • 栈的结构
  • 阐述 CMS

Redis

  • Redis 为什么快
  • IO多路复用为什么快

算法

  • 二叉树的层次遍历

二面

MySQL

  • left join、right join、inner join 的区别

设计模式

  • 阐述工厂模式及应用场景

算法

  • 翻转链表
  • 一个二维数组,从左往右递增,从上往下递增,问数组中是否存在数K
  • 64匹马,8个赛道,只能知道马的名次而不知道具体时间,如何最少次数找出最快的4匹马

京东-虚拟商品交易

一面

JAVA基础

  • 阐述泛型

JVM

  • G1的特点

Spring

  • 阐述 AOP

TCP

  • 三次握手时的各个状态
  • TIME_WAIT 的意义
  • 阐述慢启动

MySQL

  • B+和B树区别
  • 阐述聚簇索引

二面

JAVA基础

  • HashMap Put过程
  • HashMap 扩容时,为什么扩两倍

三面

  • 觉得前两个面试官如何

京东-小结

京东问的问题大多停留在阐述概念,当然有些是我不会面试官就没往下深问了,整体还是偏简单的。数据产品能拿到 offer 可能归功于算法题太简单了(赛马那道除外),很流畅地就写完了,我会告诉你我一周写了三次反转链表吗



网易-有道

一面

JAVA基础

操作系统

计算机网络

Linux

MySQL

算法

网易-小结

笔试之后两个月才面试可等死我了,问了不少多线程开发的问题,可惜我没做过这个,有空得写写 demo 熟悉下线程池,其他基本是常规问题


携程-途家

一面

JAVA基础

MySQL

二面

JAVA基础

JVM

MySQL

Redis

算法

携程-小结

看得出来这个面试官非常喜欢 HashMap,面试中只要涉及到 JAVA 的集合类,准少不了 HashMap,如果接着问到线程安全方面,那多半会引出ConcurrentHashMap,关于这俩的问题也不少,仔细消化一下吧


旷视

一面

计算机网络

算法

二面

算法

三面

计算机网络

旷视-小结

人工智能出身的公司对算法比较看重,但是除了最后那道动态规划其他算法题属于简单的类型。(面试中让写复杂动态规划的情况很少,一般考察的题目代码会比较简短)因为旷视技术栈不是 JAVA,所以就没问 JAVA 相关的,转而问了些计算机网络的东西,也不算很难。三面的面试官有些敷衍,觉得我的项目比较简单(第一次被这么说,果然是其他面试官太温柔了不好意思说),没什么想问我的就草草结束了

转载自:牛克网-YY的晕


新浪-金融

一面

JVM

MySQL

计算机网络

算法

二面

JAVA基础

算法

MySQL


新浪-小结

中规中矩的面试题,该有的部分都没落下。布隆过滤器只是看过概念没有深究,原理和优化需要再品一下。这些经常听到的数据结构(诸如堆、并查集、字典树、AVL树等),可以多看看,再找几道题目实践一下,防患于未然


小米-中间件

一面

JAVA基础

JVM

MySQL

算法

二面

算法

小米-小爱

一面

Spring

算法

二面

算法

Redis

JAVA基础

Spring

其他

小米-有品(offer)

一面

操作系统

计算机网络

二面

MySQL

操作系统

开放式

小米-小结

面中间件部门的时候,之前面得有些疲倦,有些消极面试,导致基础问题答得还可以,但简单的算法题都没有撕出来。

面小爱部门的时候,情况恰好反过来,基础问题几乎一问三不知,面对在面经中没看到过的题目有些懵了。

秋招是条长阵线,过程中需要随时调整心态,没拿到 offer 的时候要能克服沮丧本能去复盘,至少针对没答上的问题去搜索答案,坚持每天刷1-2道题。

感谢我的学长K神捞了我一把,有品的面试官很 nice,问的问题你如果不会的话都详细地进行了解答而不是赶紧跳到下一个。二面面试官穿了件炉石主题的卫衣,就很巧扯到了炉石,然后让我设计这么一个游戏跨度就很大。有品面下来感觉一半时间都是面试官在说,也算是我运气好吧

————以下无内容—————————


相关推荐

每天一个编程技巧!掌握这7个神技,代码效率飙升200%

“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...

Git重置到某个历史节点(Sourcetree工具)

前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...

git工作区、暂存区、本地仓库、远程仓库的区别和联系

很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...

解锁人生新剧本的密钥:学会让往事退场

开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...

Reset local repository branch to be just like remote repository HEAD

技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...

Git恢复至之前版本(git恢复到pull之前的版本)

让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...

如何将文件重置或回退到特定版本(怎么让文件回到初始状态)

技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...

git如何正确回滚代码(git命令回滚代码)

方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...

[git]撤销的相关命令:reset、revert、checkout

基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...

利用shell脚本将Mysql错误日志保存到数据库中

说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...

MySQL 9.3 引入增强的JavaScript支持

MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...

python 连接 mysql 数据库(python连接MySQL数据库案例)

用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...

mysql导入导出命令(mysql 导入命令)

mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库  mysqldump-u用户名-p数据库名>导出的文件名  mysqldump-uw...

MySQL-SQL介绍(mysql sqlyog)

介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...