有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

与 set 不同,列表通常允许重复的元素。更确切地讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许null 元素的话,通常它们允许多个 null 元素。

List接口中的remove(Object obj)方法移除的仅是列表中第一个出现的元素,add()和addAll()方法总是将新增的元素追加到列表的最后

List 接口提供了 4 种对列表元素进行定位(索引)访问方法:get(),set(),add()和remove(),set()和remove()返回的是被覆盖或被移除的元素值。列表(像 Java 数组一样)是基于 0 的。注意,这些操作可能在和某些实现(例如 LinkedList 类)的索引值成比例的时间内执行。因此,如果调用者不知道实现,那么在列表元素上迭代通常优于用索引遍历列表。

List 接口提供了特殊的迭代器,称为 ListIterator,除了允许Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问(除了拥有hasNext()和next()之外,还有类似的hasPrevious()和previous()方法)。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。

List 接口提供了两种搜索指定对象的方法:indexOf()和lastIndexOf(),用于返回指定值第一次出现的下标和最后一次出现的下标。从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。

List 接口提供了返回列表视图的方法subList()

看下面一个例子:

         List<Integer> list = new ArrayList<Integer>();
         list.add(1);
         list.add(2);
         list.add(3);
         list.add(4);
         list.add(5);
         list.add(6);

         list.subList(1, 5).clear();

         Iterator<Integer> it= list.listIterator();
         while(it.hasNext()){
                System.out.println(it.next());
         }

list.subList(0,2).clear()这句代码进行的操作将列表中下标为大于等于1且小于5的元素删除

subList()方法并不是返回一个新的列表,而是截取原列表的一段元素作为操作的对象,本质上还是对元列表进行操作

同样是上面的列表,执行下面这句代码之后

list.subList(1, 5).indexOf(4);

得到的结果是2,list.subList(1,5)截取原列表中间的元素“2、3、4、5”作为操作对象,这个时候来执行indexOf(1)方法,返回的是元素“4”在这段子列表中的下标(为2),而非在原列表中的下标(为3)

尽管subList()方法很强大,但是它返回的List只适合当做临时对象来进行有限的操作,一旦该子列表的初始列表发生变化,这个子列表将会成为undefined的对象

         List<Integer> list = newArrayList<Integer>();
         list.add(1);
         list.add(2);
         list.add(3);
         list.add(4);
         list.add(5);
         list.add(6);
         List<Integer> list2 = list.subList(1,5);
         list.remove(5);
         System.out.println(list2.get(2));  //初始列表发生了变化,这句代码会抛出异常

Collections类中定义了很多处理集合的静态方法,有很多是专门针对List操作的,Collections.sort()可以用来排序,Collections.swap()可用来交换列表中两个元素的位置,Collections.binarySearch()使用二分查找法来定位列表中的元素,等等

List接口的扩展方法(即从Collection接口继承的方法之外方法)列表如下:

void add(int index, E element)

在列表的指定位置插入指定元素(可选操作)。

boolean addAll(int index, Collection<?extends E> c)

将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。

void clear()

从列表中移除所有元素(可选操作)。

E get(int index)

返回列表中指定位置的元素。

int indexOf(Object o)

返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。

int lastIndexOf(Object o)

返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

List Iterator<E> listIterator()

返回此列表元素的列表迭代器(按适当顺序)。

List Iterator<E> listIterator(int index)

返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。

E remove(int index)

移除列表中指定位置的元素(可选操作)。

E set(int index, E element)

用指定元素替换列表中指定位置的元素(可选操作)。

List<E> subList(int fromIndex, inttoIndex)

返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。

此外,还有ListIterator()方法返回的ListIterator接口方法列表:

void add(E e)

将指定的元素插入列表(可选操作)。

boolean hasNext()

以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。

boolean hasPrevious()

如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

E next()

返回列表中的下一个元素。

int nextIndex()

返回对 next 的后续调用所返回元素的索引。

E previous()

返回列表中的前一个元素。

int previousIndex()

返回对 previous 的后续调用所返回元素的索引。

void remove()

从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。

void set(E e)

用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

List有两中通用实现类,ArrayList和LinkedList。大多数情况下都会选择ArrayList,因为它的随机访问效率要比LinkedList高很多。但是,当我们需要频繁的添加和删除元素时,LinkedList会比ArrayList表现的更出色

ArrayList

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)

每个 ArrayList 实例都有一个容量(默认为10)。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。

在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。

扩展的构造方法:

ArrayList(int initialCapacity)

构造一个具有指定初始容量的空列表。

扩展方法:

