Java实习总结

自我介绍

我目前是电子科技大学的一名大三学生。在大一大二两年,我主要的精力都用来准备校内课程学习。在今年的十月份开始准备 Java 实习面试,目前陆续拿到了滴滴、华为、字节跳动的实习offer。

复习过程

10月第一周:看完 JavaGuide的面试突击版中的 Java 基础部分

10月第二周:开始看 B 站上看狂神说视频,学习 Spring 和 SpringBoot 开发,完成项目的初步搭建,看 Shiro 的权限管理和 JWT,为项目加入 Mysql、 Redis(之前有项目开发基础)

10月第三周:看 B站上 马士兵的 2020年9月 JAVA 面试必问的102个知识点(全部弄懂记住),配合 JavaGuide 的面试突击版一起看

10月第四 - 五周:发现了 敖丙的北大面试视频(每看到一个不会的知识点就暂停,去公众号找对应的文章去看,直到看懂整个视频),基本把公众号里的50%的内容都看懂,能够自己复述一遍

11月第一 - 二周:开始投了第一家面试公司(跟谁学),因为没有准备操作系统和计网以及算法,理所当然地挂掉了。于是开始疯狂刷算法,一周刷完了 LeetCode 100题,加上之前复习时每天都会写一点算法题,差不多用了 10 天 刷完了 LeetCode Hot 100、腾讯 Hot 50、剑指 Offer

11月第三周:找朋友内推了滴滴,花了一天复习操作系统、两天复习计网、一天复习 SQL 语句书写,顺利通过滴滴的一二面

11月第四周:找导生内推了字节,顺便投了华为,主要针对字节的面经去复习,顺利拿下字节和华为(华为因为走的校企合作项目,难度比较低)

跟谁学面经

跟谁学一面

介绍一下项目:

  • 我讲了项目的前后端分离,Shiro,JWT,Redis,MySQL
  • 问使用的MySQl引擎是哪个,答Innodb,追问还了解那些引擎,追问Innodb 和 MyIsam 的区别(这边答得一般,没回答全)
  • 问 MySQL 的优化过程,从 explain,到 随机采样, analyze table, force index,覆盖索引,最左前缀原则(这边面试官看我比较懂,就没问了)
  • 问 Redis 的更新操作,答 延时双删,追问双删时,先删除了缓冲后,又有大量的业务逻辑进来,该怎么缓解数据库压力。(这边没有回答出来)
  • 问 Redis 的负载均衡怎么实现的,答利用自从复制和读写分离(这边举了项目的一些例子)
  • 问 AOP,IOC,追问AOP 有什么好处(只答出一半)

Java基础:

  • 介绍一下面向对象,联合面向过程和封装、继承、多态答了一下。追问解释封装、继承、多态。(多态这边没答好,扯到泛型去了)
  • 讲一下 Java 的泛型,没答好,扯到 反射去了。
  • 类怎么实现多继承(答接口)
  • 讲一下线程和进程,追问什么时候使用多进程,什么时候使用多进程(没答好)
  • 讲一下进程的几种状态(讲的特别乱,也不全)
  • 追问 多进程之间怎么通信(紧张到没答出来)

计网:

  • 讲一下 TCP/IP 模型
  • 追问 TCP / UDP的区别和使用场景,讲了 DNS 是使用 UDP,追问为什么?
  • 问 TCP 怎么实现可靠传输的
  • 问流量控制和拥塞控制 (计网这边都没答好)

算法题:(用的百家互联)

1
2
3
4
5
6
7
8
9
10
11
12
二叉树右侧投影
从右向左观察一棵二叉树,返回能看到的元素

1 <-----
/ \
2 3 <-----
\ \
5 7 <-----
/
6 <-----
应该返回[ 1, 3, 7, 6 ]
// 想了半天没想出来,面试官提示了层序遍历,还是没写出来
1
2
实现一个快排算法
// 一开始都写成二分查找去了,后面改成了冒泡排序,然后也没有写完,好久没写过快排了

结束的时候,面试官问了一下我的博客网站,面试官建议要多复习一下基础知识,我和面试官讲自己很惭愧,觉得肯定过不了一面了,面试官说还要考虑一下其他面试者的情况,一面结果会在晚上或者明天通知,不过我觉得应该就是凉了。

