源码

潜水的小猴子 2019-09-05 06:51:40
引导语 List 作为工作中最常见的集合类型,在面试过程中,也是经常会被问到各种各样的面试题,一般来说,只要你看过源码,心中对 List 的总体结构和细节有所了解的话,基本问题都不大。 1 面试题 1.1 说说你自己对 ArrayList 的理解? 很多面试官喜欢这样子开头,考察面试同学对 ArrayList 有没有总结经验,介于 ArrayList 内容很多,建议先回答总体架构,再从某个细节出发作为突破口,比如这样: ArrayList 底层数据结构是个数组,其 API 都做了一层对数组底层访问的封装,比如说 add 方法的过程是……(这里可以引用我们在 ArrayList 源码解析中 add 的过程)。 一般面试官看你回答得井井有条,并且没啥漏洞的话,基本就不会深究了,这样面试的主动权就掌握在自己手里面了,如果你回答得支支吾吾,那么面试官可能就会开启自己面试的套路了。 说说你自己对 LinkedList 的理解也是同样套路。 1.2 扩容类问题 1.2.1 ArrayList 无参数构造器构造,现在 add 一个值进去,此时数组的大小是多少,下一次扩容前最大可用大小是多少? 答:此处数组的大小是 1,下一次扩容前最大可用大小是 10,因为 ArrayList 第一次扩容时,是有默认值的,默认值是 10,在第一次 add 一个值进去时,数组的可用大小被扩容到 10 了。 1.2.2 如果我连续往 list 里面新增值,增加到第 11 个的时候,数组的大小是多少? 答:这里的考查点就是扩容的公式,当增加到 11 的时候,此时我们希望数组的大小为 11,但实际上数组的最大容量只有 10,不够了就需要扩容,扩容的公式是:oldCapacity + (oldCapacity >> 1),oldCapacity 表示数组现有大小,目前场景计算公式是:10 + 10 /2 = 15,然后我们发现 15 已经够用了,所以数组的大小会被扩容到 15。 1.2.3 数组初始化,被加入一个值后,如果我使用 addAll 方法,一下子加入 15 个值,那么最终数组的大小是多少? 答:第一题中我们已经计算出来数组在加入一个值后,实际大小是1,最大可用大小是10 ,现在需要一下子加入 15 个值,那我们期望数组的大小值就是 16,此时数组最大可用大小只有 10,明显不够,需要扩容,扩容后的大小是:10 + 10 /2 = 15,这时候发现扩容后的大小仍然不到我们期望的值 16,这时候源码中有一种策略如下: // newCapacity 本次扩容的大小,minCapacity 我们期望的数组最小大小 // 如果扩容后的值 < 我们的期望值,我们的期望值就等于本次扩容的大小 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; 点击代码块进入预览复制代码 所以最终数组扩容后的大小为 16。 1.2.4 现在我有一个很大的数组需要拷贝,原数组大小是 5k,请问如何快速拷贝? 答:因为原数组比较大,如果新建新数组的时候,不指定数组大小的话,就会频繁扩容,频繁扩容就会有大量拷贝的工作,造成拷贝的性能低下,所以回答说新建数组时,指定新数组的大小为 5k 即可。 1.2.5 为什么说扩容会消耗性能? 答:扩容底层使用的是 System.arraycopy 方法,会把原数组的数据全部拷贝到新数组上,所以性能消耗比较严重。 1.2.6 源码扩容过程有什么值得借鉴的地方? 答:有两点: 是扩容的思想值得学习,通过自动扩容的方式,让使用者不用关心底层数据结构的变化,封装得很好,1.5 倍的扩容速度,可以让扩容速度在前期缓慢上升,在后期增速较快,大部分工作中要求数组的值并不是很大,所以前期增长缓慢有利于节省资源,在后期增速较快时,也可快速扩容。 扩容过程中,有数组大小溢出的意识,比如要求扩容后的数组大小,不能小于 0,不能大于 Integer 的最大值。 这两点在我们平时设计和写代码时都可以借鉴。 2 删除类问题 2.1 有一个 ArrayList,数据是 2、3、3、3、4,中间有三个 3,现在我通过 for (int i=0;i<list.size();i++) 的方式,想把值是 3 的元素删除,请问可以删除干净么?最终删除的结果是什么,为什么?删除代码如下: List<String> list = new ArrayList<String>() {{ add("2"); add("3"); add("3"); add("3"); add("4"); }}; for (int i = 0; i < list.size(); i++) { if (list.get(i).equals("3")) { list.remove(i); } } 点击代码块进入预览复制代码 答:不能删除干净,最终删除的结果是 2、3、4,有一个 3 删除不掉,原因我们看下图: 图中我们可以看到,每次删除一个元素后,该元素后面的元素就会往前移动,而此时循环的 i 在不断地增长,最终会使每次删除 3 的后一个 3 被遗漏,导致删除不掉。 2.2 还是上面的 ArrayList 数组,我们通过增强 for 循环进行删除,可以么? 答:不可以,会报错。因为增强 for 循环过程其实调用的就是迭代器的 next() 方法,当你调用 list#remove() 方法进行删除时,modCount 的值会 +1,而这时候迭代器中的 expectedModCount 的值却没有变,导致在迭代器下次执行 next() 方法时,expectedModCount != modCount 就会报 ConcurrentModificationException 的错误。 2.3 还是上面的数组,如果删除时使用 Iterator.remove() 方法可以删除么,为什么? 答:可以的,因为 Iterator.remove() 方法在执行的过程中,会把最新的 modCount 赋值给 expectedModCount,这样在下次循环过程中,modCount 和 expectedModCount 两者就会相等。 2.4 以上三个问题对于 LinkedList 也是同样的结果么? 答:是的,虽然 LinkedList 底层结构是双向链表,但对于上述三个问题,结果和 ArrayList 是一致的。 3 对比类问题 3.1 ArrayList 和 LinkedList 有何不同? 答:可以先从底层数据结构开始说起,然后以某一个方法为突破口深入,比如:最大的不同是两者底层的数据结构不同,ArrayList 底层是数组,LinkedList 底层是双向链表,两者的数据结构不同也导致了操作的 API 实现有所差异,拿新增实现来说,ArrayList 会先计算并决定是否扩容,然后把新增的数据直接赋值到数组上,而 LinkedList 仅仅只需要改变插入节点和其前后节点的指向位置关系即可。 3.2 ArrayList 和 LinkedList 应用场景有何不同 答:ArrayList 更适合于快速的查找匹配,不适合频繁新增删除,像工作中经常会对元素进行匹配查询的场景比较合适,LinkedList 更适合于经常新增和删除,对查询反而很少的场景。 3.3 ArrayList 和 LinkedList 两者有没有最大容量 答:ArrayList 有最大容量的,为 Integer 的最大值,大于这个值 JVM 是不会为数组分配内存空间的,LinkedList 底层是双向链表,理论上可以无限大。但源码中,LinkesList 实际大小用的是 int 类型,这也说明了 LinkedList 不能超过 Integer 的最大值,不然会溢出。 3.4 ArrayList 和 LinkedList 是如何对 null 值进行处理的 答:ArrayList 允许 null 值新增,也允许 null 值删除。删除 null 值时,是从头开始,找到第一值是 null 的元素删除;LinkedList 新增删除时对 null 值没有特殊校验,是允许新增和删除的。 3.5 ArrayList 和 LinedList 是线程安全的么,为什么? 答:当两者作为非共享变量时,比如说仅仅是在方法里面的局部变量时,是没有线程安全问题的,只有当两者是共享变量时,才会有线程安全问题。主要的问题点在于多线程环境下,所有线程任何时刻都可对数组和链表进行操作,这会导致值被覆盖,甚至混乱的情况。 如果有线程安全问题,在迭代的过程中,会频繁报 ConcurrentModificationException 的错误,意思是在我当前循环的过程中,数组或链表的结构被其它线程修改了。 3.6 如何解决线程安全问题? Java 源码中推荐使用 Collections#synchronizedList 进行解决,Collections#synchronizedList 的返回值是 List 的每个方法都加了 synchronized 锁,保证了在同一时刻,数组和链表只会被一个线程所修改,或者采用 CopyOnWriteArrayList 并发 List 来解决,这个类我们后面会说。 4 其它类型题目 4.1 你能描述下双向链表么? 答:如果和面试官面对面沟通的话,你可以去画一下,可以把 《LinkedList 源码解析》中的 LinkedList 的结构画出来,如果是电话面试,可以这么描述:双向链表中双向的意思是说前后节点之间互相有引用,链表的节点我们称为 Node。Node 有三个属性组成:其前一个节点,本身节点的值,其下一个节点,假设 A、B 节点相邻,A 节点的下一个节点就是 B,B 节点的上一个节点就是 A,两者互相引用,在链表的头部节点,我们称为头节点。头节点的前一个节点是 null,尾部称为尾节点,尾节点的后一个节点是 null,如果链表数据为空的话,头尾节点是同一个节点,本身是 null,指向前后节点的值也是 null。 4.2 描述下双向链表的新增和删除 答:如果是面对面沟通,最好可以直接画图,如果是电话面试,可以这么描述: 新增:我们可以选择从链表头新增,也可以选择从链表尾新增,如果是从链表尾新增的话,直接把当前节点追加到尾节点之后,本身节点自动变为尾节点。 删除:把删除节点的后一个节点的 prev 指向其前一个节点,把删除节点的前一个节点的 next 指向其后一个节点,最后把删除的节点置为 null 即可。 总结 List 在工作中经常遇到,熟读源码不仅仅是为了应对面试,也为了在工作中使用起来得心应手,如果想更深入了解 List,可以看一遍 ArrayList 源码之后,自己重新实现一个 List。这样的话,就会对 List 底层的数据结构和操作细节理解更深。
...全文
147 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
羽飞 2019-09-15
  • 打赏
  • 举报