void ensureCapacity(int minCapacity)

如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

protected  void removeRange(int fromIndex, int toIndex)

移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。

void trimToSize()

将此 ArrayList 实例的容量调整为列表的当前大小。

LinkedList

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列

此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

LinkedList同时实现了Deque、Queue、List接口,所以除了List接口定义的方法之外,它还有很多用于操作Queue、Deque的方法

扩展的方法列表:

void addFirst(E e)

将指定元素插入此列表的开头。

void addLast(E e)

将指定元素添加到此列表的结尾。

Iterator<E> descendingIterator()

返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。

E element()

获取但不移除此列表的头(第一个元素)。

E getFirst()

返回此列表的第一个元素。

E getLast()

返回此列表的最后一个元素。

boolean offer(E e)

将指定元素添加到此列表的末尾(最后一个元素)。

boolean offerFirst(Ee)

在此列表的开头插入指定的元素。

boolean offerLast(E e)

在此列表末尾插入指定的元素。

E peek()

获取但不移除此列表的头(第一个元素)。

E peekFirst()

获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。

E peekLast()

获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。

E poll()

获取并移除此列表的头(第一个元素)

E pollFirst()

获取并移除此列表的第一个元素;如果此列表为空,则返回 null。

E pollLast()

获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。

E pop()

从此列表所表示的堆栈处弹出一个元素。

void push(E e)

将元素推入此列表所表示的堆栈。

E removeFirst()

移除并返回此列表的第一个元素。

boolean removeFirstOccurrence(Object o)

从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。

E removeLast()

移除并返回此列表的最后一个元素。

boolean removeLastOccurrence(Object o)

从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)。

集合框架之List接口的更多相关文章

  1. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  2. 第18章 集合框架(2)-Set接口

    第18章 集合框架(2)-Set接口 Set是Collection子接口,模拟了数学上的集的概念 Set集合存储特点 1.不允许元素重复 2.不会记录元素的先后添加顺序 Set只包含从Collecti ...

  3. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  4. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  5. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  6. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  7. Java集合框架之Set接口浅析

    Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...

  8. Java集合框架之List接口浅析

    Java集合框架之List接口浅析 一.List综述: 毫无疑问List接口位于java.util包下,继承自 Collection接口 存储元素的特点: 有序可重复(有序:即存进去是什么顺序,取出来 ...

  9. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  10. Java集合框架中List接口的简单使用

    Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...

随机推荐

  1. 直接插入排序算法:ArrayList实现和数组实现

    直接插入排序算法思想: 排序区间R[1..n]: 在排序的过程中,整个排序区间被分为两个子区间: 有序区R[ 1 ... i-1 ]和无序区R[ i ... n ]: 共进行n-1趟排序,每趟排序都是 ...

  2. Android ART、Dalvik在multidex上的差异、关联

    为提升应用运行性能,谷歌官方从5.0(api level:21)版本开始,将虚拟机运行环境默认为ART, 此处主要研究ART.Dalvik在multidex处理上的差异和关联,做了一个简单的手绘,如下 ...

  3. TensorFlow学习笔记(UTF-8 问题解决 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte)

    我使用VS2013  Python3.5  TensorFlow 1.3  的开发环境 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff ...

  4. 【BZOJ1087】【SCOI2005】互不侵犯King

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...

  5. 例10-5 uva12716

    题意:gcd(a,b) = a^b,( 1≤ a , b ≤ n) 思路: ① a^b = c, 所以 a^c = b,而且c是a的约数,枚举a,c,再gcd判断 ② 打表可知 a-b = c,而且a ...

  6. poj3580 splay树 REVOVLE循环

    SuperMemo Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12795   Accepted: 3989 Case T ...

  7. 【集训第三天·疯狂训练】哦,顺带学习了manacher

    虽然说是疯狂训练吧,但是也没写多少题,就把伸展树的操作熟悉了一下,ac了5个题目. 一整天没啥可吐槽的,除了昨天在机房打游戏的某位朋友翻车后和教练谈了谈心2333 说题吧.. 1.BZOJ1208 H ...

  8. Python中模块之logging & subprocess的讲解

    subprocess & logging模块的介绍 1. subprocess 该模块替代了os.system & os.pawn*所实现的功能. 2. logging 1. 日志五大 ...

  9. C语言程序设计第六次作业——循环结构(2)

    C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...

  10. 10分钟 5步 发布以太坊 ERC20 代币

    1.安装 METAMASK Brings Ethereum to your browser 一个可以浏览器上进行操作的以太坊钱包,推荐 Chrome. Chrome 插件安装地址: https://c ...