• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了arraylist linkedlist,java linkedlist,java linkedlist用法,java中linkedlist,java.util.linkedlist等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、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) ; 
  } 
} 
</div>

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

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

下面化成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) ; 
  } 
} 
</div>

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

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理
  • java中ArrayList与LinkedList对比详情
  • Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理
  • java中ArrayList与LinkedList对比详情

相关文章

  • 2017-05-28详解Spring Boot中使用AOP统一处理Web请求日志
  • 2017-05-28Spring Boot启动过程全面解析(三)
  • 2017-05-28springboot集成activemq的实例代码
  • 2017-05-28java数据结构与算法之快速排序详解
  • 2017-05-28java用重定向方法从文件中读入或写入数据
  • 2017-05-28SWT(JFace)体验之List演示汇总第1/2页
  • 2017-05-28Java中自动生成构造方法详解
  • 2017-05-28java数据结构与算法之冒泡排序详解
  • 2017-05-28Java可变参数列表详解
  • 2017-05-28Java——对象初始化顺序使用详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • mybatis教程之查询缓存(一级缓存二级缓存和整合ehcache)
    • Java IO流 文件的编码实例代码
    • java 实现定时的方法及实例代码
    • 详解Spring AOP 实现主从读写分离
    • Java正则判断日期格式是否正确的方法示例
    • Java常用字符串工具类 字符串智能截取(3)
    • 详谈Java几种线程池类型介绍及使用方法
    • struts2如何使用拦截器进行用户权限控制实例
    • Java常用数字工具类 大数乘法、加法、减法运算(2)
    • spring使用RedisTemplate的操作类访问Redis

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有