首页 > 编程知识 正文

with的复合结构用法例句加分析,arraylist实现了哪些接口

时间:2023-05-04 23:14:07 阅读:131455 作者:2277

ArrayList和LinkedList是用于存储Java集合框架中的对象引用列表的两个类。 ArrayList和LinkedList都实现了列表接口。

列表(list )是元素的有序集合,也称为数组。 提供基于元素位置的操作,以快速访问、添加和删除列表中特定索引位置的元素。 List接口将Collection和Iterable作为父接口实现。 存储重复值和空值,支持从索引访问元素。

)1)在列表末尾添加元素

在ArrayList中,用于在队列末尾添加元素的代码如下:

公共布尔型(e )增强容量) size1; //在内部数组中输入elementData[size ]=e; //在数组末尾添加元素,完成返回真的添加; 只要ArrayList的当前容量足够大,就表明add ()的操作效率非常高。 仅当ArrayList需要超过当前数组大小的容量时,才需要扩展容量。 在扩展过程中,会进行大量的数组复制操作。 复制数组时,最终调用System.arraycopy ()方法。

LinkedList中的add ) )操作实现如下,在队列末尾添加任意元素:

公共布尔型(e ) addbefore ) e,header; 将元素添加到header前面的返回真中; LinkeList使用链表的结构,因此不需要保持容量大小,比ArrayList在性能上更有优势。 但是,每当元素增加时,都必须创建新的Entry对象并执行赋值操作,频繁的系统调用会影响性能。

)2)在列表的任意位置添加元素

由于实现差异,ArrayList是基于数组实现的,但数组是连续的内存空间,因此在数组的任意位置插入元素必然需要对该位置的所有元素进行排序,从而降低效率。

公共语音添加(索引,e元素) if )索引| |索引0 thrownewindexoutofboundsexception (索引3360 '索引' ensux ) system.arraycopy (元素数据,索引,元素数据,索引1,大小索引); element data [索引]=element; size; 在LinkeList中,在List末尾插入数据就像在任意位置插入数据一样,不会因为插入位置在前面而降低性能。

公共语音添加(intindex,E E element )添加基础)元素,(index==size? header :条目(索引); (3)删除任意位置的要素

对ArrayList来说,remove (方法和add )方法是相同的,要在任意位置删除元素后重新组织数组,可以按如下方式实现ArrayList :

公共移除(索引)范围检查(索引); 模具计数; eoldvalue=(e ) element data [索引]; int numMoved=size-index-1; if(numMoved0) system.arraycopy (元素数据,索引1,元素数据,索引,nummoved ); 元素数据[-- size ]=null; 返回载荷值; }每当ArrayList执行有效的元素删除操作时,都会重新组织数组。 另外,删除位置越靠前,排列重组时的开销越大。

公共移除(索引)返回移除(条目)索引); }保密(索引) if )索引0|| |索引=大小) thrownewindexoutboundsexception (索引: '索引',endex if(index(size1) )//要删除的要素为前半部分的for(intI=0; I=索引; I ) e=e.next; }else{for(intI=size; 索引; I----e=e.previous; }返回e; 在LinkedList实现中,首先在循环中找到要删除的元素。 如果要删除的位置在List的前半部分,请走后再找; 其位置在后面时

半段,则从后往前找。因此无论要删除较为靠前或者靠后的元素都是非常高效的;但要移除List中间的元素却几乎要遍历完半个List,在List拥有大量元素的情况下,效率很低。
(4)容量参数
容量参数是ArrayList和Vector等基于数组的List的特有性能参数。它表示初始化的数组大小。当ArrayList所存储的元素数量超过其已有大小时。它便会进行扩容,数组的扩容会导致整个数组进行一次内存复制。因此合理的数组大小有助于减少数组扩容的次数,从而提高系统性能。

public ArrayList(){ this(10); }public ArrayList (int initialCapacity){ super(); if(initialCapacity<0) throw new IllegalArgumentException("Illegal Capacity:"+initialCapacity) this.elementData=new Object[initialCapacity];}

现以构造一个拥有100万元素的List为例,当使用默认初始化大小时,其消耗的相对时间为125ms左右,当直接制定数组大小为100万时,构造相同的ArrayList仅相对耗时16ms。
(5)遍历列表
1.forEach操作
2.迭代器
3.for循环

String tmp;long start=System.currentTimeMills(); //ForEach for(String s:list){ tmp=s;}System.out.println("foreach spend:"+(System.currentTimeMills()-start));start = System.currentTimeMills();for(Iterator<String> it=list.iterator();it.hasNext();){ tmp=it.next();}System.out.println("Iterator spend;"+(System.currentTimeMills()-start));start=System.currentTimeMills();int size=;list.size();for(int i=0;i<size;i++){ tmp=list.get(i);}System.out.println("for spend;"+(System.currentTimeMills()-start));

构造一个拥有100万数据的ArrayList和等价的LinkedList,使用以上代码进行测试,最简便的foreach循环并没有很好的性能表现,综合性能不如普通的迭代器,ArrayList使用for循环通过随机访问遍历列表时性能最好。应避免LinkedList使用for循环,因为对LinkedList进行随机访问时,总会进行一次列表的遍历操作,性能非常差。
(6)总结
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。
对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;
而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。

当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会有更好的性能;当操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。