(一)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][]; 

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

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.Java API文档http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
2.http://www.2cto.com/kf/201308/232982.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