Array, ArrayList, LinkedList之间的区别分析

文章转自:http://blog.csdn.net/y999666/article/details/51502234

(一)Array(数组类) 
Java中最基本的数据结构,提供动态创建和访问java数组的方法,根据定义的Array类型,其中的元素与类型必须相同。Array是一个固定大小的容器,底层采用的是线性连续空间来存放元素。

与Array容易混淆的还有Arrays(静态类),专门用来操作array,提供数组的搜索、排序、复制等静态方法。equals(), sort(), binarySearch()等。

与此相似,Collection 和 Collections 也是接口和静态类的区别。java.util.Collection 是一个接口,是各种集合结构的父接口。实现他的主要类有Set 和 List. 
java.util.Collections是一个专用静态类,包含各种有关集合操作的静态方法,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

(二)ArrayList类

extends AbstractList 
所有已实现的接口: 
Serializable, Cloneable, Iterable, Collection, List, RandomAccess 
直接已知子类:AttributeList, RoleList, RoleUnresolvedList

ArrayList同样也是一个容器,但是其大小不固定,底层采用的也是线性连续空间来存放元素,当线性连续空间不足以存放元素时,又重新申请一片更大的空间(大约是原空间的2倍),将原有的内容移过去。

因此从这里可以看出,Array要比ArrayList的效率高,因为不需要重新申请空间。

每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。

在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。

注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问: 
List list = Collections.synchronizedList(new ArrayList(…)); 
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。

(三)LinkedList

LinkList也是一个容器,但底层采用的是链表,因此不存在扩容问题,除非整个内存空间都不足了,由于采用的是链表,因此查找效率也比较低,但删除效率比较高。

//数组的大小是固定的,定义的时候已开辟好
String [][]array=new String[5][]; 
 
 
  • 1
  • 2
  • 1
  • 2

ArrayList的测试代码:

[java]
//声明一个数组对象,采用的是ArrayList,从这里可以看出的是,ArrayList里可以存放任意  
//类型,这也就是泛型  
ArrayList<String> array=new ArrayList<String>(); 
//在这个数组对象里面存放元素  
array.add("test1"); 
array.add("test2"); 
//将值打印出来  
for(int i=0;i<array.size();i++) 
    System.out.println(array.get(i)); 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

ArrayList核心源代码:

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 
{ 
    private static final long serialVersionUID = 8683452581122892189L; 

    /**
<SPAN style="WHITE-SPACE: pre"> </SPAN>从这里,可以看出的是,ArrayList里面是通过数组来存放元素的,数组名叫elementData,类型是Object
     */ 
    private transient Object[] elementData; 

    /**
     * 数组的尺寸,上面有个关键字transient,有些人没见过,是用在Java的序列化时.
     *
     * @serial
     */ 
    private int size; 

    /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param   initialCapacity   the initial capacity of the list
     *下面这个是构造函数,从这里可以看出,如果声明时给构造函数传递了一个初始大小,则使用这个大小来开僻空间
     *            is negative
     */ 
    public ArrayList(int initialCapacity) { 
    super(); 
        if (initialCapacity < 0) 
            throw new IllegalArgumentException("Illegal Capacity: "+ 
                                               initialCapacity); 
    this.elementData = new Object[initialCapacity]; 
    } 

    /**
     * 如果使用默认构造函数,则默认情况下会开僻一个10B的大小空间
     */ 
    public ArrayList() { 
    this(10); 
    } 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

参考地址: 
1.Java API文档http://tool.oschina.net/apidocs/apidoc?api=jdk-zh 
2.http://www.2cto.com/kf/201308/232982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值