作者:李新杰

来自:编程新说

?先来点鸡汤前几年易中天可谓非常的火,接受过很多采访。他的情况比较特殊,在武汉读高中时期,恰逢“知识青年上山下乡”活动,就到新疆去了。

在新疆生产建设兵团工作、生活了10年,而后在乌鲁木齐钢铁公司子弟中学任教。77年全国恢复高考后他没有去考大学,78年国家恢复研究生招生后他去考了,然后被武汉大学中文系录取。

当时主持人问他,为什么跳过本科直接考研究生呢?他的回答是:考场上的事谁能说的准呐,如果我和我的学生一起去参加高考,万一他考上了我没考上,这多丢人呢(还怎么好意思当人家的老师)。但是考研如果考不上,那在学生面前是不丢人的。

大名鼎鼎的教授当初都害怕考不上,看来考上考不上乃兵家常事。

面试也是一样的,我们应该正确对待。知道的就回答,不知道的就请教,似是而非的就探讨,开开心心的度过一个小时的交谈就行了。至于结果那要看缘分了,而且这是一个双向选择。

?记一次面试

有位应聘者来面试,我和他坐到了小会议室里。他,很年轻,刚入行,应该还培训过,是不是计算机专业我已经记不清了。

但这不重要,照例还是从List问起。一是List可以说是最简单的,二是简单的问题更能考察一个人的思维表达能力。

我:做Java开发的,List肯定用过,你都用过哪些List的实现类呢?

他:一般都用ArrayList。

我:除了ArrayList,你还知道哪些List,没用过也行。

他:(有点紧张)不知道。

其实他的水平大概我也清楚了,完全可以再问两个问题草草把他打发走。但只要时间允许的情况下,我是不会这样做的。

一方面是不让面试者觉得自己因水平较差不受重视。

二是这部分人大都是转行培训刚入坑不久的新人,不想让他们的自信心受到打击。

三是面试的过程其实对面试官也是一种锻炼,也可以借机refresh自己的记忆。

最后说句良心话,面试者为了这个面试花在路上的时间估计都要一个小时,如果用5分钟就让人家走,感觉有点说不过去。

我:还有一个LinkedList,不知道你有没有见过。

他:知道,平时没用过,所以没什么印象。

我:一个叫ArrayList,一个叫LinkedList,根据名字你说下它们底层是怎么实现的?

他:应该一个是用数组实现的,一个是链表实现的。

我:那你能不能说一下数组和链表的主要区别是什么?

大概过了好几秒,他没有回答,也不说不知道。我觉得可能是我问的方式略微笼统,我就又具体了一些。

我:数组和链表是数据结构里的概念,这你应该知道。我的意思是从数据结构的角度,数组有什么特点,链表有什么特点,或者说它们在内存里大致是怎么分布的?

他:数据结构的东西不太会。

我觉得我的问题已经很清晰了,但凡是正常的开发者,多多少少都应该能说出点,可是,他没有。

看得出他有点紧张,所以我每次都是微笑着、用很柔和的声音和他说话,就害怕太强势了给他造成影响。

虽然这么简单的问题,他都不会,我还是很耐心地给他讲解,就当是锻炼自己了。

我:定义一个数组,只需指定一个长度即可。然后就可以通过变量名+索引(或者说下标)的形式访问数组元素了,下标不能超过数组长度,否则就会发生索引越界异常。

比如数组a,长度是10,那么第一个元素就是a[0],最后一个就是a[9]。想访问哪个元素只要指定下标就可以了。像这种可以随意访问任何元素的,有个专用名词叫做随机访问。

那我们来看下它在内存中是如何分布的,才支持随机访问。其实数组在内存中是一段连续的空间,你可以把它想象成一个梯子,一个格子紧挨着一个格子。

数组名,也就是这个a,指向了这个空间的起始处地址,也就是数组的第一个元素的地址,所以其实和a[0]指向的是同一个地方。但a和a[0]的含义不一样,a表示内存地址,a[0]表示这个地址上存的元素。

这里的下标0其实指的是相对于起始处地址的偏移量。0表示没有偏移,所以就是起始处地址的那个元素,也即第一个元素。

