这里大部分是整理自该篇帖子(侵删)
计算机网络
- 计算机网络分层
计算机网络如果是ISO模型的话,分为七层。TCP/IP协议簇模型的话,分为四层。 - TCP和UDP有什么区别?什么场景使用TCP,什么场景什么UDP?哪些应用层协议使用了TCP,哪些使用了UDP?
这一块需要好好看。TCP和UDP最主要的区别是TCP是可靠传输的,UDP是不可靠传输的。所以如果我们的发送消息之类的场景,因为你要确保用户的消息不会丢失,需要使用TCP协议。如果你是在进行视频聊天或者看直播,那你可以使用UDP协议,因为即使几个画面丢失了,对用户来说影响也不是很大。 - 什么是窗口滑动协议,什么是快速重传,什么是拥塞避免,什么是慢启动?
这个考的基本上就是TCP协议的具体实现,如果对于这一块没有接触过的话,最少要知道窗口滑动协议是什么。后面的那几个问题你可以作为拓展,好好看一下书也基本上就知道是什么了。 - TCP连接需要几次握手?几次分手?
TCP连接需要三次握手,四次分手。这两个数字是一定一定要记住的。为什么要三次握手,为什么要四次分手,都要一起记住。只知道三次和四次,不知道为什么那就等于不知道。。。 - 当你输入域名访问一个网站的时候,背后的过程是什么?
这个问题博主自己也8知道。。。看看资料,自己查查。 - http和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一般也会问得比较少。
数据库原理
(不要以为这个不重要,恰恰相反这个是最重要的,面试了这么多每次都会问,而且不管大小公司都会问的挺深入)
- 数据库常用的操作,什么是左连接,什么是右连接,什么是全连接,什么是内连接?
这不算是一个问题,只算是给大家的一个提醒。如果你是现场面试的话,有可能是会被要求手写SQL的,所以你对于groupBy,orderBy,子查询之类的基础肯定是要会的。这里附上博主自己总结的一篇SQL语句大全。 - 存储过程/视图/事务/索引
如果问数据库这个四个是少不了的,必看。 - 数据库的事务有哪些特性?
主要有四个特性,ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。如果你觉得这四个特性你无法理解的话,你直接背下来这四个词就行了,然后对隔离性做深入一点的理解,其他的基本上不会被问。 - 数据库中的隔离等级有哪些?
基本问完你数据库事务有什么特性之后,接下来就是问隔离等级。隔离等级就是咱们上面说的隔离性的拓展。
在学习隔离等级之前,你需要先去了解什么是脏读、不可重复读、幻读。之后你就知道mysql的四个隔离等级分别起到什么作用,oracle的两个隔离等级起到什么做什么。作为拓展,你可以记住mysql的默认隔离等级是什么,oracle的默认隔离等级是什么。我当时面试阿里的时候就连默认等级都给面试官背出来了。。。我估计面试官自己都没记住默认等级。 - 数据库的索引有什么作用?用什么来实现的?
这个问题我觉得三次面试会被问到一次,基本上也是被问烂了。索引是用来加快查找速度的。目前在数据库中一般是使用B+树来实现索引的。 - B树和B+树有什么区别?为什么索引不用B树
这个问题我是在阿里三面的时候被问的,而且感觉其他人也被问过这个问题。这个问题你需要去了解B+和B树具体结构上有什么区别,但是相对还是难一点的,如果觉得自己不想了解那么深入可以不去看。总体上来说,B+树在非叶子结点不保存数据,只在叶子结点保存。而B树在叶子结点和非叶子结点都会保存。这种结构导致你如果用B树来进行查询,会增加磁盘IO的次数,导致性能不如B+树。 - 什么是乐观锁,什么是悲观锁?
这个问题很常问,自己去查一下 - 当你执行一条SQL语句,背后执行的过程是什么样的?
这个博主在网易面试的时候遇到了,可以自己搜索看一下。
操作系统
- 进程和线程的区别是什么?(还有线程池)
这个问题基本上已经被问烂了,不管公司大小,几乎必问! - 进程间通信的方式有什么?线程间通信的方式有什么?
这也是一个被问烂的问题。进程间通讯可以通过socket,管道,信号,消息,共享内存等多种方式。线程间通信就比较简单了,直接共享变量也行,通过管道也行。 - 页面置换算法,虚拟内存
必会,记一下,并不复杂 - cpu调度算法
这个可以稍微记一下,并不复杂 - 你用过什么linux命令?
有些会让你列举一些,也有面试官会问想要干什么要用什么命令。 - 死锁的条件和避免
这个感觉挺重要的,但是面试到现在没有遇到。。。
数据结构
- 首先数组、链表、栈、队列、树、图这些的基础知识必须要会
- 树的前中后序,图的深度广度遍历
- 还有就是一些常见的算法题的思路,0-1背包,floodfill算法,常见的动态规划,栈队列的基本操作,字符串的各种换来换去的题,数据量很大的题(topk,中位数)
java
- jvm
这个非常重要,因为从这里你可以侃侃而谈说很多东西,也可以接着说垃圾回收等等,这个必会必深入必深入。 - java的垃圾回收算法有哪些?垃圾回收器有哪些?不同的垃圾回收器有什么区别?
垃圾回收不仅仅是年轻代年老代,还要会各种垃圾回收算法,能说说有哪些种垃圾收集器 - voliatile和synchonized有什么区别?synchonized和jdk提供的Lock包又有什么区别?
voliatile只能够保证可见性和有序性,不能保证原子性,synchonized是通过上锁来防治出现并发问题。具体实现原理看我刚才建议的那本书,我就不说了。jdk提供的Lock包相比于synchozied提供了更加多样化的锁机制,为什么多样化,自己去查一下资料就知道了。这里如果扩展的话,可以说说锁的各种分类,然后这里很容易被从线程安全追问到线程池,线程池要了解。 - String,StringBuilder,StringBuffer之间的区别
这个很常问,要知道。 - HashMap的原理是什么,hashtable,concurrentHashmap,这三个注意!
hashmap也是一个被问烂的问题,但是我这里进行一些拓展。基本上面试官最常问的就是hashmap是如何实现的,这个网上一查就知道了。但是一些深入一点的东西,如果你能够讲的话,是会有加分的。例如hashmap如何实现动态扩容,hashmap并不是线程安全的,在哪些情况下会出现线程安全的问题?那么哪一个提供了线程安全的map?他的锁机制是如何实现的?(它的锁机制并不是简单地直接把函数给锁住,而是通过分段来治理的,还是很有意思的) - 常用的设计模式有哪些?面试暂未遇到,但是这个东西也是必会的,有些面试可能会让手写单例模式。
这个地方你最少有说得出来单例模式、工厂模式、代理模式等,这些都是很常见的设计模式,而且这个问题也经常被问。 - Spring的AOP、IOC作用是什么?如何实现的。
这里是博主感觉有些面试挂掉的主要地方,因为博主只是写过几个demo,没有深入看过这些,直接说了不怎么会。起码也要了解了解基础概念把,不至于把盲区设那么大,如果时间不够可以忽略这里。
祝大家好运!!!!!!!!!!!!