java集合2--List

原创 2016年08月30日 08:57:46

1、List接口

该接口定义的元素是有序的且可重复的。相当于数学里面的数列,有序可重复

  • boolean addAll(int index, Collection< ? extends E> c); 将指定集合中所有元素,插入至本集合第index个元素之后
  • default void replaceAll(UnaryOperator operator); 替换集合中每一个元素值
  • default void sort(Comparator< ? super E> c); 给集合中的元素进行排序
  • E get(int index); 获取集合中第index个元素
  • E set(int index, E element); 将集合中第index个元素替换成指定元素
  • void add(int index, E element); 向集合中第index个位置添加一个元素
  • E remove(int index); 移除集合中第index个元素
  • int indexOf(Object o); 得到指定元素在集合中的位置(第一次出现)
  • int lastIndexOf(Object o); 得到指定元素在集合中的位置(最后一次出现)
  • ListIterator listIterator(); 返回ListIterator
  • ListIterator listIterator(int index); 返回ListIterator,并设置当前位置
  • List subList(int fromIndex, int toIndex); 截取List,从fromIndex到toIndex

2、List子类

2.1、AbstractList抽象类

该类实现了基本的List集合功能,如果实现的是只读的List集合,继承自该抽象类的子类只需要实现get(int index)和size()两个方法,如果是可操作的List集合,则必须重写add和set方法,否则执行add和set时会抛出UnsupportedOperationException异常
AbstractList抽象类中的迭代器通过get(int index)访问元素,通过remove(Object o)删除元素。
AbstractList抽象类包含了一个SubList子类,该子类通过包装一个AbstractList抽象类对象实现元素的添加、删除等功能。

该抽象类主要实现了如下方法:

  • boolean add(E e); 添加元素e,内部调用add(int index,E element)实现
  • int indexOf(Object o); 得到指定元素第一次在集合中的位置,内部通过List迭代器实现
  • int lastIndexOf(Object o); 得到指定元素在集合中的位置(最后一次出现),内部List迭代器实现,注意此处是从后往前迭代
  • void clear(); 清空List集合中的元素,内部通过List迭代器实现
  • boolean addAll(int index, Collection< ? extends E> c); 插入集合c中所有元素,内部调用add(int index,E element)实现
  • Iterator iterator(); 返回一个迭代器对象,AbstractList抽象类内部实现了一个迭代器
  • ListIterator listIterator(); 返回一个List迭代器对象,AbstractList抽象类内部实现了一个List迭代器
  • boolean equals(Object o); 重写Object的equals方法,内部先判断是否同一个对象,是返回true,否则判断o是否是List对象,不是返回false,是的话迭代比较两个集合中每一个元素是否一致,都一致返回true
  • int hashCode(); 内部迭代集合中每一个元素计算出hashcode值
  • List subList(int fromIndex, int toIndex);得到List集合的子集合,内部通过构造AbstractList内部的SubList实现

2.2、ArrayList

ArrayList继承自AbstractList实现了List中所有方法,该集合可以插入任何元素包括null元素。
ArrayList内部使用数组保存元素,他的size、isEmpty、get、set、add等操作都是常数时间。在获取元素时会比LinkedList更有优势。
Arraylist有一个初始的大小,该大小会随着元素的增加而增长。
ArrayList不是线程安全的,在多线程环境下使用时需要注意,我们可以通过Collections.synchronizedList(new ArrayList(…));操作得到一个线程安全的ArrayList
ArrayList中的迭代器在List集合结果变化后,我们调用迭代器中的方法时会快速抛出ConcurrentModificationException异常通知程序,以免造成损失。
ArrayList的扩展策略:
在初始集合为空时,加入元素时会初始化Math.max(DEFAULT_CAPACITY, minCapacity)个空间,即取插入元素个数和DEFAULT_CAPACITY中比较大的那个数
集合非空时插入元素,如果空间不够时,则取原集合大小扩展2倍和最小需求大小中较大的那个进行扩展
ArrayList重写了Iterator和ListIterator,内部直接通过遍历数组实现
ArrayList重写了SubList类,该类直接通过访问数组实现
ArrayList主要包括以下属性:

  • transient Object[] elementData; 该对象数组用于存放集合中的元素
  • int size; 该属性用于保存集合的大小
  • transient int modCount; 记录ArrayList修改的次数,在集合迭代器中会使用该数字判断迭代时集合是否修改过
    ArrayList主要包含以下构造函数:
  • ArrayList(int initialCapacity); 构造初始大小为initialCapacity的集合对象
  • ArrayList(); 构造一个空的数组元素
  • ArrayList(Collection< ? extends E> c); 使用传入集合c构造一个集合对象

