首页 > 笔经面经 > 感谢牛客网!发一波面经!阿里、网易游戏、京东等offer。

感谢牛客网!发一波面经!阿里、网易游戏、京东等offer。

头像
尘归土
编辑于 2018-09-03 14:00:14
回复82 | 赞 127 | 浏览18351

背景介绍

我是中南大学的本科生,春招的时候拿到阿里、京东、华为的Java岗位实习offer,选择去了阿里。暑假结束之后拿到了阿里转正通过的口头offer,然后投了一个网易游戏,拿到了大数据岗的口头offer。
我春招的时候面试的公司还是很多的,也积攒了很多的面试经验,最后三个阿里、京东、华为三个offer基本上是同时到的,所以后面的面试就没继续参加了。秋招就只参加了阿里的转正答辩,并且投了网易游戏,基本上也过了。
我是从去年12月份开始准备秋招的,当时也是在牛客网上面看了很多面经,现在感觉是时候也分享一下我的面经了。

我觉得如果我下面说的问题你都会了,bat我不敢保证,但是我觉得进互联网top20应该没啥问题的。

面经

我就不说每一个公司问了什么问题,我以模块的方式来分享每个模块可能会问什么题,我下面说的每一个面试题,希望你能够基本上知道大概是什么东西,这样子面试官问起来你才不会一脸懵逼,如果你能够进行深入的学习,那肯定是更好的,会有面试加分。我被问过的一些太偏的题我就不说的,基本上下面介绍的都是面试java的常规题。

计算机网络

  • 计算机网络分为哪几层?
    计算机网络如果是ISO模型的话,分为七层。TCP/IP协议簇模型的话,分为四层。这一个你需要能够说出来每一层叫做什么,大概做了什么事情,网上查一查就知道了,我就不具体说了。
  • TCP和UDP有什么区别?什么场景使用TCP,什么场景什么UDP?哪些应用层协议使用了TCP,哪些使用了UDP?
    传输层绝壁是你在面试的时候最常被问到的,这一块你需要好好看。TCP和UDP最主要的区别是TCP是可靠传输的,UDP是不可靠传输的。所以如果我们的发送消息之类的场景,因为你要确保用户的消息不会丢失,需要使用TCP协议。如果你是在进行视频聊天或者看直播,那你可以使用UDP协议,因为即使几个画面丢失了,对用户来说影响也不是很大。哪些应用层协议使用TCP,哪些使用UDP的话,你自己去查一下,懒得打字了。
  • 什么是窗口滑动协议,什么是快速重传,什么是拥塞避免,什么是慢启动?
    这个考的基本上就是TCP协议的具体实现,如果对于这一块没有接触过的话,最少要知道窗口滑动协议是什么。后面的那几个问题你可以作为拓展,好好看一下书也基本上就知道是什么了。
  • TCP连接需要几次握手?几次分手?
    TCP连接需要三次握手,四次分手。这两个数字是一定一定要记住的。背后为什么要三次握手,为什么要四次分手,你可以去了解一下,如果能够和面试官说出来会有加分,面试官不一定会问。
  • 当你输入域名访问一个网站的时候,背后的过程是什么?
    这个问题是比较开放的,你可以回答的内容有很多,但是你如果回答得越详细肯定是越好的。第一步就是域名解析,域名解析的话你可以说一下域名缓存在哪些地方,然后如果你域名在本地没有缓存的话,是如何通过DNS来进行域名解析的,如果你的DNS服务器上没有保存那个域名,那你的DNS服务器将如何处理来得到这个域名的ip。第二步就是说一下TCP连接的三次握手的过程。其他拓展内容有很多可以说,看你知识储备。例如你可以说通过CDN来进行访问加速。也可以说目前网站基本上都是前后端分离的,访问的时候会先访问反向代理服务器进行负载均衡之类的
  • 什么是https协议?https协议用到了哪种密钥?
    https是在http上面套了一层ssl,用来实现安全连接。用到的密钥有对称密钥和非对称密钥。目前基本上大一点的网站,都会使用https,这里面涉及的知识点也不是很多,但是过程相对来说会复杂一点,感兴趣的话可以去看一下。基本上就是有数字证书,然后把对称密钥作为消息内容,通过非对称密钥来进行传输。之后双方的通信就通过对称密钥来进行解密就行了。
  • 什么是socket?
    socket是用来进行网络通信的,java里面已经有封装好这个类了,分为客户端和服务器,通过ip+端口来进行访问。如果没有用过socket的话,建议你到网上找一个demo,跟着写一下,你基本上就知道socket怎么用了,算是比较简单的。
  • 什么是IO,什么是NIO,什么是AIO,什么是netty框架?
    如果我上面那个问题,你自己有到网上找一个例子去写一下,你就会发现在socket在读取消息的时候阻塞的。这里有一个概念,阻塞。如果你不知道什么是阻塞函数的话,需要去了解一下。
    NIO就是非阻塞IO,用来解决上面读取消息的时候会阻塞的问题。在jdk1.4左右引入的,是通过selector、buffer、通道等组件来实现的,具体实现原理我觉得还是需要有所了解的。
    AIO就是异步非阻塞IO。咱们上面说的NIO是同步阻塞IO。AIO是异步的,NIO是同步的。同步和异步是什么区别我有点讲不清楚,如果这个你不懂自己去查一下资料。异步基本上就是通过回调来实现的。AIO是在jdk1.7左右引入的,面试官问AIO一般也会问得比较少。
    netty是用来实现非阻塞IO的一个框架,这个作为拓展点,感兴趣可以去了解一下。我在面试阿里的时候被问到过,其他公司还没问过。

