求求大厂给个Offer:List面试题
前言
只有光头才能变强。
文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y
从今天开始,我,三歪,正式开始写面试系列。我给这个面试系列取了一个名字,叫做《求求大厂给个Offer》
上一篇就叫做《求求大厂给个Offer:如何写简历》
所以这篇文章叫做《求求大厂给个Offer:List面试题》
接下来就开始吧。
本文有配套的视频观看:https://www.bilibili.com/video/BV1nT4y1L71r/ 欢迎三连。
面试现场
面试官:“你简单自我介绍一下吧”
三歪:“我叫三歪,目前维护一个公众号叫做Java3y,这几年写了300+原创技术文章,近1000页的原创电子书和多个知识点的思维导图。我的愿景是:只要关注我并三连的同学都可以拿到大厂offer。我的....”
面试官:“停停停,别吹了,我们正式开始吧。”
面试官:“来讲讲Java的List吧,你对List了解多少?”
三歪:“List在Java里边是一个接口,常见的实现类有ArrayList和LinkedList,在开发中用得最多的是ArrayList”
面试官:“你再分别来讲讲ArrayList和LinkedList的区别呗”
三歪:“ArrayList的底层数据结构是数组,LinkedList底层数据结构是链表。”
面试官:“那我们本身就有数组了,为什么要用ArrayList呢?”
三歪:“原生的数组会有一个特点:你在使用的时候必须要为它创建大小,而ArrayList不用”
面试官:“那你说说ArrayList是怎么实现的吧,为什么ArrayList就不用创建大小呢?”
三歪:“其实是这样的,我看过源码。当我们new ArrayList()
的时候,默认会有一个空的Object
数组,大小为0。当我们第一次add
添加数据的时候,会给这个数组初始化一个大小,这个大小默认值为10”
面试官:“嗯”
三歪:“还有就是,数组的大小是固定的,而ArrayList的大小是可变的”
面试官:“那怎么理解固定和可变的呢?你说说看”
三歪:“假设我们给定数组的大小是10,要往这个数组里边填充元素,我们只能添加10个元素。而ArrayList不一样,ArrayList我们在使用的时候可以往里边添加20个,30个,甚至更多的元素”
三歪:“因为ArrayList是实现了动态扩容的”
面试官:“那它是怎么实现的呢?”
三歪:“使用ArrayList在每一次add
的时候,它都会先去计算这个数组够不够空间,如果空间是够的,那直接追加上去就好了。如果不够,那就得扩容”
面试官:“那怎么扩容?一次扩多少?”
三歪:“在源码里边,有个grow
方法,每一次扩原来的1.5
倍。比如说,初始化的值是10嘛。现在我第11个元素要进来了,发现这个数组的空间不够了,所以会扩到15”
三歪:“空间扩完容之后,会调用arraycopy
来对数组进行拷贝”
面试官:“哦,可以的。那为什么你在前面提到,在日常开发中用得最多的是ArrayList呢?”
三歪:“是由底层的数据结构来决定的,在日常开发中,遍历的需求比增删要多,即便是增删也是往往在List的尾部添加就OK了。像在尾部添加元素,ArrayList的时间复杂度也就O(1)
”
三歪:“另外的是,ArrayList的增删底层调用的copyOf()
被优化过,现代CPU对内存可以块操作,ArrayList的增删一点儿也不会比LinkedList慢”
面试官:“Vector你了解吗?”
三歪:“嗯,Vector是底层结构是数组,一般现在我们已经很少用了。相对于ArrayList,它是线程安全的,在扩容的时候它是直接扩容两倍的,比如现在有10个元素,要扩容的时候,就会将数组的大小增长到20”
面试官:“嗯,那如果我们不用Vector,线程安全的List还有什么?”
三歪:“首先,我们也可以用Collections来将ArrayList来包装一下,变成线程安全。但这肯定不是你想听的,对吧。在java.util.concurrent
包下还有一个类,叫做CopyOnWriteArrayList”
面试官:“嗯,你继续说”
三歪:“要讲CopyOnWriteArrayList之前,我还是想说说copy-on-write
这个意思,下面我会简称为cow
。比如说在Linux中,我们知道所有的进程都是init
进程fork
出来的,除了进程号之外,fork
出来的进程,默认跟父进程一模一样的。在fork
之后exec
之前,两个进程用的是相同的内存空间的,这意味着子进程的代码段、数据段、堆栈都是指向父进程的物理空间”
面试官:“嗯”
三歪:“当父子进程中有更改的行为发生时,再为子进程分配相应物理空间。这样做的好处就是,等到真正发生修改的时候,才去分配资源,可以减少分配或者复制大量资源时带来的瞬间延时。简单来说,就可以理解为我们的懒加载,或者说单例模式的懒汉式。等真正用到的时候再分配”
面试官:“嗯”
三歪:“在文件系统中,其实也有cow
的机制。文件系统的cow
就是在修改数据的时候,不会直接在原来的数据位置上进行操作,而是重新找个位置修改。比如说:要修改数据块A的内容,先把A读出来,写到B块里面去。如果这时候断电了,原来A的内容还在。这样做的好处就是可以保证数据的完整性,瞬间挂掉了容易恢复。
三歪:“再回头来看CopyOnWriteArrayList吧,CopyOnWriteArrayList是一个线程安全的List,底层是通过复制数组的方式来实现的。
三歪:“我来说说它 的add()
方法的实现吧”
面试官:“好”
三歪:“在add()
方法其实他会加lock
锁,然后会复制出一个新的数组,往新的数组里边add
真正的元素,最后把array的指向改变为新的数组”
三歪:“其实get()
方法又或是size()
方法只是获取array所指向的数组的元素或者大小。读不加锁,写加锁”
三歪:“可以发现的是,CopyOnWriteArrayList跟文件系统的COW机制是很像的”
面试官:“那你能说说CopyOnWriteArrayList有什么缺点吗?”
三歪:“很显然,CopyOnWriteArrayList是很耗费内存的,每次set()/add()
都会复制一个数组出来,另外就是CopyOnWriteArrayList只能保证数据的最终一致性,不能保证数据的实时一致性。假设两个线程,线程A去读取CopyOnWriteArrayList的数据,还没读完,现在线程B把这个List给清空了,线程A此时还是可以把剩余的数据给读出来。”
面试官:“嗯,还可以,今天的面试就到这里结束了,你有什么想问我的吗?”
三歪:“你觉得我今天的表现怎么样?”
面试官:“今天的表现还可以,如果这一次你没有100个点赞,估计HR就不会再联系你了。如果超过100个点赞,第二轮好好表现吧。”
面试官:“给你透露一下,Map集合可以好好准备一下,下一轮将会考察Map的知识”
题外话
List集合总体来说不会太难,但CopyOnWriteArrayList可能很多同学还不知道有这么一个类。
针对这次的面试可能你想了解更多List的细节,比如说ArrayList/LinkedList/CopyOnWriteArrayList
的源码以及上面提到的COW
机制,可以在公众号下回复「List」即可获取我之前写的原创文章。
需要预习或者领取电子书的同学,在公众号下回复「888」即可获取。
本文有配套的视频观看:https://www.bilibili.com/video/BV1nT4y1L71r/ 欢迎三连。
各类知识点总结
下面的文章都有对应的原创精美PDF,在持续更新中,可以来找我催更~
- 92页的Mybatis
- 129页的多线程
- 141页的Servlet
- 158页的JSP
- 76页的集合
- 64页的JDBC
- 105页的数据结构和算法
- 142页的Spring
- 58页的过滤器和监听器
- 30页的HTTP
- 42页的SpringMVC
- Hibernate
- AJAX
- Redis
- ......
涵盖Java后端所有知识点的开源项目(已有10K+ star):
如果大家想要实时关注我更新的文章以及分享的干货的话,微信搜索Java3y。
PDF文档的内容均为手打,有任何的不懂都可以直接来问我(公众号有我的联系方式)。
我是三歪,一个想要变强的男人,感谢大家的点赞收藏和转发,下期见。给三歪点个赞,对三歪真的非常重要!
求求大厂给个Offer:List面试题的更多相关文章
- 求求大厂给个Offer:Map面试题
前言 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文章,最近在连载面试系列! 我,三歪,最近开始写面试系列.我给这个面试系列 ...
- 剑指Offer——网易笔试题+知识点总结
剑指Offer--网易笔试题+知识点总结 Fibonacci package cn.edu.ujn.nk; import java.util.ArrayList; import java.util.S ...
- 剑指Offer——咪咕笔试题+知识点总结
剑指Offer--咪咕笔试题+知识点总结 情景回顾 时间:2016.10.09 15:00-16:30 地点:山东省网络环境智能计算技术重点实验室 事件:咪咕笔试 知识点总结 1.Html设置格式贵阳 ...
- 剑指Offer——滴滴笔试题+知识点总结
剑指Offer--滴滴笔试题+知识点总结 情景回顾 时间:2016.9.18 15:00-17:00 地点:山东省网络环境智能计算技术重点实验室 事件:滴滴笔试 总体来说,滴滴笔试内容体量不算多, ...
- 剑指Offer——迅雷笔试题+知识点总结
剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...
- 《剑指offer》面试题39 二叉树的深度(java)
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...
- 【剑指Offer】面试题10- II. 青蛙跳台阶问题
题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返 ...
- 大厂必问的Spring面试题
准备了一个月的八股文,经历了二十几场秋招面试之后,发现Spring很受面试官青睐.最近有空将Spring常见的面试题总结了一下,希望对大家有所帮助. 文章目录: Spring的优点 Spring 用到 ...
- 大厂必问的JVM面试题
本文目录: 讲一下JVM内存结构? 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 Java对象的定位方式 说一下堆栈的区别? 什么情况下会发生栈溢出? 类文件结构 什么是类加载 ...
随机推荐
- JVM系列之:String.intern和stringTable
目录 简介 intern简介 intern和字符串字面量常量 分析intern返回的String对象 分析实际的问题 G1中的去重功能 总结 简介 StringTable是什么?它和String.in ...
- Centos 7下编译安装Mysql
(1)官网下载地址:https://dev.mysql.com/downloads/mysql/ 此处下载的是 mysql-boost-5.7..tar.gz 百度云下载地址:https://pan. ...
- jmeter控制器入门笔记一
@@@@@@@@@@@@@@@ 千里之行 今天记录一下个人才使用控制器时的一些心得.逻辑控制器在jmeter中有很多种,个人根据官方解释理解的作用就是:通过控制器可以更好地控制请求的执行顺序.jmet ...
- PHP fileowner() 函数
定义和用法 fileowner() 函数返回指定文件的用户 ID(所有者). 如果成功,该函数返回用户 ID.如果失败,则返回 FALSE. 语法 fileowner(filename) 参数 描述 ...
- luogu P5410 模板 扩展 KMP Z函数 模板
LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...
- 牛客练习赛64 红色的樱花 exgcd 贪心
LINK:The red sakura 暴怒狂樱 血染京都. 这题质量不咋地 这题也没啥营养. 不过还是存在值得学习的地方的. 一个trick n行 m列 第一行与第n行相连 第1列和第m列相连的时候 ...
- luogu P4284 [SHOI2014]概率充电器 期望 概率 树形dp
LINK:概率充电器 大概是一个比较水的题目 不过有一些坑点. 根据期望的线性性 可以直接计算每个元件的期望 累和即为答案. 考虑统计每一个元件的概率的话 那么对其有贡献就是儿子 父亲 以及自己. 自 ...
- day6. while双项循环及for循环
一.双向循环经典练习 1.打印十行十列小星星(2个循环) # j 外循环用来控制行数 j = 0 while j<10: # 打印一行十个星星 i = 0 while i <10: # 写 ...
- e分钟带你利用Python制作词云图
随着大数据时代的来临,数据分析与可视化,显得越来越重要,今天给小伙伴们带来一种最常见的数据可视化图形-词云图的制作方法. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法 ...
- Python人脸识别 + 手机推送,老板来了你就会收到短信提示