当前位置: 首页 > 科技观察

终身求职ArrayList

时间:2023-03-18 19:08:52 科技观察

本文转载自微信公众号《粥下雪》,作者帅小凡凡。转载本文请联系粥夏雪公众号。最近,又到了适合交配的季节。这不,现在是跳槽的季节。我发现我忘记了很多以前看过的知识点。为此,我对过去做了一些思考,最后总结如下。问题的根源:不是不懂,而是想不起来。您一下子了解的内容可能还不够深入。对于这两种情况,解决方法并不难:每隔一段时间重温一下以前的事情,加深记忆。终生求职计划是一种终生求职的状态,让自己时刻保持面试准备。目前,这个行业越来越复杂。这种状态是非常必要的。我估计我会每两个月复习一次笔记,然后时不时的发文章。好了,我们继续说ArrayList。ArrayList参数和构造函数//存放数组元素的缓冲区transientObject[]elementData;//默认空数组元素privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};//默认初始化容量privatestaticfinalintDEFAULT_CAPACITY=10;//数组大小privateintsize;//记录被修改的次数protectedtransientintmodCount=0;//数组的最大值privatestaticfinalintMAX_ARRAY_SIZE=Integer.MAX_VALUE-8ArrayList底层使用数组实现构造函数的几种情况:空构造函数publicArrayList(){this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//空数组}带参数的构造函数publicArrayList(initialCapacity){if(initialCapacity>0){this.elementData=newObject[initialCapacity];//数组的大小就是参数的大小}elseif(initialCapacity==0){this.elementData=EMPTY_ELEMENTDATA;//空数组}else{thrownewIllegalArgumentException("IllegalCapacity:"+initialCapacity);}}集合到ArraylistpublicArrayList(Collectionc){elementData=c.toArray();if((size=elementData.length)!=0){//c.toArray可能(错误地)不returnObject[](see6260652)if(elementData.getClass()!=Object[].class)elementData=Arrays.copyOf(elementData,size,Object[].class);}else{//replacewithemptyarray.this.elementData=EMPTY_ELEMENTDATA;}}如果参数集合编号不为0,则直接转为Arraylist,但使用system.copy202112消息:ArrayList构造函数,除非赋值,初始化后内部数组为空数组,添加元素时发生第一次扩展。ArrayList添加元素并扩展,而且这个拷贝过程比较耗性能,所以建议在初始化的时候预估一个容量。202112消息:使用无参构造函数创建ArrayList后,第一次扩容为10,后续扩容为1.5倍。底层调用System.arraycopy,这个复制过程比较消耗性能,所以建议预先设置Estimateacapacity的大小。ArrayList删除元素ArrayList提供了两种删除元素的方式,可以通过index和element来删除。两次删除是相似的。删除一个元素后,后面的元素一次一个地向前移动。ArrayList.remove(intindex)源代码:publicEremove(intindex){rangeCheck(index);modCount++;EoldValue=elementData(index);intnumMoved=size-index-1;if(numMoved>0)System.arraycopy(elementData,index+1,elementData,index,numMoved);elementData[--size]=null;//cleartoletGCdoitsworkreturnoldValue;}删除元素时,会先判断索引是否大于ArrayList的大小,如果索引范围正确,然后对索引位置的下一个元素给索引位置赋值,将ArrayList的大小减-1,最后返回移除的元素。您还可以在此处查看modCount++。前面说了,是为了并发处理。不允许其他线程同时进行修改,同时不允许自己的线程同时遍历修改。元素数据[--大小]=空;可以看到,最后一个值是空的,方便GC。202112备注:删除后,底层调用还是System.arraycopy,这个复制过程很耗性能,所以说频繁增删改用ArrayList不要用。ArrayList遍历@OverridepublicvoidforEach(Consumeraction){Objects.requireNonNull(action);//预设一个expectedModCount值finalintexpectedModCount=modCount;@SuppressWarnings("unchecked")finalE[]elementData=(E[])this.elementData;finalintsize=this.size;//在遍历过程中取出来判断for(inti=0;modCount==expectedModCount&&i