自我反思

  1. 首先是计网和操作系统,加上 Java 的基础部分,因为没有怎么准备,回答的特别差(这边至少要花一周时间,做一下复习,记在脑子里)
  2. 其次是要注意构建知识树,不要被面试官绕着走,遇到会的题,要一层层的深入进去,直到面试官打断(这一点特别重要)
  3. 对于算法题,还需要多刷一下,多做总结,刷的题型还是太少,刷的过程要少看题解(算法题还特别差,必须要在十分钟内能够有清晰的思路)
  4. 注意每天都要复习一下今天看过的知识,最后是自己讲一遍,这样面试才不会特别紧张
  5. Redis 和 AQS 这边还没有都弄懂,还需要继续补知识
  6. 再认真准备一周,下周日开始投滴滴和京东

跟谁学总结

首先拿到 Offer 的第一步是投出简历,第二步就是通过面试,跟谁学是我面试之旅的第一步,也是至关重要的一步。通过这次的面试,我发现自己存在的巨大的知识储备和面试经验的问题。

滴滴面经

滴滴一面

自我介绍和项目介绍

Java 基础知识:

  • 集合类:ArrayList、LinkedList、HashMap、ConCurrentHashMap、HashTable、Collection.SynchronizeMap(八分钟)
  • CAS、Synchronized
  • 有没有遇到过解决并发的问题?(没答出)
  • == 与equals的区别、HashCode、整型对象Integer比较用哪个
  • Object类有哪些方法(没答好,HashCode、wait、notify)
  • 重写和重载的区别
  • JDK1.8 的 Stream 的新特性(不了解)

MySQL :

  • Server层、引擎层
  • 索引选择问题(数组、链表、二叉搜索树、平衡二叉树、红黑树、B树、B+ 树)
  • 索引优化:建索引字段要怎么考虑(explains、force index、analyze table 、随机查找、联合索引、最左前缀匹配原则,索引下推)
  • 性别字段适合建索引嘛?(没答好,性别字段区分度不高,只有男和女)

Redis :

  • 为什么使用Redis, Redis 的英文介绍, 高并发,高性能

Linux:

  • Linux 下的常用命令(没答好)

项目相关 :

  • Spring 的事务传播机制(不会)
  • Mybatis 相关知识,¥ # 的区别(不会)
  • JWT(HTTP、Cookie、Session、JWT)
  • Shiro(Subject、SecurityManager、Realm、执行过程)
  • 异常处理机制怎么操作

设计模式 :

  • 单例模式(开IDE 手写 DCL,加解释 volatile)
  • 工厂模式

一面反思

基本上准备的都答出来,自己还是比较满意,面试官是个漂亮小姐姐,面试过程也非常 nice 。因为面试的时间比较长了,就手写了一个DCL, 没有写其他算法题。面试官说她已经给我过了,之后 HR 会联系我,建议我平时多写一些代码。面试和我讲这边是橙心优选,加班比较严重,业务都是新的,挑战比较大。

滴滴二面

明显感觉二面的面试官技术强了很多,一看头发就是资深程序员

一开始是自我介绍(个人网站讲解),然后问了线程池(讲了 Java 线程模型、线程池的几个参数(原理)、拒绝策略)(6分钟)

HashMap 死循环问题(从1.7 扩容,头插开始讲,到 1 .8 尾插,遗憾的是没有举出一个例子)(5 分钟)

Synchronized 和 ReentrantLock(从对象头开始讲,moniter,作用于代码块,方法;AQS,CAS,入队规则;两者的使用比较)(5 分钟)

SQL 语句书写(开 IDE,还好昨晚临时练习了一下,都写出来了)(10 分钟)

写一个支付最少数量的纸币的付钱算法(写是写出来了,但是好像算法不太好,用了三个循环,但是复杂度其实不高)(10 分钟)

二面反思

感觉二面的面试官比较随意,就是想问啥就问啥,同时喜欢问偏底层一点,面试官说结果要两天左右通知我,他还要和第一个面试官讨论一下。我总觉得他对我不太满意,但是我基本上都回答出来了,就是可能回答的不够深入吧。

字节跳动面经

字节跳动一面

自我介绍了一下(学校、年级、奖项、GPA)

讲讲UDP 和 TCP 的差别(具体讲 TCP 怎么实现可靠传输的,我讲了拥塞避免的三个状态及全部过程,扯了一下TCP的版本问题,面试官补充了重传机制)

UDP的使用场景(视频传输,DNS详细地讲了一下)

线程和进程的区别(从操作系统、JVM、协程,CPU调度的什么,协程与线程调度的区别)

HTTP协议(状态码(涉及的不够细),HTTP1.0 ,1.1,2.0,HTTPS,非对称加密和对称加密)

怎么实现 Redis 的快照机制,能够保证在 dump 过程中能够相应其他请求(让我自己来设计,我借鉴 Hash 的内存结构设计,自己简单设计了一个,用了两倍的内存空间)