数据库

  • 数据库常用的操作
    这不算是一个问题,只算是给大家的一个提醒。如果你是现场面试的话,有时候是会被要求手写SQL的,所以你对于groupBy,orderBy,子查询之类的基础肯定是要会的。。。不然写一个简单的sql你都不会,估计直接就凉了。推荐你们看一下《MySQL必知必会》,我觉得这本书算是比较基础,比较容易上手。
  • 什么是左连接,什么是右连接,什么是全连接,什么是内连接?
    这个知识点太基础了,我就不说了,不会的自己去查。。。
  • 数据库的事务有哪些特性?
    主要有四个特性,ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。如果你觉得这四个特性你无法理解的话,你直接背下来这四个词就行了,然后对隔离性做深入一点的理解,其他的基本上不会被问。
  • 数据库中的隔离等级有哪些?
    基本问完你数据库事务有什么特性之后,接下来就是问隔离等级。隔离等级就是咱们上面说的隔离性的拓展。
    在学习隔离等级之前,你需要先去了解什么是脏读、不可重复读、幻读。之后你就知道mysql的四个隔离等级分别起到什么作用,oracle的两个隔离等级起到什么做什么。作为拓展,你可以记住mysql的默认隔离等级是什么,oracle的默认隔离等级是什么。我当时面试阿里的时候就连默认等级都给面试官背出来了。。。我估计面试官自己都没记住默认等级。
  • 数据库的索引有什么作用?用什么来实现的?
    这个问题我觉得三次面试会被问到一次,基本上也是被问烂了。索引是用来加快查找速度的。目前在数据库中一般是使用B+树来实现索引的。
  • B树和B+树有什么区别?为什么索引不用B树
    这个问题我是在阿里三面的时候被问的,而且感觉其他人也被问过这个问题。这个问题你需要去了解B+和B树具体结构上有什么区别,但是相对还是难一点的,如果觉得自己不想了解那么深入可以不去看。总体上来说,B+树在非叶子结点不保存数据,只在叶子结点保存。而B树在叶子结点和非叶子结点都会保存。这种结构导致你如果用B树来进行查询,会增加磁盘IO的次数,导致性能不如B+树。
  • 什么是乐观锁,什么是悲观锁?
    这个问题很常问,自己去查一下
  • SQL编译的过程大概是什么样的?(这一点可不看,算是偏门)
    这个其实是一个很有意思的问题。当时有一个面试官问我说,你直接写一堆的sql来进行数据的处理,和用一个存储过程来进行数据的处理,哪个性能更好一些。我当时没回答上来,后来面试官逐步引导我,我才回答上来的。存储过程是会在数据库中先进行编译的,所以你使用存储过程直接调用就可以了。而你如果直接写一堆的SQL语句的话,比存储过程多了一个编译的过程,所以存储过程性能好一点。然后由这个问题延伸出来一个有意思的问题。如果你了解过一些网络安全方面的知识,那你应该就听过SQL注入攻击。防止SQL注入,在jdbc中一种有效的方法就是使用prepareStatement,prepareStatement其实就是使用了预编译的方式来防止SQL注入的。

