文章转自: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也是一个容器,但底层采用的是链表,因此不存在扩容问题,除非整个内存空间都不足了,由于采用的是链表,因此查找效率也比较低,但删除效率比较高。
- 1
- 2
- 1
- 2
ArrayList的测试代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
ArrayList核心源代码:
- 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