【数据结构与算法分析-java】之ArrayList与LinkedList的差别

【数据结构与算法分析-java】之ArrayList与LinkedList的区别

List ADT有两种流行的实现方式。

1.ArrayList类提供了List ADT的一种可增长数组的实现。使用ArrayList的有点在于,对get和set的调用花费常数时间。其缺点是新项的插入和现有项的删除代价昂贵,除非变动是在ArrayList的末端是在ArrayList的末端运行。

2.LinkedList类则提供了List ADT的双链表实现。使用LinkedList的优点在于,新项的插入和现有项的删除均开销很小,这里假设变动项的位置是已知的。

解释下数组类型和双链表的区别

a.数组

【数据结构与算法分析-java】之ArrayList与LinkedList的差别

b.双链表

【数据结构与算法分析-java】之ArrayList与LinkedList的差别

import java.util.* ;
public class ListDemo01{
	public static void main(String args[]){
		List<Integer> li = new LinkedList<Integer>() ;
		long startTime = System.currentTimeMillis() ;
		for(int i=0;i<1000000;i++){
			li.add(0,i) ;               //print : 803
			//li.add(i) ;				//print : 790
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println(endTime-startTime) ;
	}
}

下面的代码得不出结果速度太慢

import java.util.* ;
public class ListDemo01{
	public static void main(String args[]){
		List<Integer> li = new LinkedList<Integer>() ;
		for(int i=0;i<1000000;i++){
			li.add(0,i) ;               //print : 803
			//li.add(i) ;				//print : 790
		}
		long startTime = System.currentTimeMillis() ;
		for(int i=0;i<1000000;i++){
			li.get(i) ;
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println(endTime-startTime) ;
	}
}
下面化成ArrayList速度就超快

import java.util.* ;
public class ListDemo01{
	public static void main(String args[]){
		List<Integer> li = new ArrayList<Integer>() ;
		for(int i=0;i<1000000;i++){
			li.add(i) ;				
		}
		long startTime = System.currentTimeMillis() ;
		for(int i=0;i<1000000;i++){
			li.get(i) ;      //print : 15        
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println(endTime-startTime) ;
	}
}
remove方法对LinkedList类的使用

a.利用iterator类

import java.util.* ;
public class ListDemo01{
	public static void main(String args[]){
		List<Integer> li = new LinkedList<Integer>() ;
		for(int i=0;i<1000000;i++){
			li.add(i) ;				
		}
		long startTime = System.currentTimeMillis() ;
		Iterator<Integer> it = li.iterator() ;
		while(it.hasNext()){
			if(it.next()%2==0){
				it.remove() ;
			}
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println(endTime-startTime) ;
	}
}

b.不利用iterator的话则则需要调用get方法。则效率很低

import java.util.* ;
public class ListDemo01{
	public static void main(String args[]){
		List<Integer> li = new LinkedList<Integer>() ;
		for(int i=0;i<1000000;i++){
			li.add(i) ;				
		}
		long startTime = System.currentTimeMillis() ;
		for(int i=0;i<10000;i++){
			if(li.get(i)%2==0){
				li.remove(i)  ;
			}
		}
		long endTime = System.currentTimeMillis() ;
		System.out.println(endTime-startTime) ;
	}
}