a[1]表示相对于起始处地址偏移量为1的那个元素,实际可以认为底层执行的是*(a + 1)。a+1表示从起始地址开始向后偏移1个之后的地址,那么*(星号)的意思就是取出那个地址上存储的元素。因为向后偏移了1个,其实就是第二个,所以a[1]叫取出数组的第二个元素。

因数组在内存中是一段连续的空间,所以不管访问哪个元素都是这两步,加上偏移量,然后取数据。这就是它支持随机访问的原因。说白了就是所有元素按顺序挨在了一起。

也可以看出来,不管数组的长度是多长,访问元素的方式都是这两步,都在常量的时间内完成。所以按索引访问数组元素的时间复杂度就是O(1)。

ArrayList只不过是对数组的包装,因为数组在内存中分配时必须指定长度,且一旦分配好后便无法再增加长度,即不可能在原数组后面再接上一段的。

ArrayList之所以可以一直往里添加,是因为它内部做了处理。当底层数组填满后,它会再分配一个更大的新的数组,把原数组里的元素拷贝过来,然后把原数组抛弃掉。使用新的数组作为底层数组来继续存储。

他:你讲的非常好,我完全听懂了,比我当时那个培训班的老师讲的好多了。

我:LinkedList也实现了List接口,也可以按索引访问元素,表面上用起来感觉差不多,但是其底层却有天壤之别。

与数组一下子分配好指定长度的空间备用不同,链表不会预先分配空间。而是在每次添加一个元素时临时专门为它自己分配一个空间。

因为内存空间的分配是由操作系统完成的,可以说每次分配的位置都是随机的,并没有确定的规律。所以说链表的每个元素都在完全不同的内存地址上,那我们该如何找到它们呢?

唯一的做法就是把每个元素的内存地址都要保存起来。怎么保存呢?那就让上一个元素除了存储具体的数据之外,也存储一份下一个元素在内存中的地址。

整个就像前后按顺序依次相连的一条链,我们只要保存第一个元素的内存地址,就可以顺藤摸瓜找到所有的元素。

这其实就像一个挖宝藏游戏,假设共10步,告诉你第一步去哪里挖。然后挖出一个字条,上面写着第二步去哪里挖。依次这样挖下去。第九步挖出字条后才知道宝藏的位置,然后第十步就把它挖出来了。

可见为了得到宝藏必须这样一步一步挖下去。中间的任何一步都不能跳过,因为第十步宝藏的位置在第九步里放着呢,第九步的位置在第八步里放着呢,依次倒着下来就到了第一步的位置,而第一步的位置已经告诉你了。

所以数组更像是康庄大道、四平八稳。链表更像是曲径通幽、人迹罕至。一个像探险,步步为营。一个像回家,轻车熟路。

可见按索引访问链表元素时,必须从头一个个遍历,而且链表越长,位置越靠后,所需花费的时间就越长。所以按索引访问链表元素的时间复杂度就是O(n),n为链表的长度。

也说明了链表不支持随机访问。所以ArrayList就实现了RandomAccess(随机访问)接口,而LInkedList就没有。

他:你讲的真好。

?后记

后来这个应聘者给我司前台打电话,说他自己水平太差,无法到我司来。但是叮嘱前台一定要转达对我的感谢。

说面试时他内心非常紧张,但面试官总是面带微笑很温和地跟他说话。遇到不懂的地方,总是非常有耐心地给他讲解,旁征博引,举一反三。最后他都听懂了,而且也不紧张了。

我感觉这是我收到的对我最高的评价,不是吗?

架构师小秘圈

聚集20万架构师的小圈子

长按二维码 ▲

关注「架构师小秘圈」公众号

谢谢老板,点个好看↓

