java中ArrayList和LinkedList的区别

来源:互联网 发布:互联网软件开发工资 编辑:程序博客网 时间:2024/05/16 08:24
  • 介绍

  首先来看ArrayList和LinkedList的集成类和接口的区别。

复制代码
// lang javapublic class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializablepublic class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Queue<E>, Cloneable, Serializable
复制代码

  ArrayList实现了随机访问的接口,LinkedList实现了Quene的接口。

  ArrayList是基于数据实现的list,而LinkedList是基于链表实现的list。所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性。

  • 优缺点

  ArrayList

  优点:适合随机读取的时候,读取速度快,可以一步get(index)。

  缺点:添加值很慢——一方面,添加数据在array中间的时候,需要移动后面的数;另一方面,当长度大于初始长度的时候,每添加一个数,都会需要扩容。

  LinkedList:双向链表

  优点:添加值很快——添加在list中间也只需要更改指针;长度不固定。

  实现栈和队列方面,LinkedList要优于ArrayList。

  • 其它

  LinkedList的remove(int)和remove(Object)的方法的时间复杂度都是O(n),不是O(1).因为会有一个查找的过程。

  LinkedList的remove(int)要优于remove(Object),因为remove(int)在查找的时候,会从链表的中间查找,如果int比中间小,找前半部分,否则找后半部分(类似二分查找)。

  ArrayList的增删比LinkedList的开销更大,因为除了有查找的时间复杂度外,还有增删的移动过程。

  

  • 使用LinkedeList<Integer>实现对链表的排序(sougou笔试题)
复制代码
//LinkedList<Integer>实现链表的排序   使用插入排序    public LinkedList<Integer> insertSortForLinkedList(LinkedList<Integer> list){        int len=list.size();        for(int i=1;i<len;i++){            int j=i-1;            int temp=list.get(i);            list.remove(i);  //注意这里需要删除元素              while(j>=0&&temp<list.get(j)){                j--;                }            list.add(j+1,temp);        }        return list;    }
复制代码
  • 使用LinkedeList实现栈和队列  

 Stack.java

复制代码
import java.util.*;class Stack{    private LinkedList list;    public Stack(){        list=new LinkedList();    }        public Object top(){   //输出最上面的元素        if(list.size()!=0){            return list.getFirst();        }        return -1;    }        public void pop(){   //出栈        if(list.size()!=0){            list.removeFirst();        }    }        public void push(Object v){ //入栈        list.addFirst(v);    }        public int getLen(){        return list.size();    }}
复制代码

Test.java

复制代码
import java.util.*;class Test{    public static void main(String[] args){        Stack stack = new Stack();        stack.push("张三");        stack.push(3);        stack.push("李四");        stack.push("5");        System.out.println("长度---"+stack.getLen());  //4                /**        //注意这样写是有问题的,因为在出栈的过程中stack.getLen()是会发生变化的        for(int i=0;i<stack.getLen();i++){               System.out.println(stack.top());            stack.pop();            //System.out.println("长度---"+stack.getLen());  //4        }        **/                /**        //正确        int i=stack.getLen()-1;        while(i>=0){            System.out.println(stack.top());            stack.pop();            i--;        }        **/        //正确,但是会引来不安全操作提醒        while(stack.getLen()>0){               System.out.println(stack.top());            stack.pop();        }        System.out.println(stack.top());        stack.pop();    }}
复制代码