`

List

 
阅读更多

List 

   装载元素的有序容器,List内的元素可以重复,可以通过位置定位到每一个元素或将某一元素插入到固定位置。

  

   

List 子类:


List 的选择:

 

单线程下:

        任意方式读取遍历,但只从队列尾部添加,从尾部开始删除,就用ArrayList, (添加到中间或从中间删 除需要重建数组,添加的元素量过大时,不断超过容量,也需要重建数组,最指定容量大小)。

       

       任意位置添加删除,遍历时仅使用迭代器,就用LinkedList。

 

 多线程下

(如果允许,最好使用:ConcurrentLinkedQueue(自旋锁)、 ArrayBlockingQueue(可重入锁)、 LinkedBlockingDeque(可重入锁)):

 

 

          任意方式读取遍历(迭代器除外),但只从队列尾部添加,从尾部开始删除,可以使用Vector

(大部分方法是同步的,使用迭代器遍历,其它线程改变了Vector,则迭代器报错:ConcurrentModificationException)。

         需要后进先出(LIFO)  ,可以使用Stack

         当读取操作远大于写入删除操作时,可以使用CopyOnWriteArrayList(每次写入删除都会重建数组);

         也可以使用Collections.synchronizedList(List<T> list) 对任何一个非线程安全的LIst进行包装而达到线程安全的目的,但迭代时必须同步迭代器,多线程频繁该问时,性能没有优势。

  

 

List 在Collection的基础上提供了:

 

 boolean add(E e)
          向列表的尾部添加指定的元素(可选操作)。
 void add(int index, E element)
          在列表的指定位置插入指定元素(可选操作)。
 boolean addAll(Collection<? extends E> c)
          添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。
 boolean addAll(int index, Collection<? extends E> c)
          将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
 void clear()
          从列表中移除所有元素(可选操作)。
 boolean contains(Object o)
          如果列表包含指定的元素,则返回 true。判断方式:equals方法返回true.
 boolean containsAll(Collection<?> c)
          如果列表包含指定 collection 的所有元素,则返回 true
 boolean equals(Object o)
          比较指定的对象与列表是否相等。
 E get(int index)
          返回列表中指定位置的元素。
 int hashCode()
          返回列表的哈希码值。
 int indexOf(Object o)
          返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
 boolean isEmpty()
          如果列表不包含元素,则返回 true
 Iterator<E> iterator()
          返回按适当顺序在列表的元素上进行迭代的迭代器。
 int lastIndexOf(Object o)
          返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
 ListIterator<E> listIterator()
          返回此列表元素的列表迭代器(按适当顺序)。
 ListIterator<E> listIterator(int index)
          返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
 E remove(int index)
          移除列表中指定位置的元素(可选操作)。
 boolean remove(Object o)
          从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。
 boolean removeAll(Collection<?> c)
          从列表中移除指定 collection 中包含的其所有元素(可选操作)。
 boolean retainAll(Collection<?> c)
          仅在列表中保留指定 collection 中所包含的元素(可选操作)。
 E set(int index, E element)
          用指定元素替换列表中指定位置的元素(可选操作)。
 int size()
          返回列表中的元素数。
 List<E> subList(int fromIndex, int toIndex)
          返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
 Object[] toArray()
          返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
<T> T[]
toArray(T[] a)
          返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

 

 

 

ArrarList:

  内部使用数组来实现。 其构建器可以指定数组大小,默认构建器指定数组大小为10. 

  当内部数组已满,不能再添加元素时,会新建更大容量的数组,新数组长度约为原数组长度的1.5倍。

 

  当需要插入的元素很多,而未指定适合的容量,则可能多次重建数组。 

 

ArrayList()
          构造一个初始容量为 10 的空列表。
ArrayList(Collection<? extends E> c)
          构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
ArrayList(int initialCapacity)
          构造一个具有指定初始容量的空列表。

 

 List 中判断对象是否存在的方式:调用给定对象的equals()方法与队列中每一个元素比较。

 

 由于内部使用数组实现:

1.获取指定位置的元素速度快(get(index)),在列表尾部添加元素也比较快(通过数组下标访问)

2.在指定位置添加元素慢,在指定位置删除元素也慢。(需要新建数组,复制元素)

使用迭代器时,对ArrayList的插入删除会引起迭代器报错:ConcurrentModificationException

 

LinkedList  :

内部使用链表实现:

1.获取指定位置的元素速度慢(get(index))(需要从链表的头或尾一个一个元素的累加,直到个数==index)

2.在指定位置添加元素快,在指定位置删除元素也快。(链表,改前后元素指向就行了)

使用迭代器时,对LinedList的插入删除会引起迭代器报错:ConcurrentModificationException

 

LinkedList 遍历时使作iterator()方法比get(每一个index)要快。

 

CopyOnWriteArrayList:


内部使用数组实现。 

读取操作快,插入删除操作慢。

线程安全的:每一个插入删除操作,都先获得锁(其它线程执行插入删除时阻塞),再重建数组,添加或删除元素,把新数组赋给原数组引用。 

 

适用场合:多线程下,当遍历操作的数量大大超过插入删除操作并希望线程安全。读取速度快,插入删除慢且占内存。

 

Vector:

内部使用数组实现。其构建器可以指定数组大小,默认构建器指定数组大小为10. 

当内部数组已满,不能再添加元素时,会新建更大容量的数组,新数组长度为:

newCapacity = (capacityIncrement > 0) ?(oldCapacity + capacityIncrement) : (oldCapacity * 2)

 

Vector()
          构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。
Vector(Collection<? extends E> c)
          构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。
Vector(int initialCapacity)
          使用指定的初始容量和等于零的容量增量构造一个空向量。
Vector(int initialCapacity, int capacityIncrement)
          使用指定的初始容量和容量增量构造一个空的向量。

 

线程安全的: 所有操作方法都是同步(synchronized)的。

 

适用场合:多线程下,但频繁访问(读取插入删除)相对慢。

 

 

 

stack:

在Vector的基础上提供的先进后出(LIFO)功能。

 

boolean empty()
          测试堆栈是否为空。
 E peek()
          查看堆栈顶部的对象,但不从堆栈中移除它。
 E pop()
          移除堆栈顶部的对象,并作为此函数的值返回该对象。
 E push(E item)
          把项压入堆栈顶部。
 int search(Object o)
          返回对象在堆栈中的位置,以 1 为基数。

 

 

 

 

 

  

  • 大小: 57.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics