博主本人是非科班硕士,今年三四月份时开始刷题准备找工作。实习加秋招投了很多大厂&中厂,但是有小一半都没能进面试。秋招最终拿到了OPPO提前批测开、腾讯音乐后台开发、阿里云Java开发的offer。写这篇文章是为了复盘顺便记录面试经历(一段痛苦迷茫难忘的时光),然后为和我一样到研二才开始学这些的半路出家者提供可以快速掌握面试所需知识的一些知识点outline(攒攒人品)。
重申:想好好学计算机的一定要一点点的看书构建知识体系,本文学习路线仅为提供快速混进春招秋招的队伍接受各种面试捶打的捷径。本人知识量有限,如有错漏请指出,感谢。
OUTLINE
- 后端岗位需要掌握的知识点
-
- Java 相关
- 计算机网络
- 数据结构和算法
- 操作系统
- 计算机组成原理
- 数据库
- Linux
- 设计模式
- 其他
- 博客资料推荐
- 面经部分
-
- 春招实习阶段
-
-
- 1. 腾讯 (不知道哪个g) 的事务型后台开发 (挂)(有认真复盘)50min
- 2. 阿里-钉钉 测试开发 笔面 (挂) 1h
- 3. 阿里 (不知道哪个部门给我捞起来的) 测试开发 一面 (又挂了)1h30min
- 4. 美团 Java开发 一面(挂) 40min
- 5. 网易互娱 游戏测试开发 一面(过)50min
- 6. 网易互娱 游戏测试开发 二面(过)1h
- 7. 京东 (广告数据部) 大数据开发 两面连着 (过) 1h+1h10min
- 8. 字节 Java开发 一面(过)1h10min
- 9. 字节 Java开发 二面(挂)1h
- 秋招正式阶段
-
-
- 1. 字节 提前批测试开发 一面(挂)(有认真复盘) 50min
- 2. OPPO 提前批 测试开发 一面(过)40min
- 2. OPPO 提前批 测试开发 二面(过)30min
- 3. 腾讯音乐-QQ音乐 后台开发 一面(过)1h20min
- 4. 腾讯音乐-QQ音乐 后台开发 二面(过)50min
- 5. 阿里云 JAVA开发 一面(过)1h
- 6. 阿里云 JAVA开发 一面(换了一个事业群)(过)1h40min
- 7. 阿里云 JAVA开发 笔面 (过)1h
- 8. 阿里云 JAVA开发 二面(突然打电话的)(过)30min
- 9. 阿里云 JAVA开发 三面 (过)1h
- 10. 阿里云 JAVA开发 主管面 (过)30min
- 11. 阿里云 JAVA开发 交叉面 (过)40min
- 12. 字节-飞书 大数据工程 一面 (挂)55min
- 附录1 笔试题1 代码
- 附录2 笔试题2 代码
后端岗位需要掌握的知识点
分成两部分来说,第一部分是和你选择的编程语言相关的东西,第二部分是和编程语言无关的计算机基础。
- 语言相关的东西,如果你选的是Java,那针对这个语法基础的东西可能不会被问太多。因为Java没有指针,比较简单。但是在大部分的一面中,会涉及到:
Java 相关
- 关于面向对象的一些概念(继承,封装,多态),并结合JAVA语言特性的一些问题(Java不允许多继承,引入接口)
- 一些关键字(static,volatile,extends, final等)和一些常用类/接口相关(StringBuilder,StringBuffer,Comparator等)
- JAVA的集合类的一些问题,也是常考的,这块结合数据结构和算法以及多线程,内存的东西也能展开很多问题,我自己也总结了一些问题和答案。
- JVM(JAVA 虚拟机)相关问题,这是面试的重点了。Java最大的特性就是他的运行是不依赖操作系统的硬件平台的(一次编译到处运行),因为JVM的存在,为Java程序的运行屏蔽了不同操作系统间复杂的差异性,同时又提供了自动的垃圾回收(GC)机制,相对安全的内存管理和访问限制。
JVM涉及到的知识点有:垃圾回收,及 内存管理 两大块
这部分内容有时间可以好好看看《深入理解JAVA虚拟机》,没时间可以看马士兵老师的公开课,或者公众号“码海”关于GC和内存的文章,也讲得很好很细 (这块就是,平时可能用不到,但是面试需要造火箭所以经常问)。
- JAVA多线程相关内容,也是大部分会结合操作系统问, 这块也可以看看马士兵老师的公开课。
- Java的反射机制,泛型等稍高级的特性(会结合spring那些问)。
- 与语言无关的部分,就是无论你选择JAVA,还是C++,或是Python, go,都会被问的东西。无非就是计算机考研408的那四门课,再加上后端开发工作中常用的数据库和linux,还有网络编程相关的(这个我自己是没看但是被问过)。但是面试中会考察的计算机原理,计网等内容都有限,大致看看面经背背答案就能应付大部分面试了[\doge].
接下来具体列出每个板块必须要掌握的知识点,需要注意的是,在一点点去找相关知识点看的过程中,需要想办法把他们连成线和面,尽量去把有限的知识量构建成知识体系。因为面试官问的问题有时候不仅仅只针对一个点的,如果能往深里答那就很加分了。
知识点的列出按照先后顺序,列在前面的表示更重要(高频)
计算机网络
- TCP链接可靠建立和取消相关,即三次握手和四次挥手(为什么三次握手能保证链接的可靠建立?为什么四次挥手?time_wait为什么2MSL…)
- TCP的可靠传输相关,拥塞控制等
- HTTP/HTTPS协议
- UDP协议(和TCP的区别,现实场景中哪些用UDP,哪些TCP)
- IP地址、MAC地址、OSI七层模型(或者 TCP/IP 五层模型)各层模型对应的常见协议也要有所了解
- 常见网络攻击及应对方法,结合网络协议(DDOS攻击,TCP SYN Flood等)
数据结构和算法
这块结合算法题去看(应付面试刷完剑指offer就差不多,笔试得多刷力扣)
两部分来看:
part 1 数据结构:
- 线性表(数组,链表,是基础)
- 二叉树(结合算法,回溯,动归,分治,非常重要)
- 栈,队列
- 堆
- 图
part 2 算法:
- 排序
- 二分法
- 动态规划(背包问题)
- 回溯(深度优先搜索)
- 递归
- 贪心
- 分治
- kmp
- LRU
操作系统
- 进程,线程概念
- 进程间的通信方式
- 多线程(结合JAVA线程池问,结合内存管理问)
- 各种锁(JAVA中的synchronized关键字,锁升级过程等等)
- 死锁,死锁预防和避免(银行家算法)
- 同步问题(生产者-消费者,哲学家进餐问题)
- 孤儿进程,僵尸进程概念
- 虚拟内存管理(结合计组,页面置换算法)
- 磁盘调度算法
计算机组成原理
- 虚拟存储器相关的,缓存分页等
- cache的基本工作原理
数据库
数据库部分也可以分为两个部分,一部分是数据库操作
- 常用的增删改查的操作
- 高级一点的操作比如分组排序,join查询等
另一部分是数据库原理,包括了索引和并发控制(MYSQL数据库)。
- 索引存储结构(为什么用B+树)
- 索引使用相关,主键索引,最左前缀原则等
- 数据库的锁分类,按照不同方式可以分乐观悲观锁,行锁表锁,读锁写锁等
- 事务(ACID)
- MVCC
还有关于NoSQL数据库比如redis相关的问题
- Redis的特点(纯内存操作,性能高,单线程多路IO,非关系型)
- Redis的持久化(AOF, RDB)
- 日志相关,redo log, bin log(这个mysql的也有)
- redis内存淘汰机制
- 一致性hash
还有分布式数据库相关的问题,一般涉及主从架构,读写分离,一致性保证,性能调优等。
Linux
这块知道常见的命令就可以,主要分几个部分,进程管理(ps,top, kill,df),文本编辑匹配(grep,sed,echo,awk),网络通信(ping,ssh, ifconfig),文件管理(ls,mkdir,cp,mv,rm)等,还有linux
系统的文本编辑器vim的操作
设计模式
- 单例(要会写代码,七种写法,掌握饿汉,懒汉,DCL线程安全写法就可以了)
- 工厂方法模式,抽象工厂模式
- 动态代理
其他
Java后端常问的还有关于Spring家族的问题,如果有自己找一些微服务的小项目练手,可以对这部分的知识重点关注,面试的时候聊聊这个也可以。
博客资料推荐
Java选手可以参考以下博客的基础知识总结
算法部分
面经部分
因为hr面我基本没有录音所以就不记录了。本人其实投了挺多中厂的,但是要么简历没过要么笔试没过(大厂一般都会给面试机会,但中小厂如果看你没有相关项目经历,或者hc没了就不会面你了,所以投递的时间点很重要,尽早投。然后就是,笔试很重要啊T-T)
春招实习阶段
(这个时候我还啥都不会,所以面试官基本都是问基础.)
1. 腾讯 (不知道哪个g) 的事务型后台开发 (挂)(有认真复盘)50min
- 自我介绍(学校,专业,论文),问了项目,为什么找工作不找和现在的论文研究方向相关的东西,论文偏理论还是实践?
- python 内存管理了解吗 (因为我项目关于机器学习要用python,面试官后来说他们平时用C++,像python这种脚本语言也用)
- python 常用的数据结构了解吗(回答了类,数组的切片,然后就扯到了tensorflow,好像面试官不了解这个,就没问)
- 垃圾回收机制 (终于问到我会的但是答得乱七八糟)
- java的内存空间(栈,堆,静态区)
- 常用的GC算法(反问了一下是不是指判断对象是否无用的方法,然后回答了引用计数和根搜索)
- C++熟悉吗(我说不太熟悉了)
- redis中的数据结构(答了set,list,soret set,hash table)
- 使用redis时内存达到瓶颈,集群达到瓶颈?就是缓存需要放到内存里,不然断电了就没了(不会。后来反应过来应该问的是持久化)
- 分布式锁 ?
- Tcp和Udp区别
- Tcp为什么是可靠的? 三次握手说一下过程
- 服务端发的ack包的值是多少? 如果客户端发了很多包,那么服务端回的是哪一个包?
- 服务端收到客户端的SYN后进入什么状态?
- 四次挥手说一下 (time wait, 多久)
- unix命令(listen什么的)
- mysql用的什么引擎(innoDB)
- 数据库的并发控制了解吗(我答了悲观锁乐观锁和Mvcc)
- 在什么场景下需要用到这些(我答得好像错了,面试官说mvcc其实是乐观锁的一种,他希望这个问题我可以说一下行锁,共享锁这些)
- 多进程与多线程的区别(妈耶这个我会太激动了然后就答得乱七八糟啰里八嗦…面试官中间问了一下进程之间能不能共享资源,然后说最根本的区别是进程是资源分配的最小单位,线程是独立调度的最小单位)
- 排序算法知道哪些
- 快速排序的过程说一下,平均的时间复杂度,最好的最坏的情况的复杂度
- 最坏的情况是怎么造成的,既然这样,如何优化快排,避免最坏情况发生(问了一下是不是就是找靠近中位数的数做基准,我答了在每次递归选基准数之前先获取几个数找中指,以这个中值做基准)
- 你这么优化算法复杂度还是挺大的(我说那不是就O(nlogn),然后面试官说你这个找中位数可以简化一下,找三个数出来求中位数,我说我一开始想的是这个,但是想着要是n和3相差不大的话,取整个分区的中位数也不会增加很多复杂度)
- 有什么问我的?(腾讯的事务型开发做什么,就是后台,用c++)(校招中比较重要的是哪些方面,基础知识,计网算法数据库操作系统那些,还有就是面试者的研究方向和项目中体现的解决问题的能力。)
2. 阿里-钉钉 测试开发 笔面 (挂) 1h
两道代码题,给一个小时
- 编写两个线程,一个线程打印‘你好‘、’钉钉’、‘你好‘、’钉钉’……,另一个线程打印‘hello‘、’dingtalk’、‘hello‘、’dingtalk’…….然后通过一个main函数启动这两个线程,打印出‘你好hello钉钉dingtalk你好hello…’
- 判断111 - 333之间有多少个质数
3. 阿里 (不知道哪个部门给我捞起来的) 测试开发 一面 (又挂了)1h30min
- 介绍论文项目 ,从项目中取得了哪些能力
- 觉得自己和别的同学比,优势和弱势分别是什么
- 在项目中,如何测试强化学习算法有效性(感觉是结合测试,采集的数据要考虑哪些方面)
- hashmap 的工作原理(底层实现?),它是线程安全的吗?
- 悲观锁和乐观锁的概念和区别
乐观锁如何得知访问的对象是不是被修改了(CAS,加版本号)
- 多线程如何实现,线程启动
- Runnable和callable的区别
- 栈和堆的区别
- 对象存储在栈还是堆里?
数据库部分(基本全不会):
- 左连接右链接
- 数据库的事务概念,有哪些特性(原子性,一致性,隔离性,持久性)
- 索引加在哪?
- 如何更新数据?
linux:
- 想看一个文件内容,用什么命令(cat)
- 如何查看日志
- ps -a是什么意思
- 如何打印出文件中以数字开头的行
- 正则
- linux 自带一个文档编辑软件VIM?
撕代码:
输入10个整数,输出其中乘积最大的三个数
(要考虑负数哦)
归并不同的情况,其实是一样的。。
int[] nums = new int[10];
System.out.print(nums[7]*nums[8]*nums[9]>nums[0]*nums[1]*nums[9]? nums[7]+nums[8]+nums[9]+"":nums[0]+nums[1]+nums[9]+"" );
被喷打字速度?
有什么要问我的?(被夸问了好问题)
- 您为什么要做测试?
- 在您的实际工作中,如何判断一个项目/产品已经ok,可以交付了呢?是通过经验还是有硬性的数据指标这样?
4. 美团 Java开发 一面(挂) 40min
- Java中常用的集合介绍一下
- HashMap 介绍一下
- HashMap --常用的解决冲突的方法
- jdk 1.7和1.8在hashmap的实现上有什么区别
- volatile关键字了解吗
- 什么场景下会使用volatile关键字
- 在一个数组中找特定的数字
- 一个表里有三个字段,name, course1_grade, course2_grade, 查找出每门课成绩大于80分的人的姓名
- 介绍一下JVM(你了解的部分)
5. 网易互娱 游戏测试开发 一面(过)50min
- 论文(描述做了什么,为什么这么做,有什么没解决的问题,接下来有新的解决方向吗)
- 代码题:角色A从一个二维矩阵的左上角出发寻找右下角的角色B, 二维矩阵中有障碍物不能通过, 设计一个算法计算有多少种走法
Example:
下面的3*3的地图中只有一个障碍物
[
[0,0,0],
[0,1,0],
[0,0,0]
]
总共有2种走法
- 平时会玩游戏吗,都玩些什么游戏
- 单机游戏和网游在实现上有什么区别
6. 网易互娱 游戏测试开发 二面(过)1h
- 论文 (为什么用强化学习解决这些问题,怎么采集数据的)
- 算法题:输入不确定个数(很多),重新排序使得所有的奇数都在偶数前面,如何插入一个数到已经排好序的数组中(用什么数据结构实现)
- 玩什么游戏比较多(玩什么英雄,谈谈对这个英雄的理解)
7. 京东 (广告数据部) 大数据开发 两面连着 (过) 1h+1h10min
这一part我没记面经,只记了代码题,大致问的题目就是计算机基础的常规问题。以及针对我的论文的一些问题
代码题:
-
实现一个函数: input:A = [1,1,2,2,3,3,8], target = 7 output: false
实现一个函数: input:A = [1,1,2,2,3,3,8], range = [3, 5] output:2
-
req_time 10:00:00 click_time 10:00:30 在10:00:00-10:00:30之间这个点击是延迟点击
10亿条点击日志 log[req_time,click_time] 10亿条点击日志,统计00:00:00 - 23:59:59内的延迟点击数
8. 字节 Java开发 一面(过)1h10min
- 谈一谈Java中的Hashmap
- hashmap实现中的链表用的是头插法还是尾插法
- Java中并发安全的hashmap有哪些,是如何实现的
- sychronized关键字的实现,锁升级过程
- sychronized是可重入锁吗
- 对基本的设计模式有了解吗
- 写个单例模式的懒加载,以及线程安全的实现
- 二叉树打印
9. 字节 Java开发 二面(挂)1h
- volatile 关键字了解吗
- 讲一个必须使用volatile关键字的场景
- 将hashmap中的所有value打印出来
- 代码题:
1) 已知一个List list
现在需要写一个函数,通过这个函数能够把list中,以"1_"开头的元素都删掉。
写这个函数的代码。
答案:
public List<String> delet1L (List<String> list){
for(String s:list){
if(s.charAt(0).equals("1") && s.charAt(1).equals("_") ){
list.remove(s);
}
return list;
}
}
2) 已知一个函数f();每次调用时,能够产生[0,N)的等概率的整数。
需要你通过这个函数,产生一个新函数。这个新函数每次调用时能够产生[L,K)的等概率的整数。
3) 有一个整数数组 8,4,10,5,9,6,14,13,11
求:第一个间断的数 7
要求:
时间复杂度:o(N)
空间复杂度:尽可能小
-
介绍一下垃圾回收
-
堆有垃圾回收吗,栈有垃圾回收吗,为什么
-
TCP的三次握手,如果握两次会有什么问题
-
在一台电脑上起一个TCP的socket监听一个端口,再起一个TCP的socket监听这个端口,它肯定会报错,如果是起一个TCP的socket监听一个端口,再起一个UDP的socket会报错吗?
答:也会报错,因为端口属于系统资源,不能被多个进程共享,一个端口只能被监听一次
-
垃圾回收都有哪些方式
秋招正式阶段
- 这个阶段因为是边实习边面试,有时候着急了我就躲在楼梯间面试所以没有录音也来不及记面经,包括百度两面,招银网络科技三面,所以这里只有部分记录
- 由于我实习项目是大数据开发相关的,所以秋招阶段的面试中有涉及比较多的大数据处理和中间件相关知识点。
- 如果想要找大数据开发相关的工作,需要多了解一些流计算工具的底层原理,例如消息队列(kafka, RocketMQ),大数据计算平台相关(Flink, storm, Spark, MapReduce),不同框架和中间件的基本原理,使用场景,以及高性能数据库相关的内容。
1. 字节 提前批测试开发 一面(挂)(有认真复盘) 50min
-
内存泄露和内存溢出有什么区别
-
http 和https有什么区别,https加密的方式和方法知道吗
-
tcp 和udp的区别,说一下这两个协议在生活中的应用场景,微信的什么是用TCP什么是UDP
微信用的是HTTP短链接和TCP长连接,登录验证身份信息等用的http,消息使用TCP长连接,视频是UDP
-
面向对象的三个特征:继承,多态,封装,分别描述
-
进程和线程的区别
-
线程创建的方式
一、是继承Thread方法;首先继承Thread方法,重写Thread的run()方法
在main()方法里创建一个MyThread对象,调用该对象的start()方法,start()方法会通过对系统底层的一系列操作,创建出一个相应的线程,与当前线程并发执行。如果直接调用run()方法,程序将执行完run()方法后才会执行main()方法中后面的代码,这样就是单线程执行而不是多线程并发执行了。
二、是实现Runnable接口; 使用Runnable接口与继承Thread类的用法相似
不同的是,实现Runnable接口的类中没有start()方法,所以要用Thread构造个方法开启线程
三、是实现Callable接口和Future创建线程。首先创建Callable接口的实现类CallableThread,实现call()方法,并且有返回值。Callable接口是一个带泛型的接口,泛型的类型就是线程返回值的类型。实现Callable接口中的call()方法,方法的返回类型与泛型的类型相同。
-
代码:出现次数超过一半的数
import java.util.Scanner;
public class Main {
public int MoreThanHalf(int[] nums) {
int ma = nums[0];
for(int i=1, c = 1; i<nums.length; i++){
c = nums[i] == ma ? c+1:c-1;
if(c==0){
ma = nums[i];
c =1;
}
}
int c = 0;
for(int v:nums){
if(v == ma) c++;
}
return c > (nums.length/2) ? ma :0;
}
}
-
智力题:7克、2克砝码各一个,天平一只,如何只用这些物品(最少的次数)将140克的盐分成50、90克各一份
答:第一步:把140克盐分成两等份,每份70克。
第二步:把天平一边放上2+7克砝码,另一边放盐,这样就得到9克和61克分开的盐。
第三步:将9克盐和2克砝码放在天平一边,另一边放盐,这样就得到11克和50克。于是50和90就分开了。
2. OPPO 提前批 测试开发 一面(过)40min
- 介绍实习项目(介绍广告后台系统的架构,分布式数据库ck,doris,数据迁移基于什么需求,最终选择Doris是为什么)
- 能不能讲一下Java 的GC机制
- docker容器这块有了解吗,在哪些场景下使用过
- 在开源社区有贡献过代码吗(没有)
- 代码题:有一段未知长度的字符串,需要去掉以下条件的字符串,第一个条件是逻辑上连续(ASC码连续)的三个字符串例如“ABC”,第二个条件是第一个和第三个相等的字符串,例如“ABA”,第三个条件是第二个和第一个或第三个不相等的字符串,例如“ABD”. (其实就是除了第二个字符串必须要和第一个或第三个相等但三个不能全相等也不能连续才会被保留,例如“ABB”, “AAB”)
- 假设给你一个高跟鞋,你如何测试它
- 对测试框架有了解吗
- CI,CP,CD接触过吗
- 逻辑题:假设你站在一面镜子前,现在就有个问题,为什么镜子可以颠倒左右而不是颠倒上下的
- 你可以就专业技术或工作内容提一个问题
2. OPPO 提前批 测试开发 二面(过)30min
- 有没有自己独立开发完成的功能模块,详细讲述一下
- 你刚刚说你需要做压测,是用什么工具,具体怎么做的
- 除了实习经历外,自己在学校有别的开发经历吗
- 在学校的社团活动参与过吗(不是hr面但是问了这种问题。。开始闲聊)
3. 腾讯音乐-QQ音乐 后台开发 一面(过)1h20min
- 介绍一下实习项目
- 说一下面向对象的特性,具体说一下多态吧
- 看你论文和学校项目是做强化学习算法的,实习是做大数据的,为什么想要找后台开发的工作
- 为什么会选java作为主语言
- 介绍一下你知道的JVM(为什么有这个东西,用来解决什么问题,内存管理,垃圾回收,说了半个小时)
- 垃圾回收的STW你知道吗,它会如何影响机器性能
- Java里的集合介绍一下,几个类
- 线程安全的集合有哪些
- LinkedList和ArrayList的底层实现有什么不同,应用场景有什么不同
- ConcurrentHashMap 的实现,底层如何保证线程安全(JDK1.7,1.8的实现有什么区别,锁粒度区别)
- 介绍一下Java里的锁吧(锁升级)
- 并发安全的操作
- 多线程的内存管理了解吗
- 进程间通信的方法有哪些
- sychronized关键字的作用
- TCP和UDP介绍一下 (三次握手四次挥手)
- 握手时除了序列号还传了什么
- 如何确保TCP报文有序性,握手的报文保存吗
- 如果有一个客户端不断发送握手请求,导致服务器宕机,如何解决(SYN 泛洪攻击)
- 消息队列有了解吗,用过哪些
- NoSQL的数据库了解吗
- redis有哪些特点
- redis的持久化如何做
- 集群的同步怎么实现的
- 有什么问题要问我
4. 腾讯音乐-QQ音乐 后台开发 二面(过)50min
- 介绍一下你的论文吧(15分钟)
- TCP的三次握手介绍一下
- 如果我有一个服务器的TCP请求总是超时严重,你会怎么考虑解决(从存储的角度考虑一下)
- 代码题:给定播放量数组 [225,321,456,788,1023,223,456,221,566]
飙升的定义:连续4天播放量增长;求在给定的这一个周期内飙升的次数
5. 阿里云 JAVA开发 一面(过)1h
- 介绍一下论文项目(应用场景)
- 介绍一下实习项目
- 能介绍一下Jstorm吗,它的幂等性是怎么实现的
- Jstorm在流计算中能达到的语义是什么,是At least once 还是 exactly once,它能不能做到exactly once呢?
- 分布式计费需要做到exactly once,业务上是如何去确保的呢
- 你遇到过流计算中因为某个节点的问题导致的整体性能被影响的情况吗,你是如何解决的
- (因为我提到了数据丢失)你的系统是exactly once的,为什么会有数据丢失,举个例子
- sink端写数据库怎么实现的,它应该是知道每条数据有没有写成功的 (结合业务的问题)
- (然后我提到了我们要迁移数据从hdfs到Doris),因为hdfs是没有主键的非关系型,而doris是需要主键的,你们是怎么做这个迁移的
- 查询的是最终状态,如何保证从doris中查询到的是正确的终状态结果(写增量,存的是什么)
- 为什么不用spark
- kafka拉取数据的时候,是按照Kafka的时间戳点位拉数据的,但是计算式按照kafka的点位还是真实的点击时间算(可能由于网络延迟或是网络延迟,产生kafka中数据的乱序)
- kafka乱序的问题如何解决(生产者端和消费者端两个角度,结合业务)
- Java多线程的内存模型有了解吗(可见性,主存,线程内存,同步数据)
- Java集合了解吗,hashmap源码看过吗,内存结构了解吗。
- hashmap是怎么处理hash冲突的
- 代码题:1. 有一个等差数列数组,但是缺失了一项,如何快速找出缺失的数?
2.如果缺了两项呢?(不一定是连续的两项,通过差值除以二取整可以确定这两个缺失项的对称轴,那么问题转化为找一个缺失项)
6. 阿里云 JAVA开发 一面(换了一个事业群)(过)1h40min
- 介绍一下论文
- 介绍一下实习项目
- 项目中是如何测这些分布式数据库的性能的
- 分布式架构的CAP原则你了解吗?
- 结合你刚刚描述的项目场景,下层服务在发布的时候有灰度发布环节吗?那么分区容错机制是体现在哪里?
- 你实习的日常开发流程是什么样的
- 你实习项目中的报表数据中台指的是什么,上下游具体承接的是什么你知道吗?
- 你们的业务承接上游日志用的消息队列工具是什么
- 为什么考虑使用kafka?
- 你知道kafka有哪些缺点或是局限性吗
- kafka为什么不能实现exactly once 语义
- kafka是基于什么去实现高吞吐量的,和无限扩容
- 常用的注册中心例如zookeeper,evaka这些是CAP中的哪一个
- Java中哪些集合是线程安全的吗
- concurrentHashMap 和 vector 在保证线程安全时的实现方式有哪些不同
- hashmap的内存结构是什么样的
- jdk1.8之后为什么链表长度大于8之后才会转成红黑树(从红黑树和链表的查找时间复杂度考虑)
- Java锁的类型有了解吗
- 什么是自旋锁
- wait和yeild两个方法有什么区别
- JVM的内存模型了解吗,介绍一下
- GC算法有哪些,介绍一下
- G1收集器可以实现标记清除的时候不产生内存碎片,是如何做到的
- 类加载机制你有了解吗
- 双亲委派机制是什么
- 我们可以自己自定义一个加载器去加载jdk自带的类吗?(破坏双亲委派机制,例如利用反射机制初始化数据库连接池)
- innoDB引擎的索引是怎么实现的?为什么用B+树不用hashmap
- 线程池中有哪些拒绝策略
- Java中有哪些网络IO模型
- HTTP建立连接的过程是什么样的
- 现在需要做一个多人实时在线的互动网游,做这种服务器一般用什么网络协议
- 你了解哪些网络攻击方式, 是遇到过还是只是了解
- 数据库的事务你了解吗
- 事务的隔离级别你了解吗
- Redis你了解吗
- 能讲一下spark是如何分配任务的吗
- 你以后想做哪一块的东西,对工作内容有什么自己的想法吗
7. 阿里云 JAVA开发 笔面 (过)1h
因为笔试只有0.2AC所以有一轮补笔试,题目比统一笔试简单一些,1h两道算法题
- 第一题:
现有一个字符串它的构成是岗位名称和,的组合,如“研发,产品,产品,研发”,要求输入一个匹配模式,如xxyy(可以以这种简单的字符来标识), 来判断该字符串是否符合该模式, 举个例子:
匹配模式 = “xyyx”, 字符串 = “研发,产品,产品,研发” 返回 ture
匹配模式 = “xxyy”, 字符串 = “研发,产品,产品,研发” 返回 false
匹配模式 = “yxxy”, 字符串 = “研发,产品,产品,研发” 返回 ture
(答案见文末 附录1)
- 第二题:
一个浴室有3个淋浴间,现在有10个人需要洗澡,5男5女。要求程序模拟10个人(线程),随机去浴室洗澡,确保每个人都洗过澡了,并且避免男女同时使用浴室,每个人洗澡的时间为1s到10s之间的一个随机数。请按照以上描述完成代码。
(答案见文末 附录2)
8. 阿里云 JAVA开发 二面(突然打电话的)(过)30min
忘记录音了,问的比较少,主要是针对项目和论文
- 实习项目介绍
- 论文介绍
9. 阿里云 JAVA开发 三面 (过)1h
- 论文介绍
- 在学校写过的代码
- 主要是针对实习项目中参与的模块和具体开发内容进行具体的提问 (问得很细,具体到每个小指标的数值。包括数据来源,下游业务,具体的性能测量量级和数值范围等,40min)
- 你身边肯定有一些你觉得很厉害的同学吧,你觉得你和他们的差距在哪
- 你为什么想要做工程方向,而不是继续搞科研
- 有什么要问我的
10. 阿里云 JAVA开发 主管面 (过)30min
这一面就只是介绍项目,像是实习转正答辩一样有结构地去讲做过的项目内容,为什么这么做,具体怎么做。然后提了一些业务上的小问题。
然后又问到了为什么要做开发而不是算法
11. 阿里云 JAVA开发 交叉面 (过)40min
- 为什么你在厦门大学要去北京实习??
- 实习项目是做大数据平台,具体工作内容是偏Java工程还是偏数据工程
- 大数据相关的工具你是实习的时候才接触还是之前就有学过
- 为什么研究生的方向偏算法,但是想转工程(每一面都问这个问题,hr面也问了)
- 你感兴趣的技术方向是什么
- 你清楚Flink的基础原理吗 (提到了Flink,storm,spark的区别)
- 讲讲原生流处理是什么意思
- 讲讲checkpoint吧
- 对应的savepoint你知道吗
- 给一个多项式,他的总和为s=1×2+2×3+…+n×(n+1),用多线程的方式实现求s
- 你有什么问题要问我吗
12. 字节-飞书 大数据工程 一面 (挂)55min
基本问题都答出来了,但是太久没刷题,一个反转链表都没写出来,就挂了
- 介绍论文,项目
- static关键字
- static除了修饰方法和属性,还能修饰什么
- 你知道内存泄露的根本原因是什么吗
- 谈谈你对栈的理解
- 多线程了解吗,Java实现多线程的方式你了解吗
- 线程池的核心参数有哪些
- 阻塞队列你知道有哪些
- 锁的状态和种类你了解吗
- sychronized关键字属于哪种锁
- 你知道乐观锁是怎么实现的吗
- 描述一下CAS算法吧
- 你看过jdk1.8中CAS的源码吗,concurrent包里有个原子类
- kafka 的高吞吐量是怎么实现的
- 零拷是怎么实现的
- kafka的顺序写是怎么实现的
- kafka怎么保障实现exactly once 的(消息的生产和消费两个方面去思考)
- kafka消息发送方式,同步异步你了解吗
- flink里面的watermarker你了解吗
- spark的checkpoint机制你了解吗
- 代码题:反转链表
附录1 笔试题1 代码
import java.util.HashMap;
public class StringMatch {
public static void main(String[] args) {
String str = "研发,产品,产品,研发";
String target = "yxxy";
System.out.println(isMatch(str,target));
}
public static boolean isMatch(String str, String target){
String[] strings = str.trim().split(",");
int nums = target.length();
if(strings.length != nums) return false;
StringBuilder tarBui = new StringBuilder(target);
HashMap<Character,String> matches = new HashMap<>();
for(int i = 0; i<nums; i++){
Character a = tarBui.charAt(i);
if(matches.containsKey(a)){
if(!matches.get(a).equals(strings[i]))
return false;
}else{
matches.put(a,strings[i]);
}
}
return true;
}
附录2 笔试题2 代码
import java.util.Random;
public class multiThreads {
static BathRoom b1 = new BathRoom();
static BathRoom b2 = new BathRoom();
static BathRoom b3 = new BathRoom();
public static void main(String[] args) {
for(int i = 1; i<=10; i++){
if((i&1)==0) {
new ShowerThread(true, "t"+i).start();
}
if((i&1)==1) {
new ShowerThread(false, "t"+i).start();
}
}
}
}
class ShowerThread extends Thread{
public String name;
public int time;
public boolean male;
@Override
public void run() {
Random random = new Random();
this.time = random.nextInt(10)+1;
while(true){
try {
if(getroom()) break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public boolean getroom() throws InterruptedException {
if(multiThreads.b1.status == false){
if((multiThreads.b2.status == false || multiThreads.b2.maleUsing == this.male)
&& (multiThreads.b3.status==false||multiThreads.b3.maleUsing == this.male) ){
multiThreads.b1.using(this);
return true;
}
}
if(multiThreads.b2.status == false){
if((multiThreads.b1.status == false || multiThreads.b1.maleUsing == this.male)
&& (multiThreads.b3.status==false||multiThreads.b3.maleUsing == this.male) ){
multiThreads.b2.using(this);
return true;
}
}
if(multiThreads.b3.status == false){
if((multiThreads.b1.status == false || multiThreads.b1.maleUsing == this.male)
&& (multiThreads.b2.status==false||multiThreads.b2.maleUsing == this.male) ){
multiThreads.b3.using(this);
return true;
}
}
return false;
}
public ShowerThread(boolean male, String tname) {
this.name = tname;
this.male = male;
}
}
class BathRoom {
public volatile boolean status;
public boolean maleUsing;
public synchronized void using(ShowerThread t) throws InterruptedException {
this.status = true;
this.maleUsing = t.male;
if(this.maleUsing==true){
System.out.println(t.name + " male using..." + t.time);
}else{
System.out.println(t.name + " female using..." + t.time);
}
t.sleep(t.time *1000);
this.status = false;
}
public BathRoom() {
this.status = false;
}
}