春招拿了oppo 、vivo、拼多多、成都头条的offer,现在已经是心满意足了,打算上岸了

打个广告:面试一点通丨收录全网面试题。上线了www.msedt.com

从去年七月到现在,我从一个很菜的菜鸡变成了一个有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
......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值