面试刷题11-30

从去年七月到现在,我从一个很菜的菜鸡变成了一个有offer的菜鸡。
今年春招拿了oppo 、vivo、拼多多、成都头条的offer,现在已经是心满意足了,打算上岸了。
首先废话不多说,最近刷牛客很多人因为简历筛选就挂了,这里附上我自己的简历。(至少头条、拼多多的简历筛选都过了)


    一般来说,很多公司对了解分布式的人是很感兴趣的,只要你的简历上写了了解分布式,一般都会问到。其实我会的分布式知识也就几个:分布式锁、分布式事务、Dubbo、Zookeeper。这些里面只要了解一些基本都算是加分项。在刚学的时候,觉得分布式只是很难,其实静下心来学,也没有那么难。差不多一个月左右可以基本掌握。
    分布式锁:使用数据库怎么实现?使用Redis怎么实现?使用Zookeeper怎么实现。各种实现有什么问题?比如锁泄露、可重入这些问题。这里就不一一讲解了,因为网上一搜分布式锁,讲的都很详细。
    分布式事物:二段提交、TCC、本地消息表。这三种会出现各种的优缺点?这里看下博客也就基本都没问题
    Dubbo:学习Dubbo主要看官方文档,官方文档写的非常好,里面从Dubbo的基础再到实现细节。个人感觉最好的模块是Dubbo中文网站的源码导读模块。

    这里静下心来看,很容易看懂,把大致思路看懂了,面试基本没什么问题。
    Zookeeper:Zookeeper其实了解起来很简单。买本书来看一下,几天就会。
    上面这些东西都学得差不多了,分布式知识的基础也就起来了。后面的消息队列什么的我也还没学,就不多说。学会这些的好处上面已经说了,面试官对分布式知识很感兴趣,基本你写就会被问到。
    然后是项目,针对项目而言,一般来说简历上写两个项目左右就够了,大多数面试官一般会让你挑一个最好的项目来说。所以多写无意义(当然是针对我这种做的项目不太好的人而言)。所以尽可能的优化你的某一个项目,多使用一些能吹的技术。就比如我的项目写了数据库主从同步,首先为什么要用主从?为什么要读写分离?什么时候读写分离好?Mysql主从原理?线程模型?......这些基本都要掌握。或者说线程池,线程池原理、操作流程、拒绝策略、为什么使用线程池(好处)、线程池种类(Fixed、Single、Cached....),这些不同种类的线程池具体怎么实现的?使用与什么场景?
    基本上来说,面试官让你介绍项目的时候,主动权就在你这边,你需要将你项目使用的技术、优化点都说出来,然后引导面试官向某一个方向问问题。比如你提到了用了线程池,很多面试官也就会问你线程池的问题。
    然后分享一下自己自我介绍的套路:一般来说,自我介绍先介绍名称、学校、专业,然后是自己做的方向(比如Java后端)。这些完了以后介绍自己学习的东西,比如java,从基本的语法到Jvm,java高并发(给面试官抛出一些可以问的东西),然后是框架、提一下项目.....
