java集合框架collection(2)ArrayList和LinkedList

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

  • 优缺点

  ArrayList

  优点:因为Array是基于索引(index)的数据结构,适合随机读取数据,读取速度快,可以一步get(index)。

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

  LinkedList:双向链表

  优点:添加删除值很快,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,添加在list中间也只需要更改指针;长度不固定,优势只存在于数据插入表头,如果一直往后插入,就没有优势了。

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

     缺点:LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

  • 其它

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

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

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

复制代码
package com.company;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by wangbin10 on 2017/3/8.
 */
public class ArrayLinkList {
    public static void main(String [] args){
        System.out.println("ArrayList add:"+timeList(new ArrayList()));
        System.out.println("LinkedList add:"+timeList(new LinkedList()));
        List list1=addList(new ArrayList());
        List list2=addList(new LinkedList());
        System.out.println("ArrayList read:"+readList(list1));
        System.out.println("LinkedList read:"+readList(list2));
    }
    static final int N=100000;
    static long timeList(List list){
        long start=System.currentTimeMillis();
        Object o =new Object();
        for(int i=0;i<N;i++){
            list.add(i,o);
        }
    return System.currentTimeMillis()-start;
    }
    static long readList(List list){
        long start=System.currentTimeMillis();
        for(int i=0;i<list.size();i++){
        }
        return System.currentTimeMillis()-start;
    }
    static List addList(List list){
        Object o=new Object();
        for(int i=0;i<N;i++){
            list.add(i,o);
        }
        return list;
    }
}
复制代码

代码输出:

ArrayList add:3
LinkedList add:7
ArrayList read:1
LinkedList read:1

posted @   Mars.wang  阅读(244)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示