回复
楼主应该去Java版块贴
仿赶集网风格的分类信息网站系统,仿赶集网网站模板下载,仿赶集网分类信息网正式版下载,专业分类信息网程序开发制作,提供强大的分类信息网后台管理系统,建立全国各地地方生活分类信息发布网站的优秀网站管理系统,带分站管理功能,可发展城市分站,轻松赚钱.本次提供的是赶集网风格的分类网站模板,同时还提供有地方门户风格的分类信息网页模板,分类信息网站系统门户版风格免费大餐来了,完全免费的分类信息网站系统源代码免费版, 应用我们这个仿赶集网的分类信息网站管理系统(http://www.suishicha.com)便可建立本地最大的分类信息网站,涵盖租房,二手房交易,找工作,求职,买东西,卖东西,交友,生活服务等生活各方面,每天有数万个新鲜信息更新。自2005年我们开发分类信息网站系统以来,我们一直致力于做好本地生活的向导,并且就不断为实现这个目标而努力。作为生活服务行业的领先网站,赶集网风格分类网站系统商业版,不仅为个人用户提供了各种免费资源,免费信息,免费的信息发布平台,能最快的获得各种信息,服务。同时作为最专业的本地信息服务运营商,分类信息网站系统仿赶集网模板可以为我们的合作伙伴提供:最准确的目标消费用户群体、最直接的产品与服务展示平台、最有效的市场营销效果以及客户关系管理等多方面、多层次的服务。您可以进入分类信息网站源码赶集网模板首页进行分地区、分类别浏览,也可以按照关键词搜索您要找的信息。在这里,您能直接与信息提供者取得联系。您也可将分类广告发布到,当网民检索或者通过分类目录进行浏览时即可看到您的广告。您可以留下电话、Email、QQ以及其他联系信息,这样,对您所发布的信息感兴趣的人就可以在第一时间找到您。分类信息网系统,分类信息网站,分类网站模板,分类网源码下载,分类信息网页模板下载,分类信息网正式版,本版本前台模块有,首页,新闻中心,都市114,商家点评,商家店铺,城市联盟,便民服务,论坛交流,房屋信息房屋出租,房屋合租,房屋求租,二手房买卖,短租房/日租房,写字楼租售,生意/商铺转让,厂房/仓库/土地,跳蚤市场二手电脑,数码产品,办公用品/设备,二手家电/家具,居家用品/家纺,文体用品,玩具/游戏机,美容/保健,更多...生活服务 家政,保洁,搬家,装修/装饰,管道疏通/打孔,电脑维修,家电维修,家居维修,婚礼庆典,写真/婚纱摄影,更多... 分类信息系统源码,分类信息程序,分类信息网源码,分类信息网站源码,分类信息,源码,分类信息网站模板,分类信息网页模板,asp+mssql生成html的分类信息发布网站系统,分类网站智能建站系统,分类信息智能建站系统,分类信息后台管理系统,供求信息网站模板下载,asp分类信息供求信息发布网站管理系统,正式版源码,分类信息网站模板,HTML城市分类信息网站系统是适合单个城市使用的分类信息发布平台。系统预设了几十种信息类别,针对不同信息具有不同的发布表单和查询界面。具有会员注册、分类信息发布、会员积分、实名验证,信息管理等功能。采用灵活的可视化模版引擎,支持HTML静态页面生成和UTF-8多语言开发。asp+MSSQL大型数据库编程的分类信息网站管理系统源程序下载,分类网站模板,分类信息网页模板,信息发布网站系统商业版.一个建站分类信息网站的智能建站系统,也是一个自助建站的分类信息网站程序商业版.注册商家可开店铺,可发布分类信息,供求信息,建立企业网页黄页功能.后台功能强大,可实现网站的智能化管理,傻瓜化操作.便可建立全国性的专业门户级的分类信息网站. 分类信息网站管理系统正式版源码,分类信息网站自助建站系统源码正式版由分类信息建站专家,分类信息网站系统开发商www.suishica.com/荣誉出品,分类信息网赶集网风格版下载分类信息网站系统源码分类网站模板,采用asp+mssql开发, 运行稳定,快速,安全性能优良,功能更强大,是一套通用的,分类信息自助网站管理系统,asp源码,分类信息网源码下载,信息网站源码,分类网站源码,asp分类信息源码,地区分类信息网源码,分类信息网站,分类信息网站程序,北京分类信息网站.分类信息网源码,分类信息网站源码,分类信息网源码,中国分类信息网源码,分类信息系统源码,asp分类信息源码,分类信息站源码,地区分类信息网源码,飞达分类信息网源码,信息港源码,信息网源码,信息发布源码,信息港源码下载,分类源码,信息发布网站源码,信息源码,信息港网站源码,asp信息港源码,信息类网站源码,多种分类源码,信息网源码下载,asp信息网源码,信息发布系统源码,物流信息源码,房产信息网源码.net源码,公安信息网源码,家教信息平台源码,农业信息网源码,浦东信息网源码,北京信息超市源码,本分类信网程序基于asp+mssql技术开发的分类信息程序,是经过多年的经验积累,完善设计、精心打造的适用于各种服务器环境的安全、稳定、快速、强大、高效、易用、优秀的网站建设解决方案。采用人性化的Windows操作方式开发,运行速度快,服务器资源占用更少;无论在稳定性、负载能力、安全等方面都有可靠的保证并赢得了广大用户的良好称赞。 备注:本程序是MSSQL的分类信息网站,供求信息网站系统mssql版合适建立大中小型分类信息门户网站使用 此版功能更强大,后台系统更管理方便,类别模块清晰,界面新颖,拿去就可以用,不需要太多的网络知识就可以轻松建立企业门户级分类信息网站,供求信息网站 是一个完善的分类信息发布网站系统,供求信息网站发布系统子模块,充分考虑了分类信息网站,供求信息网站管理系统的通用需求.全后台管理方式,后台功能齐全,使用维护方便.无论是大中小型公司,企业的网站管理人员只要会打字,就会建起一个专业的分类信息网站,供求信息网站系统,随时管理网站内容.折扣信息网站源码,供求源码,供求asp源码,供求网源码,网站源码,供求信息,网站源码下载,asp网站源码下载,供求信息网站,信息发布网站源码,分类信息网站源码,供求信息发布网站,信息港网站源码,信息类网站源码,折扣信息网站源码,供求源码,供求asp源码,供求网源码,源码下载,网站源码,供求信息,asp源码下载,分类信息网站源码,网站源码下载,分类信息源码,分类信息网源码,信息发布网站源码,信息港网站源码,中国分类信息网源码,信息类网站源码,分类信息系统源码,asp分类信息源码,分类信息站源码,地区分类信息网源码,此系统是基于asp+mssql技术开发的电子商务平台,运行安全,稳定,快速,全自动化、全智能的在线方式管理、维护、更新的分类信息网站,供求信息网站管理系统。提供下载的整站,程序源码,功能完全,欢迎大家下载使用.分类信息网站,供求信息网站管理系统功能将更加完全,真正的能为大家在建设分类信息网站,供求信息网站系统中带来安全,稳定,高效。本系统分分类信息网站,供求信息网站系统mssql版,分类信息网站,供求信息网站系统中文sql版,分类信息网站,供求信息网站系统全屏SQL版.同时提供有PHP+MYSQL开发的同城分类信息发布网站系统等十多套分类信息网商业版. ! 一个功能强大的分类信息(广告)系统,网软分类信息网正式版下载,分类信息网模板,分类信息网赶集网风格版下载分类信息网站系统源码分类网站模板,供求信息发布网站系统和信息发布网站程序,漂亮的分类信息网站模板.支持自定义分类信息类别和企业黄页分类功能。分类信息源码,分类信息网,源码,信息港网站源码,信息发布网站源码,供求信息网站源码,分类信息,分类信息网站代码,分类信息管理系统,整个网站风格简单明了,界面美观大方,提高网络推广效果,是国内互联网上不可多得的优秀程序。折扣信息网站源码,信息报送源码,信息网站模板,信息港网站模板,信息网站模板下载,分类信息模板,网站模板,网站模板下载,企业网站模板,个人网站模板,韩国网站模板,免费网站模板,学校网站模板,分类信息系统,分类信息发布系统,管理信息系统的分类,分类信息管理系统,同城分类信息系统,网站信息发布系统,信息系统的分类,管理信息系统网站,信息网站系统,asp分类信息系统,分类信息系统源码,分类信息网站,北京分类信息网站,分类信息网站程序,上海分类信息网站,分类信息网站源码,分类信息网站模板,上海的分类信息网站,地方分类信息网站,天津分类信息网站,杭州分类信息网站后台批量管理分类和企业信息。分类信息网站管理系统信息模块化处理,网站速度超快。我们的分类信息网站源码前台内容栏目结构清晰,易于访问者查看想要的内容,也是搜索引擎最喜欢的网页结构,相信很乐意光顾你用本系统搭建的站点。分类信息网站管理系统后台管理同样结构清晰,便于管理,提高效率。分类信息网站自助建站管理系统源码.美观的前台,强大的网站后台管理功能,自助管理前台相关栏目.分类信息网赶集网风格版下载分类信息网站系统源码分类网站模板,人机交互数据输入界面十分干净清爽,我们坚信这是一流的设计思想。所有信息内容在线完成编辑,就象WORD一样简单、可视而又功能完善,几乎能完成你想要的所有效果。简体,繁体使你专业建设的分类信息网站,最大范围被人了解,占得网络市场.分类信息网站排名,分类信息网站模板,分类信息网站发展,韩国分类信息网站,分类信息网站加盟,国外分类信息网站,分类信息网站赚钱,信息发布系统,信息发布管理系统,asp信息发布系统,企业信息发布系统,网站新闻发布系统,分类信息发布系统,网络信息发布系统,网站发布系统,新闻信息发布系统,信息发布系统下载,供求信息发布系统,个人信息发布系统,信息网站模板,信息港网站模板,分类信息网站模板,公司信息发布模板,信息网站模板下载,网站模板,网站模板下载,企业网站模板,供求网站模板,信息网站模板,信息港网站模板,分类信息网站模板,信息网站模板下载,供求信息网站,供求信息发布网站,网站模板,网站模板下载,企业网站模板,供求信息网站,信息发布网站源码,分类信息网站源码,供求信息发布网站,信息港网站源码,信息类网站源码,分类信息网站源代码.分类信息网站管理系统正式版源码有宣传,介绍,展示,推广,销售各分类信息的产品与服务,开展网上电子商务业务,实现分类信息的供求发布,营利,是整站系统设计功能的最终目标. 分类信息网赶集网风格版下载分类信息网站系统源码分类网站模板【基本功能特点】 1、支持分类信息类别和企业黄页类别和地区分类功能; 2、可按地区显示和查询信息,可以发展分站加盟; 3、整个网站风格简单明了,界面美观大方,提高网络推广效果; 4、企业黄页仿百度风格; 5、对每一个添加的信息进行审核管理; 6、对每一个加入的企业进行审核管理; 7、站内关键字分类查询功能; 8、本类推荐信息(显示在信息页面右侧滚动显示) 9、支持两种信息发布方式:游客快速发布和注册用户登陆后发布,后者具有可修改信息和自定义风格、字数多达1500等强大功能; 10、后台管理功能强大:分类信息/类别管理/会员管理/留言管理/企业管理/推荐企业/企业地区/修改密码; 11、后台可查看发布信息的来源IP和身份证地区查询; 12、发布信息时身份证号码验证,可有效避免无效信息; 13、互动性强:游客可以自由对信息发表留言,与发布者互动; 14、支持图片上传并可在页面中显示,增强广告效果; 15、增加了SQL防注入功能和数据库防下载功能。 16、系统安全管理(自动封注入者Ip功能,使注入者不能再访问本站) 分类信息网赶集网风格版下载分类信息网站系统源码分类网站模板功能介绍: 分类信息网站管理系统正式版源码功能介绍: 新闻管理 发布新闻,管理新闻 新闻类别 [批量生成新闻信息]
地方订餐外卖网站系统 2015 2016 最赚钱的项目,帮您打造本地商业门户,机遇不可错过。网上订餐系统_网络订餐系统_外卖网站建设.订餐网,外卖网源码,带积分商城,商家系统,外卖网站建设! 系统特点: 周密策划、项目为先 "项目指导技术,技术服从项目",这是我们一贯秉承的原则,也是我们与其他系统开发商、网站建设公司的本质区别所在!我们的每个系统作品都要经过周密的市场分析调查、可行性研究、项目策划,对我们来说项目的可行性高于一切! 功能专业、布局严谨 以项目方案为蓝本,以现有成功地方网站为局部参考,并充分结合地方性网站的特点与商业模式进行功能规划。系统以八大主要功能模块与诸多 实用辅助模块组成,专业、强大、实用、易用。在布局上科学严谨,给用户以完美影像! 顶尖设计、赏心悦目 深知“面子”在网站中举足轻重位置,本系统由多名资深网页设计师联合设计,所有页面均经过布局策划-页面与UI设计-美术设计三大环节,结构布局清晰、界面大气美观、干净整洁,并注重每个细节的用户体验。让您的网站在用户面前眼前一亮! 饿了么源码网络外卖订餐系统致力于帮助专业从事餐饮外卖企业或有外卖业务的餐饮企业快速部署外卖订餐系统,拓展网络外卖订餐业务。简洁大方的界面、精准的楼宇定位系统、强大的菜单管理系统,人性化的订单处理系统等等,不仅能够帮助您提升企业形象、还为您提供了一套完整的网络外卖解决方案,配合适当的宣传方式可以获得实实在在的销量和用户黏度的提升。 都来订网络外卖订餐系统区别于同类软件产品的独特性表现在: 1、 简洁大方的界面 简洁的界面,简便的操作,全面提升企业形象,带给您全新的体验。 2、 精准的楼宇定位系统 配送范围、配送价格、配送时间随需变化。 3、 强大的菜单管理系统 单品、套餐均适用,图片展示更直观。 4、 人性化的订单处理系统 订单提示、处理、打印、对账,一站式完成。 5、 快捷流畅的订餐流程 定位→选餐→下单→结算,保证订单准确无误。 6、 及时发布公告信息 将营业状态和促销信息第一时间发布到网站。 都来订网络外卖订餐系统V1.8.6更新内容简介: 1、提高首页点餐速度;

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