本文公众号来源:编程新说李新杰 作者:编程新说

看后总结:良心面试官

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

?记一次面试

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

但这不重要,照例还是从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就没有。

他:你讲的真好。

?后记

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

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

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

推荐阅读:

  • MySQL知识点总结

  • 通过淘宝,大白话讲解大数据各个方向的分工

  • 《大型网站系统与Java中间件》读书笔记 (二)

  • 面试官:“谈谈Spring中都用到了那些设计模式?”。

  • 【吐血推荐】什么是领域驱动设计?DDD?

  • 基础:为什么计算机只认识0和1?

  • 面试题:你的Redis怎么持久化的


200多篇原创技术文章海量视频资源精美脑图面试题

长按扫码可关注获取

欢迎关注点个再看

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

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

    作者:李新杰 来自:编程新说 ?先来点鸡汤前几年易中天可谓非常的火,接受过很多采访.他的情况比较特殊,在武汉读高中时期,恰逢"知识青年上山下乡"活动,就到新疆去了. 在新疆生产建设 ...

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

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

  3. 今日头条大佬十年面试了 2000 人,总结了这 5 点

    转载自  今日头条大佬十年面试了 2000 人,总结了这 5 点 文章整理自今日头条张一鸣在"2016今日头条Bootcamp"上对研发&产品部门应届毕业生的寄语. 大家好 ...

  4. 【C++后台开发面经】面试总结第三波:针对后台开发相关基础知识分类总结

    前言 面试总结第三波,关于后台开发面试相关基础知识,数据结构.算法.linux操作系统.计算机网络.C++.数据库进行分类总结. 后端面试总结 目录 后端面试总结 1.数据结构 链表和数组的区别 树的 ...

  5. 面试被问mysql扩展性设计相关的点,你知道该如何回答吗

    面试被问mysql扩展性设计相关的点,你知道该如何回答吗 什么是扩展性 横向扩展(Scale Out) 和纵向扩展(Scale Up)区别 横向扩展 纵向扩展 事务相关性最小化原则 解决方案 敲黑板. ...

  6. 总结一下:运维工程师面试的经历及面试相关问题

    2018年1月4号面试     笔者其实没有想到去面试,只是在智联上更新了一下简历,就陆陆续续接到很多猎头的邮件和电话,实在是没准备好要去面试,就推掉了几家公司的面试了.正因为笔者也很久没有面试了,笔 ...

  7. 微软大佬的校招面试总结

    三妹的话:这篇文章授权于我的室友,希望能帮到大家. 校招面试总结 这篇文章是我校招时的回顾和总结,主要是程序员面试相关的整体心得和体会.用六个字总结就是 "早准备,多尝试". 自身 ...

  8. 211本科大佬的真实面试经历:测试人要不要去外包公司?

    在IT这个行业中,相信很多人经常不可避免的听到一个词'外包',尤其是对于找工作的朋友们,更是一种艰难的选择,为什么这么说呢? 因为对于一些从培训班出来的新人进入互联网行业,有时候进外包公司是真的被逼的 ...

  9. 2021秋招-面试高频2-BN、LN、WN相关

    面试高频2-BN.LN.WN相关 终极问题? 1. BN.LN.WN.IN.CN分别是怎样计算的? CV和NLP方面有什么区别? 参考2-知乎-如何区分并记住常见的几种 Normalization 算 ...

最新文章

  1. SDUT OJ 数据结构实验之排序一:一趟快排
  2. 幻灯片:Why Java Sucks and C# Rocks
  3. Andorid中使用Jsoup解析库解析XML、HTML、Dom节点---第三方库学习笔记(三)
  4. Kubernetes集群的部署方式及详细步骤
  5. pythonflask configlist.py_Python+Flask.0004.FLASK配置管理之三种方式加载外部配置
  6. 德鲁克的《卓有成效的管理者》
  7. linux分区表导出与恢复,Linux下硬盘数据恢复与分区表恢复
  8. 风变python学习2---字符串,整数,浮点型数据分析,应用
  9. qt鼠标键盘钩子类设计
  10. caffe lmdb
  11. python刷题记录:买帽子
  12. 老罗直播带货首秀成了么?
  13. 获取设备唯一编号替代IMEI新方案
  14. Generic XDP Hook
  15. 算法面试用c还是python_排序算法(C语言+Python版)宝宝再也不怕面试官写排序算法了...
  16. zutuanxue.com-Linux终端的使用
  17. 07深圳浩项隔音窗,隔音知识与方法
  18. win10常用详细快捷键大全
  19. 简单实现一下百度地图
  20. SAP BDC数据批量导入功能

热门文章

  1. 基于感知机的手写数字识别java实现
  2. 用H5和原生JS制作一款简单的视频播放器
  3. 用双重for循环打印99乘法表
  4. python中的装包与解包*,**
  5. Java 并发之Concurrent 包综述
  6. ERP 系统的核心是什么?有什么作用?
  7. 什么是tomcat?
  8. 孩子发烧是细菌感染还是病毒感染?教你秒懂血常规!
  9. 是时候更新Android Studio 3.5了!不信,你看~
  10. HTML5与视频传输_拔剑-浆糊的传说_新浪博客