操作系统

操作系统我觉得常问的也就那几个问题,一般面试官自己对于操作系统底层也不是特别懂,我这里只说几个常被问的。

  • 进程和线程的区别是什么?
    这个问题基本上已经被问烂了,你肯定得会的。进程是CPU分配资源的最小单元,线程是CPU调度的基本单元、一个进程可以包含多个线程、巴拉巴拉。如果你觉得这个概念在你心里不是特别清楚的话,一定要到网上看一下,最好能够理解为什么有些时候要使用线程不使用进程。因为进程启动的时候cpu需要给他分配资源,对系统压力比进程大,你可以把线程看成是轻量级的进程。
  • 进程间通信的方式有什么?线程间通信的方式有什么?
    这也是一个被问烂的问题。进程间通讯可以通过socket,管道,信号,消息,共享内存等多种方式。线程间通信就比较简单了,直接共享变量也行,通过管道也行。
  • 什么是缓存?有哪些缓存的更新算法?
    这个太基础了。。。肯定得会的,缓存的更新算法用的最多的应该就是LRU。
  • 你用过什么linux命令?
    其实我用shell算是比较少的,但是一些基本上命令例如cd、ps、vim之类的。。。还是得懂的。如果你和我一样知道的不是很多应该也没关系,你记住几个最常用的,和面试官扯一扯就行了。。。你就说我用过巴拉巴拉,但是对于其他命令,其实我用得还是比较少的,因为比较少在linux上开发。我觉得你这样面试一般也会放过你的。

数据结构与算法

这一个我觉得没有什么通用的题目,但是我还是说一下需要准备的知识以及如何准备。

  • 数据结构的话,链表,树,图的基本知识得懂
  • 了解树的先序遍历,中序遍历,后序遍历。图的广度优先搜索算法,深度优先搜索算法。
  • 如果你是准备笔试算法题的话,我建议你先刷剑指offer,然后再去刷leetCode。刷的时候一定要直接在编辑器上写代码,不要用任何ide,因为有些笔试环境就是不允许你使用ide的。而且你如果是线下笔试,还需要直接在纸上写。所以,一定不要用任何IDE写算法题。
  • 算法题中的重点应该是动态规划,主要是因为动态规划如果你能够找得到状态转移方程的话,那么代码行数会比较少的,所以动态规划适合被当作笔试题,这个要重点准备。

java知识

