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类似,实现读写分离,不需要进行同步设置,适合用来维持一个频繁读取而很少修改的事件处理列表.
java 集合框架(十)List的更多相关文章
- java 集合框架(十六)Map
一.概述 Map是一个包含键值对的集合,一个map不能有重复的键(key),而且每个键至多只能对应一个值.Map同Collection一样,它的所有通用实现都会提供一个转换器构造函数,接收一个Map类 ...
- java 集合框架(十四)Queue
一.概述 Queue一种队列结构集合,用来存储将要进行处理的元素.通常以FIFO的方式排序元素,但这并不是必须的.比如优先度队列就是一个例外,它是以元素的值来排序.但无论怎样,每个Queue的实现都必 ...
- java 集合框架(十五)Deque
一.概述 Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.D ...
- 【集合系列】- 初探java集合框架图
一.集合类简介 Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)"丢进"该容器中.从Java 5 增加了泛型以后,Java集合可以记住容器中对象的数 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
- Java集合框架之map
Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...
随机推荐
- jenkins之角色授权[六]
标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 有时候我们公司里面可能有好几个开发团队,当你做完jenkins后,对于测试环 ...
- 编译和解释性语言和python运行方式
1.编译型语言和解释性语言 编译型语言:在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了.程序执行效率高,依赖编译器,跨平台性差些.如C. ...
- 《.NET 设计规范》第 7 章:异常
第 7 章:异常 异常与各种面向对象语言集成得非常好. 异常增强了 API 的一致性. 在用返回值来报告错误时,错误处理的代码与可能会发生错误的代码距离总是很近. 更容易使错误处理的带码全局化. 错误 ...
- ABP官方文档翻译 7.2 Hangfire集成
Hangfire集成 介绍 ASP.NET Core集成 ASP.NET MVC 5.x集成 面板授权 介绍 Hangfire是一个综合的后台job管理器.你可以 把它集成到ABP,用来取代默认的后台 ...
- JS高级程序设计第3章读书笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Selenium_WebDriver_多窗口切换
摘要: 版权声明:本文为博主原创文章,转载请注明出处. 在页面操作过程中有时候点击某个链接会弹出新的窗口,这时我们如果需要操作新打开的页面,就需要将主机切换到新打开的窗口上再进行操作,比如博客园精华页 ...
- 随机手机号和身份证号码(python)
在使用selenium2 python自动化过程中,用户添加的时候程序设置的手机号和身份证号码是唯一的,这方面python代码可以实现,以下是调试成功,可以实现的. 具体代码如下 身份证需要下载dis ...
- ConcurrenHashMap源码分析(二)
本篇博客的目录: 一:put方法源码 二:get方法源码 三:rehash的过程 四:总结 一:put方法的源码 首先,我们来看一下segment内部类中put方法的源码,这个方法它是segment片 ...
- Xshell配置SSH秘钥登录
秘钥生成 生成公钥 工具 -> 新建用户秘钥生成向导 -> 下一步 -> 点击下一步,输入密码: 点击下一步 点击保存为文件,完成. 生成私钥 工具 -> 用户秘钥管理者 选中 ...
- Nginx的try_files指令和命名location使用实例
Nginx的配置语法灵活,可控制度非常高.在0.7以后的版本中加入了一个try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率. 下面是一个使用实 ...