书籍是最好的营养品
经过对Arraylist和Linkedlist底层实现的详细介绍,读者应该对Arraylist和
Linkedlist之间的优劣有了一个大致的印象。 就笔者的经验来说,Arraylist的性能总体上优于Linkedlist
当程序需要以geim idex)方法获取List集合指定索引处的元素时,Arraylist性能大地优于Linkedlist因为AmayList底层以数组来保存集合元素,所以调用get( index)方法获取指定索引处的元素时,底层实际上是调用leleDalindexj来返回该元素,因此性能非常好。而LinkedList则必须逐个地搜索。
当程序调用adad index, Objeet ob)j向List集合中添加元素时,ArayList必须对底层数组元素进行“整体搬家”。如果添加元素导致集合长度超过底层数组长度,Arraylist必须创建一个长度为原来长度1.5倍的数组,再由垃圾回收机制回收原有数组,因此系统开销比较大。对于LinkedList而言,它的主要开销集中在entry(int index)方法上,该方法必须逐个地搜索,直到找到index处的元素,然后在该元素之前插入新元素。即使如此,执行该方法时LinkedList
方法的性能依然高于ArrayList。
当程序调用remove(int index)方法删除index索引处的元素时,ArrayList 同样也需要对底层数组元素进行“ 整体搬家”。但调用remove(int index)方法删除集合元素时,ArrayList 无须考虑创建新数组,因此执行ArrayList的remove(int index)方法比执行add(int index,Object obj)方法略快一点。 当LinkedList调用remove(int index)方法删除集合元素时,与调用add(int index,Object obj)方法添加元素的系统开销几乎完全相同。
当程序调用add(Object obj)方法向List 集合尾端添加一个 元素时,大部分时候ArrayList无须对底层数组元素进行“整体搬家”,因此也可以获得很好的性能(甚至比LinkedList 的add(Object obj)方法的性能更好);但如果添加这个元素导致集合长度超过底层数组长度,那么ArrayList必须创建-个长度为原来长度1.5 倍的数组,再由垃圾回收机制回收原有数组一这样系统开销就比较大了。但LinkedList调用add(Object obj方法添加元素时总可以获得较好的性能。
当程序把LinkedList当成双端队列、栈使用,调用addFirst(E e)、addLast(E e)、getFirst(E e)、getlast(E e)、fr(E e)、ofefFirt(ti oferLast等方法来操作集合元素时,LinkedLit可以快速地定位需要操作的元素,因此LinkedList总是具有较好的性能表现。
上面分析了Arraylist、LinkedList 各自的适用场景。大部分情况下,ArrayList 的性能总是优于Linkedlist,因此绝大部分都应该考虑使用ArrayList 集合。但如果程序经常需要添加、删除元素,尤其是经常需要调用add(E e)方法向集合中添加元素,则应该考虑使用LinkedList集合。
package 蓝桥杯;
import java.util.ArrayList;
public class Other_使用ArrayList创建二维数组 {
public static void main(String[] args) {
ArrayList[] arrayLists=new ArrayList[5];//定义5行
for(int i=0;i<5;i++) {
arrayLists[i]=new ArrayList<Integer>();//初始化
}
int num=0;
for(int i=0;i<5;i++) {
for(int j=0;j<10;j++) {
arrayLists[i].add(num++);//赋值
}
}
//输出
for(int i=0;i<5;i++) {
for(int j=0;j<10;j++) {
System.out.print(arrayLists[i].get(j)+" ");
}
System.out.println();
}
}
}
输出显示: