当前位置: 移动技术网 > IT编程>开发语言>Java > Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理

Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理

2019年07月22日  | 移动技术网IT编程  | 我要评论

红颜知己是什么,白鸟花子,befurs

一、arraylist

arraylist是一个可以处理变长数组的类型,这里不局限于“数”组,arraylist是一个泛型类,可以存放任意类型的对象。顾名思义,arraylist是一个数组列表,因此其内部是使用一个数组来存放对象的,因为object是一切类型的父类,因而arraylist内部是有一个object类型的数组类存放对象。arraylist类常用的方法有add()、clear()、get()、indexof()、remove()、sort()、toarray()、tostring()等等,同时arraylist内部有一个私有类实现iterator接口,因此可以使用iterator()方法得到arraylist的迭代器,同时,还有一个私有类实现了listiterator接口,因此arraylist也可以调用listiterator()方法得到listiterator迭代器。
由于arraylist是依靠数组来存放对象的,只不过封装起来了而已,因此其一些查找方法的效率都是o(n),跟普通的数组效率差不多,只不过这个arraylist是一个可变”数组“,并且可以存放一切指定的对象。
另外,由于arraylist的所有方法都是默认在单一线程下进行的,因此arraylist不具有线程安全性。若想在多线程下使用,应该使用colletions类中的静态方法synchronizedlist()对arraylist进行调用即可。

二、linkedlist

linkedlist可以看做为一个双向链表,所有的操作都可以认为是一个双向链表的操作,因为它实现了deque接口和list接口。同样,linkedlist也是线程不安全的,如果在并发环境下使用它,同样用colletions类中的静态方法synchronizedlist()对linkedlist进行调用即可。

在linkedlist的内部实现中,并不是用普通的数组来存放数据的,而是使用结点<node>来存放数据的,有一个指向链表头的结点first和一个指向链表尾的结点last。不同于arraylist只能在数组末尾添加数据,linklist可以很方便在链表头或者链表尾插入数据,或者在指定结点前后插入数据,还提供了取走链表头或链表尾的结点,或取走中间某个结点,还可以查询某个结点是否存在。add()方法默认在链表尾部插入数据。总之,linkedlist提供了大量方便的操作方法,并且它的插入或增加等方法的效率明显高于arraylist类型,但是查询的效率要低一点,因为它是一个双向链表。

因此,linkedlist与arraylist最大的区别是linkedlist更加灵活,并且部分方法的效率比arraylist对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用linkedlist;对于数组变动不大,主要是用来查询的情况下,可以使用arraylist。

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) ; 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网