java 集合框架(十)List

一.概述

  List是一种有序集合,有时也被称为序列,可以有重复的元素.List集合相比Collection,除了直接继承的方法外,有以下拓展的操作方法

    • 位置访问---可以基于元素索引来操作元素,比如get,set,add,addAll和remove方法都支持这一点
    • 搜索---在集合中搜索一个特定对象,并返回它的索引,如indexOf和lastIndexOf方法
    • 迭代---除了继承自Collection中的迭代器,List还提供一个基于Iterator拓展的ListIterator迭代器
    • 视图---subList方法提供任意的范围操作方法

  同Set一样,List也要求强化equal和hashCode以使两个集合元素可以进行逻辑上的比较,而不考虑他们具体实现类的类型.当两个List有相同的元素时,他们被认为是相等的.

二.主要方法

修饰符和返回值 方法名 描述
添加功能
boolean add(int,E) 向集合指定索引处插入一个对象,该索引必须与集合连贯
boolean addAll(int,Colletion<? extend E>) 向集合指定索引处插入一个集合的所有元素,该索引必须与集合连贯
修改功能
E set(int,E) 将集合指定索引出元素修改为为指定对象,并返回旧元素
boolean remove(int) 移除指定索引处元素,集合元素数没有改变时返回false
void replaceAll(UnaryOperator<E>)  
获取功能
Object get(int) 获取指定索引处元素
int indexOf(Object) 从集合中查找给定对象第一次出现的索引,没有时返回-1
int lastIndexOf(Object) 从集合中查找给定对象最后一次出现的索引,没有时返回-1
List<E> subList(int,int) 返回指定索引之间元素组成的视图,包含起始索引元素,不包括结束索引元素
迭代器
ListIterator<E> listIterator() 获取集合序列迭代器
ListIterator<E> listIterator(int) 获取集合序列迭代器,并将指针指向给定索引元素前
void sort(Comparator<s super E>) 通过给定的排序器进行排序

  List大多操作元素的方法都与索引有关,所以需要注意可能引起索引越界的问题,add,remove,set,get,subList这些方法,当给定索引大于集合最大索引或者为负数时,都会抛出IndexOutOfBoundsException异常.

  List进行视图操作时,同Set集合类似,任何对视图的修改都会影响到原集合,反之亦然.

三.集合遍历

  List从自Collection继承的Iterator迭代器基础上,还根据List特点拓展提供了一个ListIterator迭代器,ListIterator继承自Iterator,所以它也有hasNext(),next(),remove()这些方法.List在获取ListIterator时,提供了两个方法,分别是listIterator()和listIterator(int),区别是有参数的方法在获取迭代器时,会把迭代器指针预先指向给定的索引元素前.ListIterator不仅可以正向遍历,也可以反向遍历,通过hasPrevious(),previous()两个方法,从方法名可以看出,这两个方法和hasNext(),next()类似,只是操作方向相反.ListIterator还提供几个方法nextIndex(),previousIndex(),add(E),set(E).

  nextIndex()和previousIndex()分别是获取迭代当前元素的前一个和后一个元素的索引,有这样两种情况需要注意

    1.指针指向集合头部元素前时,previousIndex()返回-1;

    2.指针指向集合尾部元素后时,nextIndex()返回list.size();

  add(E)方法会在迭代的时候,向指针移动的方向后面添加一个元素,而set(E)方法将当前迭代的元素修改为给定对象.

四.实现

  List的实现也分两种,通用实现和专用实现

  1.通用实现

  通用实现类主要有两个ArrayList和LinkedList.通常我们拿最多使用的是ArrayList,它对元素访问花费常量时间.但是如果频繁的对一个List头部插入元素,或者遍历集合删除元素的时候应该考虑使用LinkedList.在元素的增删上,LinkedList花费常量时间,ArrarList花费线性时间,在元素的访问上LinkedList花费线性时间,而ArrayList花费常量时间,这时因为ArrayList底层通过数组结构来实现,当对元素的增删时,需要重新开辟一份内存空间,并拷贝原来的数据,而LinkedList底层是链表结构,每个元素都是一个节点,节点在内存中的存储是无序随机的,每个节点都包含前一个节点和后一个节点的内存地址,从而实现查找,在增删元素的时候,只需要修改特定节点和其对其他节点的联系.

  综合考虑,当要使用LinkedList的时候最好测试一下LinkedList和ArrayList的性能,通常ArrayList表现更好些.

  List还有两个遗留实现Vector,Stack.Vector相比ArrayList是线程安全的,Stack是一种后进先出的数据结构(LIFO),继承自Vector.这两个实现都不推荐使用,他们是java早期版本的遗留,仅为向上兼容,可用Collections提供的静态同步封装器封装ArrayList代替Vector,虽然Vector性能要稍好些,使用Deque的通用实现代替Stack.

  2.专用实现

  List专用实现类主要有CopyOnWriteList,它和CopyOnWriteSet类似,实现读写分离,不需要进行同步设置,适合用来维持一个频繁读取而很少修改的事件处理列表.

时间: 2024-10-26 10:00:22

java 集合框架(十)List的相关文章

java 集合框架(十四)Queue

一.概述 Queue一种队列结构集合,用来存储将要进行处理的元素.通常以FIFO的方式排序元素,但这并不是必须的.比如优先度队列就是一个例外,它是以元素的值来排序.但无论怎样,每个Queue的实现都必须指定它的排序属性.Queue通常不定义元素的equal和hashCode方法. 二.主要方法 每个Queue方法都存在两种形式(1)操作失败则抛出异常(2)操作失败返回一个特定值,通常是null或者是false 操作类型 抛出异常 返回特定值 Insert add(e) offer(e) Remo

黑马程序员——JAVA集合框架学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 要学好java的集合框架,必须掌握此图: Java集合框架很全面,从大的来说.它包括两种类型: 1.一种是以collection为根接口的集合. 2.另一种是由map为根接口的<key,value>的“图”. 而collection之下的set接口和list接口又有不同: 1.Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制.

解析java集合框架

在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection Framework). Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了.这样就大大提高了编程效率. Java类集框架的优势:        1) 这种框架是高性能的.对基本类集(动态数组,链接表,树和散列表)的实现是高效率的.一般很少

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

我所理解Java集合框架的部分的使用(Collection和Map)

所谓集合,就是和数组类似--一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接口,长虚线表示抽象类,实线表示类,箭头表示实现接口或者继承)(在网络上找的图,不知道原作者,侵权请联系我删除)(总之,关系很复杂,所以不用记得这个图,只是用来吓吓人而已的). 下面贴上个人理解之精简版之Collection(集)和Map(地图?暂且这么理解吧),话说思维导图蛮好用,以下是两幅思维导图

【Java集合源码剖析】Java集合框架

Java集合工具包位于package java.util下.包含了一些常用的数据结构,如数组.链表(单/双向).树.栈.队列.哈希表等. Java集合框架大致可分为五部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的整体框架如下: 如图,Java集合类大致分为两大类:Collection和Map. Collection主要包括两部分:List和Set. List接口通常表示一个列表(数

Java集合框架总结(3)——TreeSet类的排序问题

Java集合框架总结(3)--TreeSet类的排序问题 TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序.(比较的前提:两个对象的类型相同). java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该