【面试】我是如何面试别人List相关知识的,深度有点长文相关推荐

  1. 我是如何面试别人List相关知识的

    作者 |  李新杰 来源 |  编程新说 微信公众号 先来点鸡汤 前几年易中天可谓非常的火,接受过很多采访.他的情况比较特殊,在武汉读高中时期,恰逢"知识青年上山下乡"活动,就到新 ...

  2. 【面试】大佬是如何面试别人List相关知识的

    本文公众号来源:编程新说李新杰 作者:编程新说 看后总结:良心面试官 面试我们应该正确对待.知道的就回答,不知道的就请教,似是而非的就探讨,开开心心的度过一个小时的交谈就行了.至于结果那要看缘分了,而 ...

  3. php发送数据到视图格式_PHP-FPM的相关知识的深度解释

    一.需要搞清楚几个名词概念 1. CGI(Common Gateway Interface,CGI)通用网关接口, 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能.CGI ...

  4. 关于Spring的69个面试问答和Top25个问答--终极列表,以及Spring相关知识

    Spring 框架越来越流行,很多大型系统用到,了解Spring的面试题有助简要短时间于了解对应的知识, 关于Spring的69个面试问答--终极列表 http://www.importnew.com ...

  5. 面试必考的网络协议相关题目应该如何回答

    转载自  面试必考的网络协议相关题目应该如何回答 最近,正处于校招季.很多小伙伴已经拿到了如愿以偿的Offer,有些小伙伴还在努力着. 平常,也会有一些粉丝会在公众号留言,或者在微信上问我一些面试题. ...

  6. 面试官95%会问的接口测试知识

    接口测试最近几年被炒的火热了,越来越多的测试同行意识到接口测试的重要性.接口测试为什么会如此重要呢? 主要是平常的功能点点点,大家水平都一样,是个人都能点,面试时候如果问你平常在公司怎么测试的,你除了 ...

  7. 示波器_你真的懂示波器嘛?面试中会用到的示波器知识

    示波器是电子工程师经常使用到的电子测量仪器,用途十分广泛,可将肉眼看不见的电信号变换成看得见的图像,便于人们研究各种电现象的变化过程.利用示波器能观察各种不同信号幅度随时间变化的波形曲线,还可以用它测 ...

  8. 我从大厂面试中学到的关于 C# 的知识

    我从工作面试中学到的关于 C# 的知识 原文链接:https://michaelscodingspot.com/what-i-learned-about-c-from-job-interviews/ ...

  9. ​面试官口述:我是这样面试web前端开发求职者(有干货)

    这几天面试了几个前来应聘前端开发的求职者,有刚毕业的,也有工作几年,水平有高有低. 对刚入行的求职者,我一般会格外的友好礼貌,不论最后能否有缘成为同事, 至少我会尽可能给他们一次愉快的面试体验. 刚踏 ...

最新文章

  1. android 实现 下拉筛选的效果
  2. 火狐拓展开发 基础知识
  3. POJ 2185 正解 KMP
  4. 比特币现金生态:SLP开发人员发布新规则
  5. 网络编程学习笔记(gethostbyname2函数与IPv6支持)
  6. Eclipse执行import命令导入maven项目时报错:Add a version or custom suffix using Name template in Advanced set...
  7. 4.3.7 基于类的访问权限
  8. 别转管理,十年程序员老鸟给新手的几条忠告(转)
  9. python反转列表解析_Python语法糖之:列表解析、集合解析和字典解析
  10. opencv BRIEF角检测
  11. Linux 应用市场易受RCE和供应链攻击,多个0day未修复
  12. 页面可用性之浏览器默认字体与CSS 中文字体
  13. 我的毕业论文————面向对象的软件测试
  14. 数据仓库之内容建设(架构、分层、主数据、指标体系、词根、血缘)
  15. Android基础课程:第三方视频播放器(播放网络资源)
  16. oracle创建用户并授权select,oracle创建用户并授权,oracle创建用户并授权select
  17. Vue+Vuex+Axios+ECharts 画一个动态更新的中国地图
  18. 快速排序详解(图解实例)
  19. vue+node.js+mysql的数据库课程设计有感
  20. 蓝色简洁个人岗位竞聘PPT模板

热门文章

  1. 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]
  2. 差分约束问题 ---- 2019ccpc哈尔滨A. Artful Paintings[二分+差分约束+建图剪枝]
  3. sae python连接mysql_SAE Tornado 应用连接并使用 Mysql
  4. mysql ssl_cipher_mysql添加用户:出现Field 'ssl_cipher' doesn't have a defa
  5. 121.买卖股票的最佳时机
  6. 使用PostMan工具测试spring boot接口的若干请求参数形式
  7. Git 常用命令总结
  8. php 处理ftp常用操作与方法
  9. Express4.x api 翻译(draft)
  10. Nginx rewrite正则匹配重写