Java 怎么标记 GC 的(引用计数法,GC roots,roots 由哪些构成的)

算法题:

先给了一题LeetCode 困难问题,接雨水(我大致讲了一下实现思路)

然后又给了一题LeetCode 中等问题,计算两个链表倒序相加的,比较简单

一面反思

面试官人真的超好,问的题目也比较基础,接下来还是再认真准备一下,说不定就进字节跳动了呢?

字节跳动二面

简单自我介绍一下

直接开始写算法题

LeetCode medium 难度 :链表排序(要求空间复杂度为常量),我用插入排序写出来了,面试官让我再用归并排序写,我稍微讲了一下思路,没写出来

LeetCode hard 难度:n 皇后问题

写完两道算法题之后,面试官让我简单讲讲 MySQL 懂的所有知识、Redis 的数据类型

最后问了 cookie、session 的详细问题

二面反思

一开始都觉得自己要挂,后面突然状态好了起来。

字节跳动三面

这次的面试感觉出乎我的意料,不像是面试,更多地是面试官去引导我怎么思考。

一开始和面试官讲了我的基本情况,以及展示了自己的博客, 然后和面试官聊了一下关于抖音产品的看法。

之后面试官出了一道比较困难的 24 点组合问题,我在提示下一点点理清了思路,但是后面的递归的写法不太好。

最后面试官问了一个偏向架构设计思维的问题:抖音 的话题排行榜该怎么设计

我只是简单地从系数加权的角度来讲,后面面试官给我普及了大量的思维方式:

可以从视频内容、地址、时间、主题等信息去做一个相似度的分组处理,同时如果要做一个话题评论区,就从单纯的只读需求,到了写需求,如何做到评论的时效性和通知信息等等。

三面反思

其实这次面试表现不太好,面试官也直说我的能力和竞争的本科生没有太大的优势。不过,我还是要乐观地去面对它,希望能够拿到这个令我心动的Offer吧。

字节跳动四面

四面是 HR 面,主要是聊了一下自己基本情况(成绩、比赛、入职时间、毕业时间(读研还是工作)、自己的相处能力、团队配合能力)

字节跳动总结

字节的第一轮面试是员工面,强调基础,需要特别注意复习好操作系统和计算机两门课程,有精力还可以学一下图论和密码学

字节的第二轮面试是小 leader 面,强调算法,需要尝试去刷一些 LeetCode Hard的提醒,训练一下自己思维,我每一轮面试都遇到了 Hard 问题

字节的第三轮面试是大 leader 面,强敌算法思维的极限和架构分析思维,可以去看一些架构设计的书和一部分 ACM的题

常见的面试问题

Java 基础

  1. 封装、继承、多态
  2. 重载和重写的区别
  3. Object 类下有哪些方法
  4. HashCode、equal、==
  5. String、StringBuiler、StringBuffer
  6. 自动拆箱与自动装箱(特别是 Integer)

Java 集合

1. HashMap 的所有知识(1.7、1.8、头插、尾插)	 
2. ConcurrentHashMap、HashTable、Collections.SynchronizedMap
3. LinkedList、ArrayList

多线程

  1. 线程池的五大参数、执行原理、拒绝策略
  2. Synchronized(作用于对象、代码块、方法)
  3. Volatile(缓存行、可见性、重排序)
  4. AQS(ReentranLock)

JVM

  1. 方法运行时的内存区域
  2. 双亲委派加载机制
  3. 垃圾回收算法与垃圾回收器

计算机网络

  1. 应用层:HTTP(1.0、1.1、2.0、HTTPS)、DNP
  2. 传输层:TCP(拥塞避免、滑动窗口、重传机制)、UDP
  3. 网络层:IPv4、IPv6、ICMP

操作系统

  1. 进程与线程、几种状态

  2. 七种进程间通信(匿名管道、管道、信号、信号量、消息链表、共享内存、套接字)

  3. 分页和分段

  4. CPU 调度算法(先来先服务、短作业优先、优先级调度、多级反馈队列调度)

Redis

  1. 五大数据结构
  2. Redis 持久化
  3. 缓冲雪崩、缓存穿透、双写一致性等等
  4. 内存淘汰机制

Mysql

  1. 为什么使用 B+ 树做索引(与其他的数据类型做比较、红黑树、二叉平衡树、B树等等)
  2. 存储引擎(Innodb、MyIsam)
  3. 事务隔离级别、MVCC
  4. SQL 优化(慢查询、各种索引理一遍)