专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

送分题,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,虽然线程不安全、增删效率低,但是查询效率高啊。

大便干燥肠道不通?送你一个中成药,润肠通便,搞定便秘今天我们来聊一聊这个便秘,通俗来讲就是肠道被堵住了,身体里面代谢出来的废弃物堵在肠道里排不出来,那你想想该多糟心啊。今天贾医生来跟大家分享一个中成药,可以润肠通便,帮你彻底解决便秘北交所开市以来上市公司公开发行融资平均2。07亿元新京报贝壳财经讯(记者黄鑫宇)11月12日,记者从北交所获悉,自2021年11月15日,北交所正式揭牌开市以来,北交所的发行融资灵活多元提供普通股优先股可转债等多种权益融资工具,实刘强东转让京东购物网站运营公司股份苏宁收购家乐福中国剩余股份产生争议知消周刊文小汀本周焦点阿迪达斯将销售基于Yeezy设计的鞋履刘强东转让京东网站运营方股份苏宁收购家乐福中国剩余股份产生争议Champion关闭北京三里屯旗舰店Gap入驻亚马逊Zara让英国乡镇名片你好,我是临夏市南龙镇!立足城市发展空间布局打造产城景融合发展活力乡镇南龙镇在临夏市一心一区两廊五园多点的发展空间布局中占据着重要地位,整体布局中一廊南龙凤凰山景区廊道,一园南龙休闲静谧园林化的凤凰山主题游乐园以及一点地质公园等,均在南龙镇辖区内,对常州淹城春秋乐园游记从小就知道家乡常州有一个谜一样的古迹叫淹城,因为当时住得离淹城不远,我经常带着弟弟妹妹到那里去玩,在河里钓过鱼,在土墩上捉过蟋蟀。上世纪八十年代,淹城建成了公园并被列为全国重点文物空砍21114!威少全队第一啊,果然错怪老詹,湖人不该梭哈浓眉今天国王以120114战胜湖人,勒布朗詹姆斯休战,赛前所有球迷都在期待湖人赢球。因为这样可以让詹姆斯尴尬,但那些球迷失望了。湖人现在的局势就不是一个人的锅,而是全队已经烂到根了。只单局被轰114被打爆!伊藤美诚我没有做好准备11月12日,国乒打全锦赛的同时,隔壁的日乒也在打比赛全农杯,奥运冠军伊藤美诚被爆了大冷,04惨败在平野美宇的拍下,这结果与伊藤的战力,严重不符。伊藤美诚是日本队王牌球星,是当今乒CBA三消息新疆四外援全留队,刘雁宇彻底恢复,莫兰德无法参赛大家好呀,我是北柠,各位小伙伴们要养成先看后赞的习惯哦!新疆队这个赛季一口气签下了四名外援,他们分别是小外援杰克逊克莱蒙斯和大外援摩尔特里法尔,这四名外援每一个人的特点都不一样,从三大顶流代言人,都上手哪些表款?腕表之家时髦星腕如今有越来越多的品牌聘请流量明星代言。一方面顶流明星可以让腕表快速出圈,对拓宽市场有着积极作用。但另一方面伴随而来的也有不少争议,如部分表友认为腕表需要的是成熟稳重拥有一抓一大把的Q版香水是一种怎样的体验?(微缩控看过来哦)先介绍一下什么是Q香Q香一般指的就是按正装等比例缩小的小瓶香水我一直很喜欢小小的香水,一抓一大把的快乐虽然也会买大的正装,但就是喜欢小小的东西这里分享一下我的小收藏哈有什么问题,可跨界融合将成为未来发展趋势跨界,是指从某一属性的事物,进入另一属性的运作。主体不变,事物属性归类变化。进入互联网经济时代,跨界更加明显广泛。特别在跨界营销方面,各个独立的行业主体,不断融合渗透,也创造出很多
广州地区规模最大的房车营地是个驻马店人搞的,竟用铁锅泡澡陈峰是驻马店人,他个子不高,皮肤略黑,相貌憨厚老实,典型的中原人长相。他做旅游十数年,经营过不少成功的项目,比如佛山亚拉巴海南沙百万葵园葵花鸡但是他现在最愿意和别人谈起的,还是他在IDCampampamp蚂蚁集团数字化时代的风险博弈十大风控技术趋势指南过去3年,疫情给我们的生活带来了许多颠覆性变化。当今的商业模式已不同于往昔,随着数字化进程的进一步加快,金融机构必须要时刻为可能出现的业务风险做好准备。这也正是IDC金融洞察白皮书俄最强坦克换装,乌军在卢甘斯克失利,泽连斯基赖武器不给力转眼间已经进入2023年,俄乌冲突打了十一个月,局势仍然十分紧张。这场拉锯战似乎很难停下来,俄军在积极地对武器进行改装,乌军则是四处求援寻求更多的武器支持。俄T90坦克雪地驰骋,防公孙瓒麾下三名大将曹操刘备各得其一,而最后那个人却无人能降说起三国你首先想到的是什么?是头戴纶巾,手持羽扇,神机妙算的诸葛亮是老谋深算,过人胆识,生性多疑的曹操是谦恭待人,善用人才,宅心仁厚的刘备是嫉恶如仇,重情重义,武力过人的张飞。大浪充1次用10天!史上续航最强的国产手机,太猛了在开始今天的文章之前,懂哥先做一个小调查。现在小伙伴们选择入手新手机的话,最看重的是手机的哪一方面嗷?是强劲的硬件满血的性能释放感知很强的快充技术,还是让人安心的续航?就我的观察来从零开始教你舒服的使用RedisTemplate操作Redis数据SpringBoot快速操作Redis数据在SpringBoot框架中提供了springbootstarterdataredis的依赖组件进行操作Redis服务,当引入了该组件之后日本网红小哥化妆如换头,从头牌牛郎摇身一变成实业家日本的化妆技术一直以来都经常能给人带来惊喜,凭借化妆技术收获大量粉丝的网红也有不少。但是化妆之后就好像是换了个人,而且还能把这种化妆技术当做职业的可就不太多了。有一名名为星野飒()一路与飒结缘的张天爱娱乐圈考古记张天爱红秀GRAZIA新刊封面人物,梳起别致犄角油头,别有一番风味。明媚色彩时装搭配,立刻化身摩登时髦的复古女郎。不得不说属实是嘎嘎酷,嘎嘎美,嘎嘎飒这是各种风格都拿捏问君几多愁问君几多愁万缕千思花开花落无声辗转几春秋问君几多愁夜色迷离良辰虚设清风绕指柔几何殇梦萦绕心头锁他朝不复情何以悯天有多长地有多久思念之情最是愁人境彼岸花开时欲采之消失不见不敌三千弱水微信诗聊我把刚刚发表的巜感恩相遇发给了她当年你错过了我我错过了你我们擦肩而去如今你遇上了我我遇上了你感谢天赐良机我们虽非人生伴侣却是人间知己爱深深情依依她微信回复浪漫诗人浪漫情怀,真有你的十二豪礼礼遇新春!广汽三菱携新车全新欧蓝德L200拜新年,兔年福利发不停!记者从广汽三菱获悉,为庆祝新春到来,并答谢往年一直支持品牌的消费者,广汽三菱特携两款重磅新车全新欧蓝德L200推出福气满满的新春送礼活动。其中,选购三菱巅峰款全新欧蓝德的用户可享受
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网