游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

送分题,ArrayList的扩容机制了解吗?

  1。ArrayList了解过吗?它是啥?有啥用?
  众所周知,Java集合框架拥有两大接口Collection和Map,其中,Collection麾下三生子List、Set和Queue。ArrayList就实现了List接口,其实就是一个数组列表,不过作为Java的集合框架,它只能存储对象引用类型,也就是说当我们需要装载的数据是诸如int、float等基本数据类型的时候,必须把它们转换成对应的包装类。
  ArrayList的底层实现是一个Object数组:
  既然它是基于数组实现的,数组在内存空间中是连续分配的,那必然查询速率非常快,不过当然也肯定逃不过增删效率低的缺陷。
  另外,和ArrayList一样同样实现了List接口的、我们比较常用的还有LinkedList。LinkedList比较特殊,它不仅实现了List接口,还实现了Queue接口,所以你可以看见LinkedList经常被当作队列使用:QueueIntegerqueuenewLinkedList();
  LinkedList人如其名,它的底层自然是基于链表的,而且还是个双向链表。链表的特性和数组正好是反的,由于没有索引,所以查询效率低,但是增删速度快。
  2。ArrayList如何指定底层数组大小的?
  OK,首先,既然咱真正存储数据的地方是数组,那我们初始化ArrayList的时候自然要给数组分配一个大小,开辟一个内存空间。我们先来看看ArrayList的无参构造函数:
  可以看到,它为底层的Object数组也就是elementData赋值了一个默认的空数组DEFAULTCAPACITYEMPTYELEMENTDATA。也就是说,使用无参构造函数初始化ArrayList后,它当时的数组容量为0。
  这给咱初始化一个容量为0的数组有啥用?啥也存不了啊?别急,如果使用了无参构造函数来初始化ArrayList,只有当我们真正对数据进行添加操作add时,才会给数组分配一个默认的初始容量DEFAULTCAPACITY10。看下图:
  说完了无参构造,ArrayList的有参构造函数就是中规中矩了,按照用户传入的大小开辟数组空间:
  3。数组的大小一旦被规定就无法改变,那ArrayList是怎么对底层数组进行扩容的?
  ArrayList的底层实现是Object数组,我们知道,数组的大小一旦被规定就无法改变。那如果我们不断的往里面添加数据的话,ArrayList是如何进行扩容的呢?或者说ArrayList是如何实现存放任意数量对象的呢?
  OK,扩容发生在啥时候?那肯定是我们往数组中新加入一个元素但是发现数组满了的时候。没错,我们去add方法中看看ArrayList是怎么做扩容的:
  ensureExplicitCapacity判断是否需要进行扩容,很显然,grow方法是扩容的关键:
  说实话,别的都不用看了,看上面图中的黄色框框就知道ArrayList是怎么扩容的了:扩容后的数组长度当前数组长度当前数组长度2。最后使用Arrays。copyOf方法直接把原数组中的数组copy过来,需要注意的是,Arrays。copyOf方法会创建一个新数组然后再进行拷贝。
  举个例子画个图来演示一下:
  4。既然扩容发生在添加数据的时候,讲讲ArrayList具体是怎么添加数据的
  OK,add方法我们刚刚讲了一半,添加数据前会先判断一下是否需要扩容,真正的添加数据的操作在下半部分:
  先讲下add(intindex,Eelement)这个方法的含义,就是在指定索引index处插入元素element。比如说ArrayList。add(0,3),意思就是在头部插入元素3。
  再来看看add方法的核心System。arraycopy,这个方法有5个参数:elementData:源数组index:从源数组中的哪个位置开始复制elementData:目标数组index1:复制到目标数组中的哪个位置sizeindex:要复制的源数组中数组元素的数量
  解释一下上面代码中arraycopy的意思,举个例子,我们想要在index5的位置插入元素,首先,我们会复制一遍源数组elementData(这里我们称复制的数组为新数组吧),然后把源数组中从index5的位置开始到数组末尾的元素,放到新数组的index16的位置上:
  于是,这就给我们要新增的元素腾出了位置,然后在新数组index5的位置放入元素element就完成了添加的操作:
  显然,不用多说,ArrayList的将数据插入到指定位置的操作性能非常低下,因为要开辟新数组复制元素啊,要是涉及到扩容那就更慢了。
  另外,ArrayList还内置了一个直接在末尾添加元素的add方法,不用复制数组,直接size就好,这个方法应该是我们最常使用的:
  5。ArrayList又是如何删除数据的呢?
  CtrlF找到remove方法,就这?和添加一个道理,也是复制数组
  举个例子,假设我们要删除数组的index5的元素,首先,我们会复制一遍源数组,然后把源数组中从index16的位置开始到数组末尾的元素,放到新数组的index5的位置上:
  也就是说index5的元素直接被覆盖掉了,给了你被删除的感觉。同样的,它的效率自然也是十分低下的6。ArrayList是线程安全的吗?不安全的表现
  ArrayList和LinkedList都不是线程安全的,我们以在末尾添加元素的add方法为例,来看看ArrayList线程不安全的表现是啥:
  黄色框里的并不是一个原子操作,它由两步操作构成:elementData〔size〕e;sizesize1;
  在单线程执行这两条代码时,那当然没有任何问题,但是当多线程环境下执行时,可能就会发生一个线程添加的值覆盖另一个线程添加的值。举个例子:假设size0,我们要往这个数组的末尾添加元素线程A开始添加一个元素,值为A。此时它执行第一条操作,将A放在了数组elementData下标为0的位置上接着线程B刚好也要开始添加一个值为B的元素,且走到了第一步操作。此时线程B获取到的size值依然为0,于是它将B也放在了elementData下标为0的位置上线程A开始增加size的值,size1线程B开始增加size的值,size2
  这样,线程A、B都执行完毕后,理想的情况应该是size2,elementData〔0〕A,elementData〔1〕B。而实际情况变成了size2,elementData〔0〕B(线程B覆盖了线程A的操作),下标1的位置上什么都没有。并且后续除非我们使用set方法修改下标为1的值,否则这个位置上将一直为null,因为在末尾添加元素时将会从size2的位置上开始。
  上段代码验证下:
  结果和我们分析的一样:
  ArrayList的线程安全版本是Vector,它的实现很简单,就是把所有的方法统统加上synchronized:
  既然它需要额外的开销来维持同步锁,所以理论上来说它要比ArrayList要慢。7。为什么线程不安全还要用它呢?
  因为在大多数场景中,查询的情况居多,不会涉及太频繁的增删。那如果真的涉及频繁的增删,可以使用LinkedList,底层链表实现,为增删而生。而如果你非得保证线程安全那就使用Vector。当然实际开发中使用最多的还是ArrayList,虽然线程不安全、增删效率低,但是查询效率高啊。