Java知识要准备的太多了。。。我都有点儿不知道怎么说,我说一下常被问的吧。

  • java虚拟机的内存如何划分的?
    主要划分为五个区域,方法区,本地方法栈,虚拟机栈,程序计数器,堆。大概就是这五个区域,一定要背下来。咱们的垃圾回收主要就是针对堆区来进行的,堆区又会被划分为新生代老年代。。。这个具体内容去看《深入理解Java虚拟机》这本书,我觉得这本书是必看的。
  • java的垃圾回收算法有哪些?垃圾回收器有哪些?不同的垃圾回收器有什么区别?
    垃圾回收算法有 标记复制法,标记清除法 等。垃圾回收器最常被问的就是CMS和G1。scavage之类的回收器基本上不问。CMS在不同阶段使用串行或并发来做垃圾回收的,而且他和G1垃圾回收器有什么区别,这一块强烈建议去看《深入理解java虚拟机》这本书。我觉得你如果看完这本书,基本上所有虚拟机的问题都会了。
  • voliatile和synchonized有什么区别?synchonized和jdk提供的Lock包又有什么区别?
    voliatile只能够保证可见性和有序性,不能保证原子性,synchonized是通过上锁来防治出现并发问题。具体实现原理看我刚才建议的那本书,我就不说了。jdk提供的Lock包相比于synchozied提供了更加多样化的锁机制,为什么多样化,自己去查一下资料就知道了。
  • HashMap的原理是什么
    hashmap也是一个被问烂的问题,但是我这里进行一些拓展。基本上面试官最常问的就是hashmap是如何实现的,这个网上一查就知道了。但是一些深入一点的东西,如果你能够讲的话,是会有加分的。例如hashmap如何实现动态扩容,hashmap并不是线程安全的,在哪些情况下会出现线程安全的问题?那么哪一个提供了线程安全的map?他的锁机制是如何实现的?(它的锁机制并不是简单地直接把函数给锁住,而是通过分段来治理的,还是很有意思的)
  • 常用的设计模式有哪些?
    这个地方你最少有说得出来单例模式、工厂模式、代理模式等,这些都是很常见的设计模式,而且这个问题也经常被问。
  • Spring的AOP、IOC作用是什么?如何实现的。
    Spring是一个java web的框架,面试官特别喜欢问。但是问spring基本上也只围绕着这几个点,第一个是AOP、IOC的作用是什么,这个问题查一下就知道了。第二个是AOP、IOC是通过什么实现的?AOP是通过代理模式来实现的,IOC是通过单例模式+工厂模式来实现的。问得比较多的是AOP的实现方式,你如果回答代理模式一般就够了。作为拓展,你可以回答里面用到了动态代理,动态代理有两种方式,一种是jdk提供的,一种是cglib。。。然后你和面试官比较一下两种动态代理的区别,我觉得也是会有加分的。

写完啦

总体上就是这一些,码字了好几个小时,现在都凌晨三点多了,又困又累,所以有些地方我就懒得解释了,如果有不懂的自己去查答案。
这些东西基本上都是我春招时候的积累。。。我秋招主要在看大数据方面的,但是大数据投的人不多,我就不说面经了。
因为是春招的积累,时间有些久了,有些点记不清可能说错了,请大家见谅。

最后的提示

最后给大家提示几个面试技巧:
1.如果从你口中说出某个词,面试官很有可能就会朝着你说的方向去问,所以你回答问题的时候,可以假装不经意间提起另外某个东西,这样子面试官很有可能会接着问你刚才说出来的东西。
2.如果面试官问你的问题你不太懂怎么办?如果你是连问题都听不懂,你先确认一下是面试官的问法有问题还是你自己真的完全不懂,如果完全不懂,就说自己没接触过这方面就行了,不要不懂装懂,会扣分极其严重。如果那个问题你只懂一点点,你就把你懂的那一点点说出来,然后把面试官引到到其他类似的问题去。例如问你spring的aop如何实现的你不会,你就说我用过spirng,只知道aop是用来xxxx的,具体实现我不懂。但是我知道spring里面有一个很有意思的东西,就是他的启动过程的如何通过beanfactory来注入之类的。。。。这样子引导面试官。
3.不要试图用项目的业务复杂度来迷惑面试官。面试官看你的项目在意的是你的技术,而不是你的业务,你如果用业务来故意混淆让他听不懂,他会对你印象很差的。

我就说到这里了。。。困死了,睡觉去了,祝大家秋招找到好工作,感谢一波牛客网。

82条回帖

回帖
加载中...

本文相关内容

近期热帖

热门推荐

扫一扫,把题目装进口袋

牛客网,程序员必备求职神器

扫描二维码,进入QQ群

扫描二维码,关注牛客网公众号

  • 公司地址:北京市朝阳区大屯路东金泉时代3-808北京牛客科技有限公司
  • 联系方式:010-60728802(电话) admin@nowcoder.com
  • 牛客科技©2018 All rights reserved
  • 京ICP备14055008号-4
  • 京公网安备 11010502036488号