上面这些都挺套路的,套路完了,还是要看基本功。对于Java开发来说,JVM是一个必备知识点。JVM内存模型,哪些是线程私有的?虚拟机栈栈帧对应什么?虚拟机栈中局部变量表、操作数栈、动态链接等都有什么作用?这里提一下,动态链接是相对于静态解析而言的,静态解析也就是在类加载阶段有一个解析阶段,是将符号引用转化为直接引用,但是在这个阶段不一定能完全解析方法地址,也就是在不能判断方法执行版本时,比如重载的方法时,就需要靠动态链接来找到对应方法。或者说堆的结构,如何划分?Eden、To Survivor、From Survivor作用各是什么?GC时这些部分有什么功能?比如一个面试官让你介绍GC,首先应该介绍什么样的对象会被GC,这里就要介绍引用计数法和可达性分析法。然后是GC算法,各个算法优缺点,然后是垃圾收集器,一般来说主要了解CMS和G1,当然其它能了解最好也要了解。然后就是JVM调优,jvm参数、调优命令:jstat、jmap、jstack、jps等等。最好自己用一下。后面的至于类加载机制、双亲委派模型都可以通过《深入理解Java虚拟机》这本书了解。
    然后是Java高并发,一般来说,很多时候面试官会让写单例模式,我自己写的一般都是volatile 双重检查加锁的形式。主要原因在于这里可以引入介绍volatile和synchronized。volatile保证有序性和可见性。有序性很简单,就是内存屏障,禁止指令重排序。可见性一般来说我会结合缓存一致性协议来说,MESI,具体深入对具体的处理器中的缓存条目进行操作,然后处理器和总线通信等等。这里可以参考《java多线程编程实战指南》,讲的很详细。然后是synchronized关键字的锁的实现,和Lock的区别,做出的优化:适应性自旋锁、偏向锁、轻量级锁,锁什么条件下回升级?这些说完,Lock的实现?AQS?可重入实现?读写锁实现?这些可以参考《java并发编程的艺术》这本书,讲的非常详细、基本从源码的角度来说。总之java并发可以问的问题很多,我个人主要就看了以上我提到的两本书,不会的地方上网查查就行。
    再然后是java集合。一般来说集合主要了解ArrayList、LinkedList,它们之间的区别。HashMap、Maps.synchronizedMap、ConcurrentHashMap。针对于HashMap,需要了解1.8优化使用了红黑树和尾插法。然后是需要详细介绍put get resize三个操作,难点在resize,比如当前节点在新的数组会映射到哪一个位置?怎么判断?然后是ConcurrentHashMap使用的分段锁,继承可重入锁实现,1.8使用synchronized关键字 CAS操作实现。上面这些最好都读源码。Set的话一般都是参考Map来实现的,也就是只使用Map的key来存取值。
    操作系统,进程线程、进程状态——用户态转内核态,为什么要转?虚拟内存?死锁?进程通信?
    计网,TCP和UDP,主要了解三次握手四次挥手,为什么三次,为什么四次?为什么挥手后要等待2MSL才中断?TCP快速重传、滑动窗口、流量控制、拥塞控制、慢启动机制等。一般来说面试官应该对拥塞控制和流量控制更感兴趣。HTTP请求格式,请求行、请求头,请求方法?RESTFUL?请求状态码?HTTPS,对称加密和非对称加密?以非对称加密的方式传递对称加密的秘钥。

    然后是Mysql,Mysql要求基本的增删改查语句都要会。然后一般来说Mysql的调优(怎样排查执行慢的sql):慢查询日志、explain分析查看是否走索引,没有索引创建索引,有的话判断索引为什么失效?索引什么时候会失效?最左匹配原则、or条件两边有一边没有使用索引、字段类型隐式转换、like以%开头、表中数据较少导致全表比索引快,这些条件都会导致索引失效。索引的底层实现?介绍B 树?这里主要先介绍BST二叉搜索树,然后从磁盘I/O的角度介绍B树。然后介绍B 树所做的优化,即非叶子节点值存储key,这样这些节点可以存储更多key,也就降低树高度,减少I/O次数;叶子节点以链表形式连接,方便范围搜索。然后是聚簇索引和非聚簇索引。一般来说聚簇索引B 树的叶子节点存储的数据,非聚簇索引叶子节点存储指针,所以非聚簇索引要多一次I/O操作才能读取到数据。最后就是Mysql的主从,主从原理和机制。Mysql我看的书是《深入浅出Mysql》,上面索引讲的不多,还需要自己看博客。
    Redis,redis只用一本书就够了,《Redis的设计与实现》。拓展问题有缓存穿透和缓存雪崩?怎么解决?缓存穿透可以使用布隆过滤器、缓存雪崩可以设置随机过期时间。
    算法方面,了解数据结构以后就刷leetcode或者《剑指offer》吧。
    我会的基本也就这些了。总的来说,我是从去年7月份开始从零开始学的,已经算是很晚了。现在牛客的你们所有人都应该比当时的我强吧。从开始学习,相继看了《Head First Java》、《Head First 设计模式》、《深入理解Jvm》、《Java EE互联网轻量级框架整合开发— —SSM框架》、《java多线程编程实战指南》、《java并发编程的艺术》、《数据结构与算法》、《Redis设计与实现》、《大型网站技术架构》、《剑指offer》、《ZooKeeper:分布式过程协同技术详解》、《深入浅出Mysql》等等。我认为学习技术不能单了解别人所说的就可以了,最主要是要问为什么。还有就是要沉下心来学习,不断的向前行。