ArrayList主要包括以下函数:

  • void trimToSize(); 将集合中数组大小恢复至当前集合大小,该操作可以压缩集合使用空间
  • void ensureCapacity(int minCapacity); 通过传入的minCapacity判断集合是否需要扩展,需要的话则扩展数组大小,已足够存放元素
  • int indexOf(Object o); 得到指定元素第一次在集合中的位置,重写了AbstractList类的方法,内部直接遍历元素数组实现
  • int lastIndexOf(Object o); 同上
  • Object clone(); 重写了clone方法,并且将元素数组复制一份出来,且将modCount致0,注意此处数组中元素并没有clone,也就是说克隆后的集合和元集合使用同一份具体元素
  • Object[] toArray(); 直接返回本集合中的数组
  • E get(int index); 直接访问数组
  • E set(int index, E element); 直接设置数组元素值
  • boolean add(E e); 直接操作数组,想数组添加一个元素
  • E remove(int index); 直接操作数组
  • boolean remove(Object o); 一样遍历数组,注意该操作会导致数组移动
  • void clear(); 遍历将数组致空,同时设置size大小为0
  • boolean addAll(Collection< ? extends E> c); 通过数组直接添加
  • void sort(Comparator< ? super E> c); 实现集合中元素排序功能,接收一个Comparator用以比较集合中元素的大小

2.3、AbstractSequentialList抽象类

AbstractSequentialList是一个抽象类,继承自AbstractList抽象类
AbstractSequentialList内部基于链表实现,主要针对顺序访问list集合的情况,它在随机访问时表现较差
AbstractSequentialList的实现者需要提供listIterator和size两个实现,AbstractSequentialList内部本身通过listIterator实现了其他函数

ArrayList主要包含以下函数:

  • E get(int index); 获取第index个元素,内部通过ListIterator实现
  • E set(int index, E element); 替换集合的第index个元素,内部通过ListIterator实现
  • void add(int index, E element); 想list集合中插入元素,内部通过void add(int index, E element)实现
  • E remove(int index); 删除list中第index个元素,内部通过ListIterator实现
  • boolean addAll(int index, Collection< ? extends E> c); 添加另一个集合中的所元素,内部通过ListIterator实现
  • Iterator iterator(); 直接调用listIterator()方法

2.4、LinkedList

LinkedList继承自AbstractSequentialList抽象类,实现了List、Deque、Cloneable、和Serializable接口
LinkedList内部基于双向链表实现,允许插入任何元素,包括null
LinkedList不是线程安全的,在多线程环境下使用时需要注意,我们可以通过Collections.synchronizedList(new LinledList(…));操作得到一个线程安全的ArrayList
LinkedList中的迭代器在List集合结果变化后,我们调用迭代器中的方法时会快速抛出ConcurrentModificationException异常通知程序,以免造成损失。
LinkedList内部使用Node类存储元素,该类包含下面三个属性,
E item; 保存元素值得对象
Node next; 下一个节点对象
Node prev; 上一个节点对象
LinkedList重写了ListIterator,内部直接通过遍历链表实现迭代器功能
LinkedList主要包含以下属性

  • transient int size = 0; 集合当前大小
  • transient Node first; 链表的首元素
  • transient Node last; 链表的尾元素
    LinkedListList主要包含以下构造函数:
  • LinkedList(); 空构造函数
  • LinkedList(Collection< ? extends E> c); 使用另外一个集合的构造函数,会将另一个集合所有元素加入本集合中

LinkedList主要包含以下函数:
自有函数

  • void linkFirst(E e); 插入元素至第一个位置
  • void linkLast(E e); 插入元素至最后一个位置
  • void linkBefore(E e, Node succ); 在某个元素之前插入一个元素
  • E unlinkFirst(Node f); 移除第一个元素
  • E unlinkLast(Node l); 移除最后一个元素
  • E unlink(Node x); 移除指定元素
  • E getFirst(); 得到第一个元素
  • E getLast(); 得到最后一个元素
  • E removeFirst(); 移除第一个元素
  • E removeLast(); 移除最后一个元素
  • void addFirst(E e); 插入第一个元素
  • void addLast(E e); 插入最后一个元素
  • Node node(int index); 返回index对应的Node节点

