阅读本文大概需要 7 分钟。
来自:网络
列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。
增加元素到列表尾端:
public boolean add(E e){
ensureCapacity(size+
1);
//确保内部数组有足够的空间
elementData[size++]=e;
//将元素加入到数组的末尾,完成添加
return
true;
}
public vod ensureCapacity(int minCapacity){
modCount++;
int oldCapacity=elementData.length;
if(minCapacity>oldCapacity){
//如果数组容量不足,进行扩容
Object[] oldData=elementData;
int newCapacity=(oldCapacity*
3)/
2+
1;
//扩容到原始容量的1.5倍
if(newCapacitty<minCapacity)
//如果新容量小于最小需要的容量,则使用最小
//需要的容量大小
newCapacity=minCapacity ;
//进行扩容的数组复制
elementData=Arrays.copyof(elementData,newCapacity);
}
}
public boolean add(E e){
addBefore(e,header);
//将元素增加到header的前面
return
true;
}
private Entry<E> addBefore(E e,Entry<E> entry){
Entry<E> newEntry =
new Entry<E>(e,entry,entry.previous);
newEntry.provious.next=newEntry;
newEntry.next.previous=newEntry;
size++;
modCount++;
return newEntry;
}
增加元素到列表任意位置
void add(int index,E element);
public void add(
int
index,E element){
if(
index>size||
index<
0)
throw new IndexOutOfBoundsException(
"Index:"+
index+
",size: "+size);
ensureCapacity(size+
1);
System.arraycopy(elementData,
index,elementData,
index+
1,size-
index);
elementData[
index] = element;
size++;
}
public void add(int index,E element){
addBefore(element,(index==size?header:entry(index)));
}
删除任意位置元素
public E remove(int index);
public E remove(
int
index){
RangeCheck(
index);
modCount++;
E oldValue=(E) elementData[
index];
int numMoved=size-
index-
1;
if(numMoved>
0)
System.arraycopy(elementData,
index+
1,elementData,
index,numMoved);
elementData[--size]=null;
return oldValue;
}
public E remove(
int
index){
return remove(entry(
index));
}
private Entry<E> entry(
int
index){
if(
index<
0 ||
index>=size)
throw new IndexOutBoundsException(
"Index:"+
index+
",size:"+size);
Entry<E> e= header;
if(
index<(size>>
1)){
//要删除的元素位于前半段
for(
int i=
0;i<=
index;i++)
e=e.next;
}
else{
for(
int i=size;i>
index;i--)
e=e.previous;
}
return e;
}
容量参数
public ArrayList(){
this(
10);
}
public ArrayList (int initialCapacity){
super();
if(initialCapacity<
0)
throw
new IllegalArgumentException(
"Illegal Capacity:"+initialCapacity)
this.elementData=
new Object[initialCapacity];
}
public ArrayList(int initialCapacity)
遍历列表
forEach操作
迭代器
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));
总结
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。 对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配; 而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
本文分享自微信公众号 - 浪尖聊大数据(bigdatatip)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4590259/blog/4662558