记录 Java 后端开发实习历程(面经)
大概从 4 月中旬开始投递简历,大多数都被拒绝了(真难內),只有几家中小厂给了面试机会,幸运的是在五月底被字节其他部分给捞起来了,3 轮面试成功拿下 offer,感觉非常幸运吧,感谢牛客,感谢字节...
此帖总结一下面试过程,因为都有记录,所以比较详细,回顾时才发现我面试时回答总是会莫名其妙重复一些话,然后不知道接下来该说啥,好尬,就一直 嗯,额,就是....由于是总结帖,因此可能会记录下我自己的回答。
趋势科技
4-19 官网投递。
4-22 笔试(AK)
- 选择填空
- 字符串处理,简单题
- 编辑距离,高频题
笔试后 4-25 约面
4-29 一面(95min)
人生第一面,面了贼久,面的怀疑人生,趋势是做安全的,所以上来就是安全问题,被虐的比较惨,比较注重项目,我项目是一个 RPC 和一个小程序&&管理系统。
- 自我介绍
- 为什么大二就来实习,能实习多久?
- 小程序的登录是怎么做的,详细流程?
- 后台管理系统账号密码传输是明文吗?
- 当然不是,回答用了 HTTPS 加密。
- HTTPS 一定能保证安全吗?
- 额,我说可以,面试官没反馈...
- 除了 HTTPS 还有其他什么能够保证安全的协议吗?
- 我说应用层好像没有了,然后就谈了谈 IPsec 协议,说了说新首部封装,MAC 尾部封装,隧道技术,然后说了说 VNP 的实现就是基于 IPsec。
- 谈的比较浅,因为了解的也不多,好在面试官也没多问。
- 除了 IPSec 呢?还有什么协议能保障通信安全?
- 卑微,不知道。
- 密码在数据库中是明文存储的吗?
- 不是,加盐?
- 什么是加盐,为什么要加盐?
- 早期使用散列加密相似的密码碰撞概率高,黑客破解了一个可能就能破解多个,因此加上随机盐值进行散列,降低碰撞,降低风险。
- 加盐后还能知道原始密码吗?
- 不能,只能验证。
- 散列算法了解哪些?
- MD5, ASH。
- MD5 原理知道吗?
- 啥玩意?不知道,回来恶补了一下,现在(写此面经的时候)又给忘了...
- 两类密码体制。
- 对称非对称
- 块密码原理了解吗?
- 早期使用输入输出表,但表可能过大,因此使用函数与置乱函数作为替代。
- 流密码了解吗?
- 不知道。
- 项目中 Redis 怎么用的,Redis 数据类型?Redis 持久化方式?
- 终于结束安全问题了...
- 能解释下 Redis 为什么这么快吗?
- 丰富、高效的数据结构。
- 串行化的处理方式,避免线程切换开销。
- IO 多路复用机制。
- 6.0 之后引入多线程处理 IO 数据。
- 项目中 rabbitmq 怎么用的?
- mq 如何保障你项目中的一致性?
- 手动 ack,确认和事务机制。
- mq 如何避免重复消费?
- 两点原因导致,一是生产者投放多条重复消息,这个很好控制,另一个是消费者由于网络异常使得消费者与 mq 连接断开,这会导致 mq 会重新投放消息引起重复消费,我说可以用 redis 缓存唯一消息 id,面试官不满意,请问下还有啥解决办法啊?
- 消费者是怎么做模块区分的?
- 不知道面试官想问啥,没理解,我说我项目是单机的...
- 项目是单机的?也就是说这个项目可以不要 mq?
- 完蛋,魂淡啊,你还指望一个大一学生(项目是大一写的)写出啥高级的分布式微服务项目?
- 分页怎么做的?
- 用 Limit 字句。
- 会有什么性能问题呢?
- 然后给面试官扯了扯 limit 的优化?
- 用过分页插件吗?
- 无......
- 用了 mybatis 是吧,启动流程是怎么样的呢?
- 这里我不太了解,根据自己理解扯了扯扫描 xml 然后动态代理。
- 平时怎么学习 Java 的?
- 你项目中用到了 Java 中的哪些集合?介绍一下这些集合吧。
- List 讲讲吧,有几种实现呢?
- ArrayList 内部内存是连续的吗?
- 我说使用数组,是连续的,面试官说不对再想想,然后想了想说数组本身是连续的,但是数组指向内容不一定是连续的。
- 谈谈你对 Java 中引用的理解。
- 我说引用就是指针...
- 好,那你说说你对指针的理解。
- Java 和 C++ 你更喜欢哪个?
- 为什么说 Java 是跨平台的?
- 你项目里是如何做权限管理的?
- 晕,怎么还问项目,SpringSecurity 做的。
- 写题,文件中记录了用户访问记录,用户可以多次访问,将他们按照访问次数排序,去重后重新写入文件。
- 简单题,文件 API 忘记了,面试官让百度,然后就秒了。
- 反问。
面试官态度还是挺好的,还是自己太菜了吧,很多都不会...不过感觉经历了这一面(太尼玛久了),我的面试恐惧症降低了不少,这么久的面试都经历过了,其他的面试,哼~,这一面面完就没投了,重新做了个数据库项目丰富简历,隔了一个月再战。
面试完至今(6-16)流程还是处理中......(差评)
北京中科全安信息科技
5-25 智联招聘投递,当天约面,效率还是挺高的。
5-27 一面(25min)
面试官上来就介绍了部门业务。
- == 和 equals 区别。
- Java 中的集合介绍。
- HashMap 原理。
- 这里我扯到了这是不安全的。
- ConcurrentHashMap 原理。
- Sync 锁升降机制。
- wait 和 notify 原理?
- redis 基本数据类型。
- Spring 的 IOC。
- 这里我给他扯源码了,扯了五分钟喊停了。
- 工厂模式了解吗?
- 简单工厂、工厂方法、抽象工厂,这里忘记抽象工厂名字了,还是面试官提示的...然后扯了扯设计原则,解耦的好处。
- 啥时候来,能实习多久,反问。
总的而言问的比较基础,面试官非常棒,你答的不完整的还会帮你补充,当天就 offer 了,可是不想去北京(离家太远),拒了。
上汽安吉智能物联技术
5-30 ***投递,6-9 约面,当天面试。
6-9 一面(30min)
- 自我介绍。
- Redis 基本数据类型(真的很喜欢问)。
- Redis 怎么用的?
- 实现关注用 redis 啥数据类型比较好?
- 集合,如果需要按活跃度或等级排序可以用有序集合。
- 讲讲Java 中的集合吧,详细说说?(也挺喜欢问的)
- HashMap 为什么不安全?如何实现安全的 HashMap?
- 你实现了一个数据库项目,讲讲这个项目的难点。
- 事务 ACID 性质?
- 项目中你是如何保障事务的 ACID 的呢?
- 索引相关,聚集索引和非聚集索引?
- Java 中的 IO。
- IO 多路复用底层?
- 反问。
两个面试官,一个问一个记录,总体而言不难,经过几次面试发现你一定要对项目特别熟悉,而且得提前打草稿,总结你项目的难点和技术亮点。
6-13 OC,一天考虑时间,拒了,等字节结果,虽说上汽集团是世界五百强,还是国企,但是能去互联网大厂肯定优先互联网大厂。
字节跳动
5-20 官网投递(无内推),5-20 当天简历挂,5-30 接到电话说被另一个部门捞了,约面,当天下午又打电话来说面试官有事,推迟一周......
6-6 15:00 一面(65min)
面试官上来介绍部门,介绍面试流程,无异议,开始面试。
介绍项目。
- 这里面试官了解到我项目都是学习项目后貌似不感兴趣,就没问了。
计算机网络模型。
- 5层 & 7层,介绍各层协议及功能。
详细介绍下 TCP 和 UDP?用在啥地方呢?
- 这里介绍的比较详细,讲了差不多 10 分钟,面试官反馈也还不错。
场景题,类似 LOL 这种游戏用 UDP 还是 TCP 好?
- 处于对延迟的厌恶,我秒回答 UDP...
你说用 UDP,那我万一放一个技能丢包了怎么办?
- 考虑不周,在应用层做封装,实现可靠的 UDP 协议。
如何实现可靠的 UDP?
- 参考 TCP,对 UDP 编号,在应用层做超时重传机制,然后连接管理和拥塞控制可以不用管,重点是超时重传机制,实现性能与可靠的折中。(UU 们有啥想法呀,可以讨论下)
IP 协议是做什么的?链路层呢?应用层协议了解吗?http 状态码?
- 路由表匹配,决定下一跳地址,然后用 ARP 找到下一跳 MAC,起到路由作用,链路层主要就是封装成帧、透明传输、差错检验,说了说 MAC 协议和 ARP 协议。
线程与进程间的关系。
进程有独立的虚拟地址空间是吧,那虚拟地址空间内有哪些东西呢?
- 问你有哪些程序段了。
线程之间共享哪些数据?
- 这里回答错了呜呜呜,我说了堆和动态链接库。
- 答案是共享整个进程空间的所有数据,即使是线程内的独立栈,如果有一个指向该栈的指针,另一个线程也是可以访问的,所以任何数据都是可以共享的...
程序与进程间的关系?
- 进程是程序的正在运行时,程序是进程的资源集合。
它们之间一一对应吗?
- 不太清楚,我回答应该是一个程序可以多个进程。
说说 Java 泛型的原理?
- 编译期的语法糖,编译期强制转换,运行时向上转型,谈了谈为什么这么设计,主要是兼容旧版本。
如下代码是否能运行,如果不能,会报什么错误?
代码大概就像这样
public static void main(String[] args) throws Exception { List<Integer> list = new ArrayList<>(); list.add(1); list.add("123"); Method add = list.getClass().getMethod("add"); add.invoke(list, "321"); String str = list.get(1); System.out.println(list); System.out.println(str); }
synchronized 的原理,详细讲讲他为什么是可重入的?其他可重入锁了解吗?
- 从偏向锁、轻量级锁、重量级锁 分别解释重入原因。
- ReentrantLock,原理 AQS。
如下代码哪些方法是冲突的,为什么?
- 比较简单,就是考你 synchronized 用法。
Java 的类加载机制。
代码题,字符串匹配,字符串允许乱序,例如 "abcd",在文本串 "ucwdbaccwjab" 中第一次匹配到的位置是下标 3,则输出 3,
- 太紧张了,代码题烂掉了,写了 20 分钟没写出来。
- 一开始以为就是字符串匹配,本来想写 kmp,然后面试官让我写暴力,然后就写了个暴力匹配,,然后面试官提示可以乱序,这时候超级紧张。
- 然后我以为我懂了,我以为是最小覆盖字串,呜呜呜,又理解错题目了,写完了才发现写错啦,浪费了好多时间。
- 这里大脑已经空白了,停止转动了,知道面试官提示已经过去 1 小时了...想哭
反问
面完真的想哭,我算法没那么烂的,力扣 500+,周赛 2150 分,真没那么烂的,现在想着都有点难受,结束后三分钟滑动窗口秒了......
6-6 19:00 问卷调查,收到问卷以为凉了。
6-7 19:35 约二面,收到邮件我是蒙蔽的...可能是真缺人吧,只能感慨运气好,感谢面试官,感谢字节跳动,有时候你离成功就差了点运气......
6-9 16:00 二面(45min)
这一面貌似是 Leader 面,面试官比较老成,反问时还说会给我发 offer。
- 对一面做一个自我评价,你认为那里表现好,哪里表现不好。
- 这里注意不好的地方一定得说一下你会做哪些改变。
- 这里我还提了一句说我计算机基础不错,然后就悲催了......
- 你是怎么认为你计算机基础不错呢?
- 为什么经常总结就能反应你基础不错呢?
- 你善于思考能说明基础不错吗?
- 麻了,最后说了我课程成绩都满绩,总算没问了。
- 平时不会的怎么学习呢?
- 多久能入职?实习多久?大三怎么办?
- 介绍一下常见的排序算法,复杂度,稳定性?
- 链表排序用什么排序呢?
- 归并排序、快速排序。
- 面试官似乎不知道怎么快速排序,于是:算法题:链表快速排序。
- 我都说了,能不会写吗,秒了。
- 谈谈你对设计模式的理解?
- 这题压力好大,我说了很多面试官一直没反馈,等我继续说,说了 7-8 分钟,直到我两大眼瞪小眼,面试官才继续了问。
- 适配器模式和代理模式的区别?装饰器模式呢?
- 谈了谈相同之处,都是增强,可扩展性号,从 UML 类图说明了不同之处,举了举几个例子。
- OS 中的死锁了解吗?
- 这里说了很多,死锁必要条件,死锁预防,死锁检测,银行家算法。
- 算法题:死锁检测
- 拓扑排序秒了。
- 反问
- 面试官说我表现不错,会把 offer 发给我,当时贼开心。
6-9 20:00 问卷调查,6-10 10:35 三面预约,白开心了,还以为直接发 offer 了,面试官说话不算话(虽然结果还是 offer 了,似乎也没赖?)。
6-13 18:00 三面(55min)
字节面试基本不会重复,考察也挺全面的,第一面考察基础,OS + 计网,第二面考察算法与数据结构,还有点 hr 面的意思,三面主要考察项目。
- 自我介绍
- 介绍一下数据库项目,有什么难点,怎么解决的?
- 详细讲讲崩溃恢复,以及项目中检查点机制是如何加速崩溃恢复的。
- 看我了解的还不错,就没问数据库了。
- 介绍一下 RPC 项目,有什么难点,怎么解决的?
- 介绍一下 RPC 的过程,以及你对 RPC 的理解?
- RPC 用了序列化协议?
- kyro。
- 为什么使用 kyro,算法原理是什么,相比原生序列化,xml,json以及谷歌的 protobuf?
- 小程序前后端都是自己写的吗?后端用什么语言写的?
- Java 中数组是对象吗?为什么?
- 是,同样经历类加载的5大步骤,符合对象的声明周期,面试时说错了,我说数组没有继承 Object,事实上是继承了的,晕...
- Java 中文编码几个字节?
- 说 unicode 2 个,然后扯了扯 utf-8 变长编码。
- utf-8 编码原理,怎么变长?
- 平时怎么学习的,个人优点缺点?
- 碰到这种非技术性问题,使劲扯,能拖一会时间是一会(狗头),我这里扯了十多分钟。
- 平时有自己学习什么框架吗?
- redis,mq,spring 全家桶。
- 来讲讲 SpringBoot 吧,我没用过 SpringBoot,现在你得讲的让我理解它是干嘛用的?
- 好难啊,讲的好乱,反问时面试官让我别背答案,可以多思考技术产生背景,问题背后原因等。
- 算法题:树的子结构
- 算法题:爬楼梯,这里是个变种版,一次能爬 1阶、2阶和 5 阶。
- 简单题秒了。
- 之后面试官让优化空间复杂度,我代码是这样的:
public static void main(String[] args) throws Exception { int n = 9; int[] nums = new int[]{5, 3, 2, 1, 1}; for (int i = 5; i <= n; i++) { int newVal = nums[0] + nums[1] + nums[4]; for (int j = 4; j > 0; j--) { nums[j] = nums[j - 1]; } nums[0] = newVal; } System.out.println(nums[0]); }
面试官说不行,这样不是引入了额外的时间复杂度吗?如果把跳 5 阶改成跳 1000 阶你不是额外循环 1000 次? - 当时没想出来要怎么做,因为在枚举完 i 后 dp[i - 5] 肯定要变成 dp[i - 4],如果不赋值的话要怎么做的?因为时间关系面试官就没让我想了,回去之后想了想是不是可以用双端循环队列做,这样就可以达到 O(1)的移动了,不知道大家有啥想法?
- 反问
6-14 10:00 问卷调查
6-15 14:00 Offer,无 HR 面(感觉面试官把 HR 该问的都问过了...)
总的而言我不觉得我自己实力有多强,面试官知道我是大二的都问的挺基础的,运气占很大原因把,写写面经反馈一下社区,积攒一下运气,希望大家都能拿到自己想要的 offer,共勉!
下周就要入职了,有没有深圳的伙伴一起租房呢?
#面试复盘#