List函数

  • boolean contains(Object o); 是否包含某个元素
  • int size(); 返回集合大小,直接返回size变量
  • boolean add(E e); 添加一个元素,调用linkLast(e);
  • boolean remove(Object o); 删除指定元素,通过遍历链表删除
  • boolean addAll(Collection< ? extends E> c); 将集合c插入至本集合,链表插入
  • void clear(); 遍历链表,清空所有元素,将首尾元素制空
  • E get(int index); 获取第index个元素,通过node(index)得到node节点
  • E set(int index, E element); 替换第index个元素,通过node(index)得到node节点,然后设置值
  • void add(int index, E element); 在第index位置插入元素,调用linkBefore(element, node(index));
  • E remove(int index); 删除第index个元素,通过unlink(node(index));实现
  • int indexOf(Object o); 得到o对象在集合中的位置(第一次出现),通过遍历链表实现,从头部开始遍历
  • int lastIndexOf(Object o) 得到o对象在集合中的位置(最后一次出现),通过遍历链表实现,从尾部开始遍历
    Deque函数
  • E peek(); 返回第一个元素,但不删除。直接去first首元素,集合空时,返回null
  • E element(); 返回第一个元素,但不删除。集合空时抛出异常,调用getFirst();
  • E remove(); 获得并移除队列顶部元素,如果队列为空抛出异常,调用removeFirst
  • E poll(); 获得并移除队列顶部元素,如果队列为空返回null调用unlinkFirst(f)
  • boolean offer(E e); 队列尾部插入元素,调用add(e)
  • boolean offerFirst(E e); 队列首部插入元素,调用addFirst(e);
  • boolean offerLast(E e); 队列尾部插入元素,调用addLast(e)
  • E peekFirst(); 返回首元素
  • E peekLast(); 返回最后一个元素,不删除,空时返回null
  • E pollFirst(); 获得并移除队列顶部元素,如果队列为空返回null调用unlinkFirst(f)
  • E pollLast(); 获得并移除队列尾部元素,如果队列为空返回null调用unlinkLast(f)
  • void push(E e); 向首部插入元素,调用addFirst(e);,栈方法
  • E pop(); 返回并移除首元素,调用removeFirst();,栈方法
  • boolean removeFirstOccurrence(Object o); 删除第一次出现o的元素,调用remove(o);函数
  • boolean removeLastOccurrence(Object o); 删除最后一次出现o的元素,从后向前遍历链表,匹配后移除

2.5、Vector

功能和ArrayList类似,不同的是Vector是线程安全的,其大部分方法都加了synchronized关键字以保证多线程环境下线程安全问题。不过在可以确保没有线程安全问题的情况下,我们还是应该选择ArrayList,因为ArrayList的效率要比Vector高。

2.6、CopyOnWriteArrayList

CopyOnWriteArrayList继承Object,实现了List, RandomAccess, Cloneable, java.io.Serializable接口
CopyOnWriteArrayList是
CopyOnWriteArrayList内部使用数组保存元素,但是它的数组大小等于集合的大小,因为它的增加、删除、修改元素都是新copy一份数组
CopyOnWriteArrayList是线程安全的,他的写操作加锁,读操作没有加锁,适用于读多写少的情况
CopyOnWriteArrayList实现了Iterator和ListIterator,内部通过遍历数组实现,但是它的迭代器不支持操作元素。会抛出UnsupportedOperationException

CopyOnWriteArrayList主要包含以下属性:

  • final transient ReentrantLock lock; CopyOnWriteArrayList内部使用的线程同步锁
  • transient volatile Object[] array; 集合内部用于保存元素的地方

CopyOnWriteArrayList主要包含以下构造函数:

  • CopyOnWriteArrayList(); 构造一个空的集合
  • CopyOnWriteArrayList(Collection< ? extends E> c); 创建一个包括闯入集合所有元素的集合
  • CopyOnWriteArrayList(E[] toCopyIn); 创建一个包含传入数组所有元素的集合,注:此处会copy原有数组。