这里附上拼多多和头条面经,其它面经我以前发过
拼多多:
一面:
上来就问,我看你笔试题做的,第一题你的思路是什么,为什么要这么做?自己推到过公式吗?
我:这个当时随便写了两个用例,自己算了一下,感觉就是这样做。具体没推导过。
那有一题我看你没做出来,下来以后看过吗?
我:因为当时没在学校,所以做了以后没时间看。(说道这里感觉有点凉)
有一个10G的文件,里面是数字,怎么排序?
我:外部排序,分为多个文件,对这些文件读入内存进行排序,可以使用归并。得到多个排序好的文件以后将这些文件合并。具体比如分为10个文件,那么就维护10个指针,每次取最小值写入新文件中,最终可以得到。

HashMap介绍下
我:blabla。
准备的还挺充分,如果让你自己设计一个Dubbo的消费者,你怎么设计?
我:这里应该是问dubbo的消费这怎么实现的。讲了下具体流程
Lock和synchronized
我:Lock底层使用了CAS实现,synchronized使用操作系统互斥锁实现
它们之间的使用场景限制

我:对于跨方法加锁和解锁,不能使用synchronized,比如在第一个方法加锁,第二个方法解锁。还有就是synchronized不可响应中断
介绍项目
我:blabla,提到了线程池
介绍线程池
我:线程池的流程、拒绝策略,几种线程池

.....后面就忘了
二面:(只面了25分钟)
自我介绍
项目
数据库调优
我:慢启动日志、explain分析、索引失效
数据库隔离级别
我:读未提交、读已提交、可重复读、序列化
可重复读主要解决了什么问题?
幻读?
我:....,其实Mysql中,在可重复读的隔离级别中,已经解决了一些幻读的问题。Mysql可重复读是基于Mysql的锁来实现的。Mysql中有行锁和间隙锁。在可重复读的隔离级别下,Mysql不仅会对相应的行进行加锁,还会对间隙加锁。这样也就消除了幻读的问题
Redis持久化
我:RDB和AOF,save和bgsave命令,save当前进程持久化,这段时间不能接受新请求。bgsave创建子进程,不影响当前进程。AOF追加。介绍了AOF重写。
.....
头条:
一面:
给你一个已经排序的数组,找到一个元素第一次出现的位置,{1,2,3,3,3,3,4},输出2
我:一直二分,考虑边界
HashMap
TCP介绍
我:可靠数据传输、三次握手、四次挥手、流量控制、拥塞控制.....
使用Zookeeper作为Dubbo注册中心时,Zookeeper结构是什么?(这个Dubbo官网有)
数据库索引及实现
我:介绍B 树
....
二面:
手写单例
你用了volatile,volatile介绍
我:有序性和可见性
Jvm内存模型
Dubbo介绍
我:从服务暴露到服务消费流程,中间提到了SPI机制以及自适应拓展机制
一致性Hash
我:值了解过Dubbo负载均衡里面的一致性hash,介绍了一遍(这里Dubbo源码导读里也有)
二段提交
我:资源管理器、事物管理器,了解Mysql事物二段提交操作,prepare,commit,rollback
二段提交有什么问题
我:最主要的是单点问题
怎么解决?
我:心跳机制?各个资源管理器建立连接?
不对
我:第三方监控?类似于Redis里的哨兵?
对了

三面:
2T文件,有uid,uname。3T文件,有uid,utext。要求将两个文件uid相同的整合。
我:使用hash,将这些文件进行散列,相同uid会散列到相同文件,然后使用hashmap进行整合
那如果我的hash散列不均匀?全部散列到一个文件?
我:可以排序(面试完发现忘了再散列这种方法)
面试官有点失望,问下一个问题。(手撕)给你一个User,包含id,name,parentId。然后给你一个List<User>,要求将它转换成一棵树的结构。只有一个跟节点,parentId=-1
我:(一开始完全不会)先写找到跟节点,然后找到这个根节点的子节点。找到子节点以后发现将这些子节点进行递归就建立起来了
一张表有ABC三个字段。现在要查BA,BC,B,问怎么建立索引?
我:最左匹配原则,BA,BC

