java集合类之List

java 专栏收录该内容
5 篇文章 0 订阅

概述

List是一种有序的集合接口。List的实例支持通过下标访问元素,下标从0开始计数。List允许重复的元素(Set是不允许重复的元素的)。
需要注意的是:如果List的实例允许将实例本身作为元素,那么该实例的equals和hashCode的意义将不再明确。

List定义了以下操作:

操作类型方法说明
Queryint size();
boolean isEmpty();
boolean contains(Object o);
Iterator iterator();
Object[] toArray();
T[] toArray(T[] a);
Modificationboolean add(E e);
boolean remove(Object o);
Bulk Modificationboolean containsAll(Collection c);
boolean addAll(Collection c);
boolean addAll(int index, Collection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
void replaceAll(UnaryOperator operator);
void sort(Comparator c);
void clear();
Comparison and hashingboolean equals(Object o);
int hashCode();
Positional AccessE get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
基于下标的访问
Searchint indexOf(Object o);
int lastIndexOf(Object o);
List IteratorsListIterator listIterator();
ListIterator listIterator(int index);
ViewList subList(int fromIndex, int toIndex);
Spliterator spliterator();



实现类包括:AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

AbstractList

AbstractList抽象类实现了List的骨架。用于减轻实现随机访问型存储数据List(如ArrayList)的工作。使用该类的策略如下:
1. 如果要实现一个不可变的list,只需继承AbstractList并实现get(int)和size()方法。
2. 如果要实现一个可变的list,还需实现set(int, E)及可选的add(int, E)和remove(int)方法。
3. 一般要提供一个无参构造器和集合构造器。(见Collection接口的说明)
4. 不需要实现迭代器。

AbstractSequentialList

AbstractSequentialList实现了List的骨架,用于减轻实现顺序访问型List(如LinkedList)的工作。使用该类的策略如下:
1. 要实现一个list,只需继承AbstractSequentialList并实现listIterator()和size()方法。
2. 要实现一个不可变的list,只需实现list iterator的hasNext, next, hasPrevious, previous和index方法。
3. 要实现一个可变的list,还需实现set方法。要实现一个可变size的list,还需实现list iterator的remove和add方法。
4. 一般要提供一个无参构造器和集合构造器。(见Collection接口的说明)

ArrayList

ArrayList是List接口的可变大小数组类。是随机访问型List实现。除实现了所有List接口定义的方法外,还额外实现了一些操作数组容量的方法。ArrayList有一个capacity属性,它是数组能够存储元素的的最大尺寸。并且随着元素的插入,capacity自动增长。其特性如下:
1. 允许null元素。
2. size、isEmpty、get、set、iterator、listIterator方法的执行在常量时间完成;add方法执行时间O(n)。其他操作执行在线性时间完成。
3. 加入元素(add方法),size自动增长。如果插入一个元素时list已满,则重新分配的存储空间为当前的1.5倍。
4. 该实现线程不安全。(与Vector类功能大致相当,而Vector类是线性安全的)
5. 可序列化

注意:
- 使用无参构造函数实例化的ArrayList对象,默认capacity为10。并且在插入第一个元素时才会分配这10个存储空间。
- size增长重新分配存储空间会将增长前的内容复制到新分配的空间前面。
- 如果要连续插入大量的元素,最好在插入之前通过ensureCapacity方法增加容量。否则会多次重新分配存储空间。

AttributeList

AttributeList用于展示MBean的属性。是ArrayList的一个子类。AttributeList不强制要求其元素是Attribute类型,但是在调用asList()方法后,插入非Attribute类对象,会抛出IllegalArgumentException异常。这是一个用于MBean管理的专用类,这里不过多叙述。

CopyOnWriteArrayList

CopyOnWriteArrayList是一种线程安全的ArrayList变种。其对list作出修改的所有操作都是在原数组上进行了一个包含修改(add、set或remove)内容的全新拷贝。其内部指向数组的引用(array)指向新的数组的引用,原来的数组被丢弃。每次修改操作都有内存拷贝,操作代价太大。因此该类的使用具有局限性。其特性如下:
1. 线程安全。
2. 在遍历操作远远多于修改操作的情况下,适合使用该类。其iterator是当前的一个快照(array引用),在iterator的生命周期中,其他线程对该list的修改将不会引起并发异常。但是iterator不支持修改值。
3. 允许null元素。

##### LinkedList
LinkedList是实现了List和Deque接口的双向链接表类。是顺序访问型list。所有的操作都与双向列表一样能预期。内部使用Node来存储元素。其具有以下特性:
1. 线程不安全。
2. 允许null元素。
3. 索引操作将从头或从尾开始遍历列表,具体从哪一边开始以索引更靠近哪一边为准。
4. 其按下标访问元素(随机访问)性能不佳。

RoleList和RoleUnresolvedList

它们是ArrayList的子类。专用于表示Role对象(RoleUnresolved对象)。但其继承的ArrayList模板的类型是Object而不是Role,所以其add、set、addAll方法有两种:以Object类型作参数和以Role类型(或RoleUnresolved类型)作参数。
其特性同ArrayList。

Vector

Vector是可增长的数组类,可通过index下标访问元素。其size可以增长或收缩。因此Vector具有优化的存储容量,由capacity和capacityIncrement参数管理。capacity至少等于Vector的size,每次增长的容量是capacityIncrement指定。如果要插入大量的元素,最后事先调用ensureCapacity(int)增长容量以减少重新分配存储空间的操作。其无参构造函数的默认capacity是10,capacityIncrement是0(<=0 表示容量每次增长一倍)。具有随机访问特性。
Vector是线程安全的
除去容量增长由capacityIncrement指定和线程安全外,其余同ArrayList。如不需要考虑线程安全问题则优先使用ArrayList。

Stack

Stack是一个LIFO(后入先出)的栈结构类。Stack是Vector的子类,它实现了额外的5个方法来将Vector扩展为一个栈。
- 栈通用的push、pop方法
- peek方法窥探栈顶元素
- empty方法检查是否为空栈
- search方法检查一个元素到栈顶的距离
当栈创建时是不包含元素的。
一个完整和一致性的栈是Deque接口和其实例。Deque接口实例应优先于Stack使用。


对于List类线程不安全的实现:
1. 如果多个线程同时访问,并且至少有一个线程会在结构上修改列表,那么必须在外部进行同步。通常使用封装这个list的类的某个对象来同步,如果没有则使用:
List list = Collections.synchronizedList(new XxxList(…));
2. 由iterator和listIterator返回的迭代器是fail-fast的。如果在迭代器创建之后list被结构化地修改(除迭代器自己的add或remove方法)。迭代器继续遍历将抛ConcurrentModificationException异常。
3. 迭代器的fail-fast行为不具有硬性保证,仅用于检测错误。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值