支付宝微信可以信用卡取现了,目前支持这三家银行华夏时报(www。chinatimes。net。cn)记者傅碧霄北京报道近日,有用户发现,支付宝和微信新上线了信用卡取现功能,用户可以在这些平台上从自己的信用卡额度里支取……脾胃受伤五脏遭殃!调养脾胃3个要点需谨记脾胃受伤五脏都遭殃脾胃出了问题,很可能连累五脏。中医里有一句话,养脾胃就是养元气,养元气就是养生命,脾胃健康是决定人寿命长短的重要因素。心与脾就像一对母子,心脏病要……疯狂增肌!狂练中距离!新苦练兄弟来了,2亿没白花之前杜兰特宣布留守篮网的时候,贝弗利就曾经怒喷过阿杜这样的超级巨星们扰乱了自由市场,耽误了很多球员的签约和交易,甚至导致他们失业。今天湖人官宣用塔克和斯坦利约翰逊换回贝弗……最高空置率达70,购物中心快玩不下去了?出品联商专栏撰文方湖购物中心是城市化达到一定高度的产物,代表一个城市经济及商业化发展水平。近年来,得益于人口和城市扩容,购物中心快速发展。据联商网零售研究中心……百名经济学家信心调查下半年经济将恢复向好经济学家认为当前中国经济偏冷,但预期未来半年经济恢复向好文中国统计信息服务中心经济学家调查研究小组编辑许瑶国家统计局中国统计信息服务中心2022年6月开展的二……明晚开播!吴倩的都市大戏终于来了,还有2位演技派助力,值得追这个夏天鹅厂大戏一部接着一部,古装大戏从《梦华录》到《星汉灿烂》着实吸人眼球,悬疑剧从《对决》到《通天塔》质量也不错,虽然都是网播,但口碑的确不错。不得不说,鹅厂剧集上新……全国优秀企业家公示,山东这些企业家上榜近日,中国企业家联合会、中国企业家协会网站发布《20212022年度全国优秀企业家公示》。经全国优秀企业家评选评审委员会会议评议,并通过无记名投票,全国优秀企业家评选办公室确定……走进故宫何为紫禁城打开眼界紫禁城全貌紫禁城是至今为止保存完整,也是中国现存规模最大的木结构建筑群。明代的十四个皇帝和清代的十个皇帝,即491年中先后在这里发号施令。首先,为什么叫紫禁……千亩鲜食玉米上市,平谷胡家务把玉米玩出花原标题:千亩鲜食玉米上市,平谷胡家务把玉米玩出花8月6日,北京平谷兴谷街道中胡家务村首次开启鲜食玉米尝鲜季。除了香甜软糯、晶莹剔透的玉米,还能体验玉米迷宫,观赏匠人手作。……用户量最高的20款APP你装过几款?日前,QuestMobile发布App用户规模亿级玩家榜单,微信、手机淘宝、高德地图、WiFi万能钥匙等成为国内用户数量最多的Top20应用。榜单信息显示,这些App的月度活跃……早上空腹不能喝水?医生空腹真正要少碰的是这3类食物哎呀,你怎么一大早不吃东西就喝水呀!空腹喝水对身体不好的。一早上王姨看到老伴刚起来就喝上一杯凉白开,忍不住提醒了几句。你哪里听来的呀,我倒是看网上说早上起来一杯水对……王鹤棣杨紫吴磊成毅等主演的6部大热剧,你最期待哪部?随着由王鹤棣、虞书欣主演的《苍兰诀》收官,由吴磊、赵露思主演的《月升沧海》即将收官和由杨紫、成毅主演的《沉香重华》准备收官,引发了全网热议。有的网友仍在回味剧中男主女主的甜蜜片……
熬夜有眼袋怎么缓解熬夜有眼袋能去掉吗我们大家很多人都知道熬夜是会对我们的身体造成很大的影响的,首先我们大家都知道的是熬夜会有黑眼圈和眼袋,那么熬夜有眼袋怎么缓解?熬夜有眼袋能去掉吗?熬夜有眼袋怎么缓解可以通……熬夜头疼怎么缓解熬夜头疼是什么原因我们大家很多人都知道,熬夜对我们的身体伤害是非常大的,会导致我们的身体出现很多的症状,还有些人会出现头疼的现象,那么熬夜头疼怎么缓解?熬夜头疼是什么原因?熬夜头疼怎么缓解……熬夜会长痘痘吗熬夜长痘痘怎么消除熬夜是我们大家现在都非常熟悉的,很多人都有熬夜的习惯,而同时我们也都知道熬夜的危害是非常多的,因此我们便来了解一下熬夜会长痘痘吗?熬夜长痘痘怎么消除?熬夜会长痘痘吗熬夜会……熬夜对身体的危害有哪些经常熬夜会得什么病熬夜是现在很多年轻人都会做的一件事情,因为经常熬夜慢慢就会养成熬夜的习惯,但是熬夜是会对我们的身体造成很多危害的,那么熬夜对身体的危害有哪些?经常熬夜会得什么病?熬夜对身体的危……保护肺部的有效方法?5招守护肺部健康关心身边女性健康,让她们远离癌症困扰,肺癌早起是没有症状的,经常被忽略掉,可是检查出来的时候却已经是晚期了,守护肺部健康是有方法的,让我们一起来看看专家说的远离癌症招式吧。……茂名2家企业上榜2022广东企业500强日前,广东省企业联合会、广东省企业家协会发布2022广东企业500强榜单,该榜单以企业营业收入作为排序依据。其中,茂名有2家企业上榜,分别是广东新华粤石化集团股份公司和茂名石化……牡蛎片有副作用吗吃牡蛎片有依赖性吗牡蛎片作为一种保健性药品,吃多了之后肯定是有一定的副作用的,毕竟任何东西都不能吃多,大家在吃牡蛎片的时候一定要按照疗程来,不要盲目服用。牡蛎片有副作用吗有。牡蛎片是……绝了!女排世锦赛曝出争议猛料,中国女排遭质疑,球迷吐槽声一片北京时间10月15日,女排世锦赛传来争议消息,据国内媒体《新浪体育》报道,巴西女排副攻卡罗尔在本次赛事中发挥出色,她拦网总得分达到57分,而这样的情况也引来了很多球迷的关注和讨……牡蛎片的功效与作用牡蛎精华片有什么作用牡蛎精华片是用牡蛎提炼出来的一种药品,可以滋阴补肾,对于性能力的提升有很大的帮助,是很多男性朋友的加油站,下面一起来看看吃牡蛎精华片的好处吧。牡蛎片的功效1。有效改善男性……10句ampampquot句句不提爱,却句句都是爱ampam1。你是撩人的春酒我是泛香的丹蔻2。穿过这风声你同日色一样让人沉醉3。走多少路咽多少泪摔碎酒壶至此不见而后朋友提及你我已是良人陌路4。来生你……止痛药对身体有害吗?止痛药对身体有哪些害处止痛药是不得已才会用的,很多人都非常担心止痛药对身体有害,下面5号网的小编为你们介绍止痛药对身体有害吗?止痛药对身体有哪些害处?止痛药对身体有害吗滥用的危害人们常常……I茅台数字身份证领不了,巽风活动体验感太差i茅台这次是真的差,搞了个巽风活动平白无故还需要如外再下载一个app,不知为啥原因,增加了活动参与难度。参与规则也是一大串文字,都得细致读几遍还不是很明白怎样参与的。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网