......

 

 

 


潜了这么久水,回馈一下牛客

许愿爱奇艺!

 

大三双非一本

爱奇艺上海java实习生

面试官是个超级温柔和善的男生

大概总结一下这次面试问题

 

hashmap讲一下  resize做了啥

2 倍扩容,随机放元素位置

ArrayList和LinkedList讲一下

数组和链表

讲一下spring,springmvc,springboot(概述,常用注解)

 

spring IOC,AOP

AOP原理

静态***和动态***讲一下

java反射讲一下

java序列化(这个我真的不会。。。)

lock和synchronized区别

ACID讲一下

脏读,不可重复读,幻读

MVCC,CAS

ABA问题,解决

乐观锁,悲观锁,行锁读写锁,表锁

讲一下Redis

JVM分区

垃圾回收讲一下

对象是否存活

垃圾回收俩次标记(忘了。。。)

讲一下JMM

happens-before,举个例子

分布式消息队列之类的我都没有深入学习,面试官也没问啥
 

写在开头

3.12-4.12,历时一个月,终于收到阿里云Java研发实习的录用意向书,可以说这是本次春招真正意义上的第一个offer,大概也会是最后一个offer了吧,本人渣渣211本科菜鸡一枚,能够收到阿里的录用意向书纯属侥幸,为感谢广大牛油的贡献,特放出我在本次春招面试各公司的辛酸经历,供各位有需要的牛油参考。(因为时间比较久了,我很多都不记得了,放出来的只是我记得的部分,不是全部)

2.14(情人节,然而和我这个单身22年的Single Dog没什么关系)今日头条后台开发一面(深圳岗位,处女面,挂)

1、进程通信方式,共享内存原理
2、TCP拥塞控制原理
3、TCP可靠数据传输原理
4、TCP与UDP的区别,各自的应用情景
5、数据库聚簇索引与非聚簇索引原理
6、C Map实现原理,查找时间复杂度

7、Java HashMap实现原理,查找时间复杂度
8、HashMap多线程插入是否线程安全(各自Key不相同),为什么
9、快排时间复杂度是O(nlogn)的原因,最坏时间复杂度是什么,原因,如果优化
10、进程与线程的区别

11、进程内存区域划分(数据区、代码区......),哪些是线程共享,哪些是线程独占
12、物理地址与逻辑地址的概念,换算关系
13、select/epoll原理

代码题:
1、3×7表格,从左上到右下,每次只能向右或向下,总共路径有多少条(leetcode原题),我用了深度遍历递归实现,然后问时间复杂度是多少,怎么优化
2、实现一种排序算法
以上问题不是提问顺序。

 

百度Java研发一面(日常实习岗,挂)

1、简历项目相关问题(15min)
2、TCP拥塞控制原理(基础知识 5-10 min)

3、TCP可靠数据传输原理

4、volatile和synchronized的区别

...(不记得还有什么问题了)
开放性问题:(15min)
我所在的区大概有多少条公路?大概有多少个加油站?怎么分布?为什么?
代码题:(20min)
快排实现,写好发邮箱

 

借贷宝一面(口头offer,已拒)

1、都知道什么排序算法,讲一下堆排序,应用场景,讲一下快速排序
2、HashMap原理,红黑树讲一下(自己挖的坑)
3、concurrenthashmap原理
4、ThreadLocal应用场景,原理
5、String等号比较
6、innodb索引原理
7、红黑树与平衡树的区别,各自的应用场景
8、两个大文件里面有很多字符串,找出交集

 

腾讯暑期实习后台开发一面(挂)

1、Java是值传递还是引用传递,为什么
2、new一个对象的过程
3、JVM内存区域划分,各自的作用
4、堆空间的划分,为什么这样分
5、垃圾收集算法

