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

时间: 2024-10-07 21:51:45

java集合框架collection(2)ArrayList和LinkedList的相关文章

Java集合框架Collection(1)ArrayList的三种遍历方法

ArrayList是java最重要的数据结构之一,日常工作中经常用到的就是ArrayList的遍历,经过总结,发现大致有三种,上代码: package com.company; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Created by wangbin10 on 2017/3/1. */ public class JavaSort { public static vo

一、集合框架(关于ArrayList,LinkedList,HashSet,LinkedHashSet,TreeSet)

一.ArrayList 解决了数组的局限性,最常见的容器类,ArrayList容器的容量capacity会随着对象的增加,自动增长.不会出现数组边界的问题. package collection;   import java.util.ArrayList;   import charactor.Hero;   public class TestCollection {     @SuppressWarnings("rawtypes")     public static void ma

java集合框架collection(3)

根据<java编程思想>里面的说法,java集合又叫容器,按照单槽和双槽分为两类,Collection和Map,这两个都是接口. 一.Collection Collection下面又分了三个子接口,分别是Set,List和Queue,他们的特性分别是: 1.Set:元素唯一,即Set中的元素永远不可能重复,跟数学中的集合概念是一样的.它的所有实现类都有相同的特征. 主要实现类有三个:HashSet,LinkedHashSet,TreeSet HashSet的底层实现是HashMap中的key,

java集合的实现细节--ArrayList和LinkedList

 ArrayList和LinkedList的实现差异 List代表一种线性表的数据结构,ArrayList则是一种顺序存储的线性表,ArrayList底层采用动态数组的形式保存每一个集合元素,LinkedList则是一种链式存储的线性表,其本质上就是一个双向链表,它不仅实现了List接口,还实现了Deque接口,Deque代表了一种双端队列,既具有队列(FIFO)的特性,也具有栈(FILO)的特性,也就是说,LinkedList既可以当成双向链表使用,也可以当成队列使用,还可以当成栈来使用. p

java集合框架Collection

package collection; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.junit.Test; /** * <p>@ClassName: CollectionTest01</p> * <p>Description: java集合</p> */ public class CollectionTest01 {

Java集合框架之一:ArrayList源码分析

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小.随着向 ArrayList 中不断添加元素,其容量也自动增长. ArrayList不是同步的(也就是说不是线程安全的),如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步,在多线程环境下,可以使用Collections.synch

jdk源码阅读笔记之java集合框架(四)(LinkedList)

关于LinkedList的分析,会从且仅从其添加(add)方法入手. 因为上一篇已经分析过ArrayList,相似的地方就不再叙述,关注点在LinkedList的特点. 属性: /** *链表头 */ transient Node<E> first; /** * 链表尾 */ transient Node<E> last; 从以上两个属性可以得出LinkedList是基于双向链表实现的. 节点代码(无需过多解释): private static class Node<E>

java集合框架:浅谈如何使用LInkedList实现队列(Queue)和堆栈(Stack)

Java中的LinkedList?是采用双向循环列表实现的.利用LinkedList?可以实现栈(stack).队列(queue) 下面写两个例子学生类:int stuId; public int getStuId() { return stuId; } public void setStuId(int stuId) { this.stuId = stuId; } public String getStuName() { return stuName; } public void setStuN

Java 集合框架(一)

前言:凡是使用 Java 编程的,几乎肯定会用到集合框架,比如 ArrayList.LinkedList.HashSet.HashMap 等,集合框架的代码绝对是大师级的实现,所以为了更好地使用集合框架,我们有必要系统地学习下集合框架的内容. 一.接口综述 集合框架的整体结构图如下(摘自<Thinking In Java>): 上图也许有些复杂,因为包含了很多我们很少用到的抽象类,其实,只需要记住下面两张图即可: