【面试实战篇】一种更加简易的回答模版和演示

上面我给大家举了几个例子,或许大家会觉得按照我那种方式回答起来会有点难,但是能够像我那样回答,一定是很加分的,一是需要你有足够的积累,二是需要你刻意去训练过。

如果你觉得你无法像我一样灵活去回答,也没有关系,你还能够采用「总分」的方式去回答,这种回答针对某一类题非常有用,比如如下几类题:

1、说一说 XX 与 YY 有什么区别?

2、为什么选择 XX?有哪些优点?

3、常见的 XX 有哪几种?

…..

在面试中,70% 的八股文都是这类问题,如果你不知道怎么回答,或者回答到哪个程度,那你可以按照如下方式回答:

1、先直接简单粗暴回答出具体的知识点;

2、之后对上面的每个知识点进行解释;

3、解释的过程中,顺便分析每一种方式的优缺点;

4、基于它们的优缺点,讲解它们的应用场景;

按照这个模式来回答,让人听起来你就不像是背诵的了,而且也不需要你把各个知识点进行关联,你只需要针对某个点,进行一下解释说明;因为任何东西,都有其优缺点,你就顺便说一下优缺点;最后我们都是会根据 方法 的优缺点来选择其应用场景,所以我们可以说一下应用场景。

这样一套下来,也是比较加分的了。

PS:当然,如果你不大懂应用场景,有些也可以不说,反正我们的目的就是,尽量把我们知道的,流畅说给面试官听。

下面我举例说明

案例1:你知道Redis有哪些常见数据结构以及应用场景吗?

1、直接给出结果

常见的数据结构有:字符串String、哈希表Hash、列表List、集合Set、有序集合Sorted Set。除了这些,还有 Bitmaps、HyperLogLog、GEO,甚至还可以自定义数据结构。

2、针对每一种通信方式进行介绍=>分析优缺点=>给出应用场景

(1)String 类型是 Redis 最基础的数据结构,其它几种数据结构都是在字符串类型的基础上创建的,并且所有数据结构的 key 也都是字符串类型.

String 这种类型非常简单,使用也很方便,应用场景很广泛,比如可以用来做作缓存,MySQL 作为存储层;也可以用来作为计数的工具,比如某个视频每被播放一次,播放量就 +1,因为 String 如果存放的是数值类型,天然支持自增操作。

(2)其次就是 Hash-哈希表,Hash 类型是一个键值对集合,一个 key 对应多个 field – value 键值对,且 key 不允许重复。

Hash 这种结构相对复杂,可以携带比较多的 key-value 信息,应用场景也比较多,比如可以用来缓存的用户信息。

(3)然后就是 List-列表。List 类型存储的是多个有序的字符串,其中的“有序”指的是插入时间上的先后顺序。它是一种比较灵活的数据结构,可以充当栈和队列的角色。

并且 List 也提供了很多丰富的命令,使得它有很多应用场景,比如 LPUSH + RPOP 命令组合可以实现一个简易版的”消息队列“。生产者使用 LPUSH 命令在列表左侧插入消息,消费者使用 RPOP 命令在列表的右侧获取消息。

(4)再者就是Set – 集合。Set 类型也是用来保存多个字符串元素,它的特点和 List 类型恰好相反:Set 类型不允许有重复元素,并且其中的元素都是无序的。其中 Set 类型的自动去重功能在实际应用中非常关键。

Redis 除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集等操作。

常见的使用场景有:可以用 Set 来实现关注功能,点赞功能等,还能利用 交集、并集、差集 等操作来查找共同粉丝等。

(5)最后就是 Zset – 有序集合。Redis 中的 Zset 类型中的成员是有序排列的。它和 Set 类型的相同之处在于:集合中的每个元素都是 字符串类型,并且不允许重复。

而它们最大的区别在于,Zset 类型是有序的,Set 类型是无序的。

原因在于 Zset 类型相比于 Set 类型多了一个排序属性 score(分值),它的排序功能正是通过 score 作为依据来实现的。

Zset 类型比较典型的使用场景就是排行榜,并且可以依据多个维度(点赞,播放量,时间)实现榜单。

回答分析:以上主要先给出总的数据结构类型,之后重点介绍每个类型的特点和一些应用场景,对于优缺点,说的比较少,不过这没有关系了,并不是所有知识点,都需要介绍优缺点,重点还是根据自己的知识储备来,我们的目的是:让面试官看到我们的优点,我们的能力。

案例2:进程常见的通信方式有哪几种?

这道题之前也讲过,我们再来用这种方式讲解一遍吧。

1、直接给出结果

大致有五种:两种管道,消息队列,共享内存,信号和 Socket。

2、针对每一种通信方式进行介绍=>分析优缺点=>给出应用场景(如果不方便距离应用场景,也可以不举例)

(1)首先第一个管道,管道在 Linux 中分为匿名管道和命名管道,Linux 命令中的 | ,> 等都是匿名管道,作用是将前一个命令的输出作为后一个命令的输入。命名管道可以用 mkfifo 命令创建,可以用在一个进程往里写,另一个进程从里读的场景。

管道的优点是使用简单,方便,缺点是只能用于有亲缘关系的进程间通信,且为单向通信。

(2)然后是消息队列,这个消息队列不是中间件那些 MQ,它是保存在操作系统内核的消息链表,A 进程要给 B 进程发消息,只需将数据写入这个消息链表,B 进程需要时去读取即可。

消息队列的优点是支持独立于进程的消息传递,也不需要等待;缺点是传递的数据要在用户和内核空间来回复制,效率低,同时数据大小受操作系统限制。

(3)共享内存的出现解决了消息队列中的数据要在用户和内核空间复制的问题,它是让所有进程的某块虚拟地址,都映射到一块相同的物理内存中。这样某个进程对这块地址的写入,其它进程都能立马看到。

这种方式是进程间通信速度最快的,缺点是需要考虑共享资源的同步问题。

(4)还有就是信号 signal,信号是进程通信中唯一的异步通信机制,任何时候都可以对某个进程发送某种信号,比如常见的 kill 命令,Cltr + C 发送终止信号,Cltr + Z 发送暂停信号等。

(5)最后就是 Socket, Socket 实现不同主机上进程间通信,期间需要建立连接,然后使用 write 和 read 来传递数据。

总结一下

我相信这种回答方式,人人都得掌握,把自己懂的说出来,当然,流畅依然是最重要的,否则你一大堆说说磕磕巴巴的,面试官听着估计很烦。

上面我举了两个例子,两个例子中,有些要么没有说优缺点,要么没有说应用场景,这并没有关系,有得说的你说就行,没有得说的就不说,总体按照这个模版,可以让你回答起来不那么乱,也能把你知道的都展现出来。

发表评论

后才能评论