6、concurrenthashmap原理
7、TCP三次握手,为什么需要三次握手
8、TCP拥塞控制原理
9、滑动窗口原理

10、TCP网络攻击
11、TIME_WAIT什么情况下会出现,为什么
12、http状态码
13、post和get的区别
14、网络攻击是否有了解?sql注入原理,如何防止(自己挖的坑)
15、SpringMVC和Servlet的区别
16、地址空间的作用
17、进程通信方式,各自应用场景
18、进程与线程的区别
19、MySQL索引原理,慢查询优化,如何合理建索引
20、两个栈实现一个队列(剑指offer原题)
21、两数之和(剑指offer原题)
22、青蛙跳台阶问题(剑指offer原题)

 

快手一面(挂)

1、java基础,很多,也很常规,所以不太记得了
2、JVM内存模型,垃圾回收算法
3、线程池参数及作用
4、有一个线程占用CPU很高,如何查出来,如何打印堆栈信息
5、如何打印一个线程的内存占用信息
6、JVM工具及用法
7、一百亿个数排序?(反正就是很多个数排序,多少不记得了)
8、k个有序链表排序成一个有链数列,代码实现,不用跑得通,讲思路
9、concurrenthashmap原理
10、ICMP处于哪一层
11、TCP三次握手
12、TCP四次挥手

13、页式和段式内存管理

14、volatile关键字讲一讲

15、TCP关闭的closing状态

 

蘑菇街一、二面(等消息)

(4.16更新,已挂)

蘑菇街面试基本不问基础知识,就是从你的简历中的项目提问,比如我简历上写了一个web项目,里面有权限管理,然后问怎么实现,然后项目遇到的挑战什么的。蘑菇街一面给我的体验是最好的,就问了几个基础知识,然后问项目,然后给你提出改进的思路,而且是慢慢的引导你往改进的思路去想,然后就是场景题,如果你给的方案不够好的话也会慢慢引导你去优化。

 

--------------------------------------------------------分割线-----------------------------------------------------

阿里云一面

1、简历项目相关(10-15 min)
2、传输层与网络层的区别
3、ping使用的协议,处于哪一层
4、TCP三次握手
5、TCP四次挥手
6、last_ack阶段
7、java函数值传递还是引用传递,为什么

值传递
8、JVM内存模型
9、full gc时机
...线程相关问题,都是结合场景来提问,我不知道怎么描述
10、java互斥锁(synchronized和lock的区别)
代码题:
不是算法题目,是一道多线程的题目,两个猴子,n个苹果,一个一次拿两个,一个一次拿三个,直到苹果不够两个人中的任何一个拿的时候就停止,后面要解释一下结果,然后改进,不要让其中一个猴子连续拿很多次

 

阿里云二面(不知道算不算二面,面试官说聊一下,我问是不是二面,面试官说算是吧)

1、简历项目,比赛相关
2、浏览器输入URL之后到内容返回的整个过程
3、Linux命令(find命令)
4、TCP三次握手
5、TCP传输过程中出现丢包怎么处理
......
感觉还是比赛和项目相关聊的时间比较长,基础没怎么问
 

阿里云三面

1、实现一个后端的异步服务框架(实现思路)
2、GC机制
3、内存泄漏举例
4、乐观锁与悲观锁
5、简历项目相关的问题
6、专业相关的问题(我是网络工程专业)

7、设计一个服务,提供一个接口,为请求这个接口的用户返回一个B类IP地址,响应越快越好(即支持多并发访问),设计方案
......

感觉这一面主要聊一些场景的方案设计的时间比较长
 

四面(交叉面)

1、简历项目相关
2、TCP拥塞控制原理
3、有了解过Linux kernel里面常用算法
4、专业相关的问题(我是网络工程专业)
5、迪杰斯特拉最短路径算法
6、矩阵连乘问题(动态规划中的矩阵连乘问题)

7、ThreadLocal使用场景,原理
8、ConcurrentHashMap原理

......
这一面面得极差,面得我都要哭了,因为等这一面我等了一周,而且是晚上十点多才等到的电话,那时候心情特别低落,所以很多问题答的一塌糊涂
 

hr面

常规问题,就面了十来分钟

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值