Array, ArrayList, LinkedList之间的区别分析,
Array, ArrayList, LinkedList之间的区别分析,
(一)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 > </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
相关文章
- 暂无相关文章
用户点评