转自牛客网,作者:尘归土,原文地址:https://www.nowcoder.com/discuss/101712?type=2&order=0&pos=4&page=4
在此记录,以供后续复习。
计算机网络
- 计算机网络分为哪几层?
计算机网络如果是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。。。然后你和面试官比较一下两种动态代理的区别,我觉得也是会有加分的。