CopyOnWriteArrayList主要包括以下函数:

  • final Object[] getArray(); 得到集合持有的数组对象
  • void setArray(Object[] a); 设置集合的数组对象
  • int size(); 返回集合大小,直接返回数组的长度
  • boolean isEmpty(); 判断集合是否为空
  • boolean contains(Object o); 判断集合是否包含某元素
  • int indexOf(Object o) ; 得到传入元素在集合中第一次出现的位置索引
  • int indexOf(E e, int index); 得到传入元素在集合中第一次出现的位置索引,从index开始查找
  • int lastIndexOf(Object o); 得到传入元素在集合中最后一次出现的位置索引,从集合尾部开始查找
  • lastIndexOf(E e, int index); 得到传入元素在集合中出现的位置索引,从集合index开始往前查找
  • Object clone(); 返回集合的clone,集合的元素没有被clone
  • Object[] toArray(); 转换成数组,此处返回的是数组的copy
  • T[] toArray(T a[]); 转换成数组,如果传入数组小于当前集合,重新申请一块空间,否则使用数组a,当数组a大于集合长度时将数组a的临近集合元素的第一个元素设置成null,可以方便用户在知道集合不含null元素时判断集合的大小
  • E get(int index); 获取集合的index索引元素
  • E set(int index, E element); 设置集合的index元素的值
  • boolean add(E e); 往集合中添加元素
  • void add(int index, E element); 插入元素至指定位置
  • E remove(int index); 移除指定位置的元素
  • boolean remove(Object o); 移除第一次出现元素o
  • void removeRange(int fromIndex, int toIndex); 移除范围内的所有元素
  • boolean addIfAbsent(E e); 当集合中不包含该元素时,添加该元素
  • boolean addIfAbsent(E e, Object[] snapshot); 当集合中不包含该元素且传入数组中也不包含该元素时,添加该元素
  • boolean containsAll(Collection<?> c); 判断集合是否全部包含传入集合的元素
  • boolean removeAll(Collection<?> c); 移除集合中c中所有元素
  • boolean retainAll(Collection<?> c); 移除集合中所有不在c中的元素
  • int addAllAbsent(Collection<?extends E> c); 遍历c,当c中元素不在集合中时,加入至集合
  • void clear(); 清空集合
  • boolean addAll(Collection<? extends E> c); 将集合c中所有元素加入至集合中
  • boolean addAll(int index, Collection<? extends E> c); 将集合c中所有元素插入至index后

2.7、Stack

Stack继承自Vector,他表示一种后进先出的数据结构,即栈。他拥有五种基本的操作即push、pop、peek、empty、search
Stack继承自Vector,所以它也是线程安全的
Stack继承自Vector,所以它内部也是用数组存储元素的

Stack自定义函数如下

  • E push(E item); 向栈顶添加一个元素
  • E pop(); 从栈顶取出并删除一个元素
  • E peek(); 得到栈顶元素
  • boolean empty(); 判断栈是否为空
  • int search(Object o); 查找o的位置,存在返回距栈顶位置,否则返回-1
版权声明:本文为博主原创文章,未经博主允许不得转载。

java集合分类大全

List: 实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。ArrayList,LinkedList是不同步的,而Vestor是同步的。 ArrayL...
  • x_love_x
  • x_love_x
  • 2016年07月14日 11:12
  • 488

Java基础之集合知识点总结一

集合----是用于存储对象的一个工具,集合和数组的特点
  • u011460827
  • u011460827
  • 2014年12月02日 12:40
  • 771

Java集合详解--什么是集合

什么是集合 集合类存放于java.util包中。 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。 集合类型主要...
  • wz249863091
  • wz249863091
  • 2016年10月17日 22:24
  • 5685

java集合系列——List集合总结(六)

List继承了Collection,是有序的列表。 实现类有ArrayList、LinkedList、Vector、Stack等 ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容...
  • u010648555
  • u010648555
  • 2017年03月02日 21:46
  • 855

JAVA集合框架的总结(集合嵌套)

先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析。...
  • ckj121
  • ckj121
  • 2015年08月02日 00:17
  • 1276

java集合初始化方式

1 : 传统方式 2 : 双花括号方式 : 第一层花括号是匿名内部类,第二层花括号是初始化代码块 Set  SERVICE_OPT = new HashSet() { { add("s...
  • daemon93
  • daemon93
  • 2016年12月03日 10:06
  • 1333

Java基础——集合(一)——集合体系、Collection集合

一、集合概述          Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。而数组长度固定,不能满足变化的要求。所以,java提供了集合。          ...
  • haovip123
  • haovip123
  • 2015年05月02日 00:09
  • 12546

JAVA常用集合实现方式的总结

请尊重他人劳动成果,请勿随意剽窃,转载请注明,谢谢!转载请注明出处:http://blog.csdn.net/evan_man/article/details/50835507 本篇主要是对之...
  • evan_man
  • evan_man
  • 2016年03月09日 15:06
  • 1467

史上最全的Java集合类解析

本文仅分析部分原理和集合类的特点,不分析源码,旨在对java的集合类有一个整体的认识,理解各个不同类的关联和区别,让大家在不同的环境下学会选择不同的类来处理。Java中的集合类包含的内容很多而且很重要...
  • HHcoco
  • HHcoco
  • 2016年11月10日 17:03
  • 16597

JAVA基础知识之Set集合

Set集合的基本特征是不记录添加顺序,不允许元素重复(想想是为什么)。最常用的实现类是HashSet. 本文将要介绍以下内容 HashSet类 HashSe的特征HashSet的equa...
  • solafy
  • solafy
  • 2016年10月28日 23:22
  • 6017
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java集合2--List
举报原因:
原因补充:

(最多只允许输入30个字)