ArrayList和LinkedList类的用法及区别

List 是一个有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引,第一个添加到 List 集合中的元素的索引为 0,第二个为 1,依此类推。

List 实现了 Collection 接口,它主要有两个常用的实现类:ArrayList 类和 LinkedList 类。

ArrayList 类

ArrayList 类实现了可变数组的大小,存储在内的数据称为元素。它还提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好。使用 ArrayList 创建的集合,允许对集合中的元素进行快速的随机访问,不过,向 ArrayList 中插入与删除元素的速度相对较慢。

ArrayList 类的常用构造方法有如下两种重载形式:

	ArrayList():构造一个初始容量为 10 的空列表。ArrayList(Collection<?extends E>c):构造一个包含指定 Collection 元素的列表,这些元素是按照该 Collection 的迭代器返回它们的顺序排列的。

ArrayList 类除了包含 Collection 接口中的所有方法之外,还包括 List 接口中提供的如下表所示的方法。

方法名称说明
E get(int index)获取此集合中指定索引位置的元素,E 为集合中元素的数据类型
int index(Object o)返回此集合中第一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1
int lastIndexOf(Object o)返回此集合中最后一次出现指定元素的索引,如果此集合不包含该元素,则返回 -1
E set(int index, Eelement)将此集合中指定索引位置的元素修改为 element 参数指定的对象。此方法返回此集合中指定索引位置的原元素
List subList(int fromlndex, int tolndex)返回一个新的集合,新集合中包含 fromlndex 和 tolndex 索引之间的所有元素。包含 fromlndex 处的元素,不包含 tolndex 索引处的元素

注意:当调用 List 的 set(int index, Object element) 方法来改变 List 集合指定索引处的元素时,指定的索引必须是 List 集合的有效索引。例如集合长度为 4,就不能指定替换索引为 4 处的元素,也就是说这个方法不会改变 List 集合的长度。

使用 ArrayList 类向集合中添加三个商品信息,包括商品编号、名称和价格,然后遍历集合输出这些商品信息。

1 . 创建一个商品类 Product,在该类中定义 3 个属性和 toString() 方法,分别实现 setter/getter 方法。代码的实现如下:

public class Product {// 商品类private int id; // 商品编号private String name; // 名称private float price; // 价格public Product(int id, String name, float price) {this.name = name;this.id = id;this.price = price;}// 这里是上面3个属性的setter/getter方法,这里省略public String toString() {return "商品编号:" + id + ",名称:" + name + ",价格:" + price;}
}

2 . 创建一个测试类,调用 Product 类的构造函数实例化三个对象,并将 Product 对象保存至 ArrayList 集合中。最后遍历该集合,输出商品信息。实现如下:

public class Test {public static void main(String[] args) {Product pd1 = new Product(4, "木糖醇", 10);Product pd2 = new Product(5, "洗发水", 12);Product pd3 = new Product(3, "热水壶", 49);List list = new ArrayList(); // 创建集合list.add(pd1);list.add(pd2);list.add(pd3);System.out.println("*************** 商品信息 ***************");for (int i = 0; i < list.size(); i++) {// 循环遍历集合,输出集合元素Product product = (Product) list.get(i);System.out.println(product);}}
}

该示例中的 ArrayList 集合中存放的是自定义类 Product 的对象,这与存储的 String 类的对象是相同的。与 Set 不同的是,List 集合中存在 get() 方法,该方法可以通过索引来获取所对应的值,获取的值为 Object 类,因此需要将该值转换为 Product 类,从而获取商品信息。

该程序的运行结果如下所示。

*************** 商品信息 ***************
商品编号:4,名称:木糖醇,价格:10.0
商品编号:5,名称:洗发水,价格:12.0
商品编号:3,名称:热水壶,价格:49.0

使用 List 集合时需要注意区分 indexOf() 方法和 lastIndexOf() 方法。前者是获得指定对象的最小索引位置,而后者是获得指定对象的最大索引位置。前提条件是指定的对象在 List 集合中有重复的对象,否则这两个方法获取的索引值相同。

示例 indexOf() 方法和 lastIndexOf() 方法的区别。

public static void main(String[] args) {List list = new ArrayList();list.add("One");list.add("|");list.add("Two");list.add("|");list.add("Three");list.add("|");list.add("Four");System.out.println("list 集合中的元素数量:" + list.size());System.out.println("list 集合中的元素如下:");Iterator it = list.iterator();while (it.hasNext()) {System.out.print(it.next() + "、");}System.out.println("\n在 list 集合中'丨'第一次出现的位置是:" + list.indexOf("|"));System.out.println("在 list 集合中'丨'最后一次出现的位置是:" + list.lastIndexOf("|"));
}

上述代码创建一个 List 集合 list,然后添加了 7 个元素,由于索引从 0 开始,所以最后一个元素的索引为 6。输出结果如下:

list 集合中的元素数量:7
list 集合中的元素如下:
One、|、Two、|、Three、|、Four、
在 list 集合中'|'第一次出现的位置是:1
在 list 集合中'|'最后一次出现的位置是:5

使用 subList() 方法截取 List 集合中部分元素时要注意,新的集合中包含起始索引位置的元素,但是不包含结束索引位置的元素。例如,subList(1,4) 方法实际截取的是索引 1 到索引 3 的元素,并组成新的 List 集合。

subList() 方法的具体用法。

public static void main(String[] args) {List list = new ArrayList();list.add("One");list.add("Two");list.add("Three");list.add("Four");list.add("Five");list.add("Six");list.add("Seven");System.out.println("list 集合中的元素数量:" + list.size());System.out.println("list 集合中的元素如下:");Iterator it = list.iterator();while (it.hasNext()) {System.out.print(it.next() + "、");}List sublist = new ArrayList();sublist = list.subList(2, 5); // 从list集合中截取索引2~5的元素,保存到sublist集合中System.out.println("\nsublist 集合中元素数量:" + sublist.size());System.out.println("sublist 集合中的元素如下:");it = sublist.iterator();while (it.hasNext()) {System.out.print(it.next() + "、");}
}

输出结果如下:

list 集合中的元素数量:7
list 集合中的元素如下:
One、Two、Three、Four、Five、Six、Seven、
sublist 集合中元素数量:3
sublist 集合中的元素如下:
Three、Four、Five、

LinkedList类

LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高,但是 LinkedList 类随机访问元素的速度则相对较慢。这里的随机访问是指检索集合中特定索引位置的元素。

LinkedList 类除了包含 Collection 接口和 List 接口中的所有方法之外,还特别提供了下表所示的方法。

方法名称说明
void addFirst(E e)将指定元素添加到此集合的开头
void addLast(E e)将指定元素添加到此集合的末尾
E getFirst()返回此集合的第一个元素
E getLast()返回此集合的最后一个元素
E removeFirst()删除此集合中的第一个元素
E removeLast()删除此集合中的最后一个元素

在仓库管理系统中要记录入库的商品名称,并且需要输出第一个录入的商品名称和最后—个商品名称。下面使用 LinkedList 集合来完成这些功能,代码如下:

public class Test {public static void main(String[] args) {LinkedList<String> products = new LinkedList<String>(); // 创建集合对象String p1 = new String("六角螺母");String p2 = new String("10A 电缆线");String p3 = new String("5M 卷尺");String p4 = new String("4CM 原木方板");products.add(p1); // 将 p1 对象添加到 LinkedList 集合中products.add(p2); // 将 p2 对象添加到 LinkedList 集合中products.add(p3); // 将 p3 对象添加到 LinkedList 集合中products.add(p4); // 将 p4 对象添加到 LinkedList 集合中String p5 = new String("标准文件夹小柜");products.addLast(p5); // 向集合的末尾添加p5对象System.out.print("*************** 商品信息 ***************");System.out.println("\n目前商品有:");for (int i = 0; i < products.size(); i++) {System.out.print(products.get(i) + "\t");}System.out.println("\n第一个商品的名称为:" + products.getFirst());System.out.println("最后一个商品的名称为:" + products.getLast());products.removeLast(); // 删除最后一个元素System.out.println("删除最后的元素,目前商品有:");for (int i = 0; i < products.size(); i++) {System.out.print(products.get(i) + "\t");}}
}

如上述代码,首先创建了 5 个 String 对象,分别为 p1、p2、p3、p4 和 p5。同时将 p1、 p2、p3 和 p4 对象使用 add() 方法添加到 LinkedList 集合中,使用 addLast() 方法将 p5 对象添加到 LinkedList 集合中。分别调用 LinkedList 类中的 getFirst() 方法和 getLast() 方法获取第一个和最后一个商品名称。最后使用 removeLast() 方法将最后一个商品信息删除,并将剩余商品信息打印出来。

LinkedList 中的 是 Java 中的泛型,用于指定集合中元素的数据类型,例如这里指定元素类型为 String,则该集合中不能添加非 String 类型的元素。

运行程序,执行结果如下:

*************** 商品信息 ***************
目前商品有:
六角螺母    10A 电缆线    5M 卷尺    4CM 原木方板    标准文件夹小柜   
第一个商品的名称为:六角螺母
最后一个商品的名称为:标准文件夹小柜
删除最后的元素,目前商品有:
六角螺母    10A 电缆线    5M 卷尺    4CM 原木方板

ArrayList 类和 LinkedList 类的区别

ArrayList 与 LinkedList 都是 List 接口的实现类,因此都实现了 List 的所有未实现的方法,只是实现的方式有所不同。

ArrayList 是基于动态数组数据结构的实现,访问元素速度优于 LinkedList。LinkedList 是基于链表数据结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于 ArrayList。

对于快速访问对象的需求,使用 ArrayList 实现执行效率上会比较好。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高。

不同的结构对应于不同的算法,有的考虑节省占用空间,有的考虑提高运行效率,对于程序员而言,它们就像是“熊掌”和“鱼肉”,不可兼得。高运行速度往往是以牺牲空间为代价的,而节省占用空间往往是以牺牲运行速度为代价的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARMA模型的性质之ARMA模型

目录 一、ARMA模型的定义 二、平稳条件与可逆条件 三、传递形式与逆转形式 四、ARMA(p,q)模型的统计性质 1.均值 2.自协方差函数 3.自相关系数 4.ARMA(p,q)模型自相关系数拖尾&#xff0c;偏自相关系数拖尾 小结 一、ARMA模型的定义 具有如下结构的模型称为自回归移动…

R之Excel文件读取与程序包的安装调用

目录 方法一 方法二 1.用命令安装 2.从下拉菜单安装 三、加载所需安装包 方法一 方法二 四、使用新程序包读取数据 方法一 另存为 .csv 文件 这是wps的另存为 然后选择位置&#xff0c;重命名或更改格式为 .csv 这是excel 的另存为 文件 —— 另存为 —— 选择位置 …

Java遍历Map集合的四种方式

Map 有两组值&#xff0c;因此遍历时可以只遍历值的集合&#xff0c;也可以只遍历键的集合&#xff0c;也可以同时遍历。Map 以及实现 Map 的接口类&#xff08;如 HashMap、TreeMap、LinkedHashMap、Hashtable 等&#xff09;都可以用以下几种方式遍历。 1 . 在 for 循环中使…

diag开关什么意思_双控开关接线图_一灯双控开关接线图_单联双控开关接线图_双控开关接线图实物图...

电工学习网&#xff1a;www.diangon.com关注电工学习网官方微信公众号“电工电气学习”&#xff0c;收获更多经验知识。双控开关接线图_一灯双控开关接线图_单联双控开关接线图_双控开关接线图实物图现在市场上面所出售的开关种类非常的多&#xff0c;双控开关正好能够满足人们…

Office 安装MathType7.4 未找到MathPage.wll等问题

目录 问题描述&#xff1a; 解决方法&#xff1a; 问题描述&#xff1a; MathType v7.4 简体中文版是一款功能很强大的数学公式编辑器,在很多地方都会用的&#xff0c;而wps就不能适应各种场合。 但是该软件总会因为不明原因,有时会出现找不到MathType.dll或者MathPage.wll文…

python导入excel加入折线图_利用python向excel文件写数据并绘制折线图

依赖 python 2.7.15 xlswriter&#xff08;可以使用pip insall xlswriter&#xff09; 具体实现 #!/usr/bin/env python # -*- coding:utf-8 -*- import xlsxwriter # Create a workbook and add a worksheet. workbook xlsxwriter.Workbook(Expenses01.xlsx) worksheet work…

Collections类操作集合详解

Collections 类是 Java 提供的一个操作 Set、List 和 Map 等集合的工具类。Collections 类提供了许多操作集合的静态方法&#xff0c;借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。 排序&#xff08;正向和逆向&#xff09; Collections 提供了如下方法用…

平稳序列的预测和拟合之单位根检验

目录 1.建模步骤 2.单位根检验 2.1 DF检验&#xff08;以AR(1)模型为例&#xff09; DF检验的等价表达 DF检验的三种类型 R语言单位根检验&#xff1a; 2.2 ADF检验 ADF检验的三种类型 小结 1.建模步骤 2.单位根检验 对平稳序列建模&#xff0c;首先要确定序列是平稳的…

如何自己去写一个鼠标驱动_为什么要用哈密顿采样器(Hamiltonian Monte Carlo),以及如何自己写一个...

背景介绍&#xff1a;&#xff08;了解采样的可以跳过&#xff09;1&#xff09;为什么需要采样&#xff1a;简单的分布&#xff0c;比如高斯、exponential、gamma等等的样本都可以直接用numpy.random生成&#xff0c;但复杂的分布需要采样器生成。在贝叶斯、概率编程里面&…

Iterator(迭代器)遍历Collection集合元素

Iterator&#xff08;迭代器&#xff09;是一个接口&#xff0c;它的作用就是遍历容器的所有元素&#xff0c;也是 Java 集合框架的成员&#xff0c;但它与 Collection 和 Map 系列的集合不一样&#xff0c;Collection 和 Map 系列集合主要用于盛装其他对象&#xff0c;而 Iter…

java inputstream read_20191209-java部分流处理

流:流一般分为输入流(InputStream)和输出流(OutputStream)两类.但这种划分并不是绝对的.在Java开发环境中,主要是由包http://java.io中提供的一系列的类和接口来实现输入和输出处理.标准输入和输出处理则是由包java.lang中提供的类来处理的,但这些类又都是从包http://java.io中…

平稳序列的预测和拟合之模型识别

目录 1.计算样本相关系数和偏自相关系数 2.模型识别 模型定阶的困难 样本相关系数的近似分布及模型定阶经验方法 例题&#xff1a; 2.参数估计 常用估计方法&#xff1a; 1.矩估计 2.极大似然估计 3.最小二乘估计 R中&#xff0c;参数估计用arima函数 例题 小结 1.计算…

python自增_Python的自增运算与Python变量的浅析

一、关于Python的自增运算 学了C/C后再学习Python&#xff0c;不自觉地就打出了自增运算符&#xff0c;但是发现Python解释器不认识&#xff0c;查了下资料&#xff0c;发现Python中没有这个运算符。这里暂时不探讨自增运算符的内部实现原理&#xff0c;从语言设计角度来说&…

使用Lambda表达式遍历Iterator迭代器

Java 8 为 Iterator 引入了一个 forEachRemaining(Consumer action) 默认方法&#xff0c;该方法所需的 Consumer 参数同样也是函数式接口。当程序调用 Iterator 的 forEachRemaining(Consumer action) 遍历集合元素时&#xff0c;程序会依次将集合元素传给 Consumer 的 accept…

平稳序列的预测和拟合之模型检验

目录 1.模型的显著性检验 R语言实现 例题 2.参数显著性检验 例题 小结 1.模型的显著性检验 检验模型的有效性&#xff08;对信息的提取是否充分) 判定原则&#xff1a; 一个好的拟合模型应该能够提取几乎所有的样本相关信息&#xff0c;即残差序列应该为白噪声序列。反之…

oracle数据如何获取游标中动态字段_原来Python自带了数据库,用起来真方便!

Python大数据分析记录 分享 成长Python作为数据科学主流语言&#xff0c;被广泛用于数据读存、处理、分析、建模&#xff0c;可以说是无所不能。数据一般存放在本地文件或者数据库里&#xff0c;之前介绍过如何使用python读取本地文件&#xff0c;也对# PyMySQL、cx_Oracle…

使用foreach循环遍历Collection集合

使用 Java 5 提供的 foreach 循环迭代访问集合元素&#xff0c;而且更加便捷。示范了使用 foreach 循环来迭代访问集合元素。 public class ForeachTest {public static void main(String[] args) {// 创建一个集合Collection objs new HashSet();objs.add("百度Java教程…

平稳序列的预测和拟合之模型优化

目录 前提 准则 1、AIC准则 2、SBC &#xff08;BIC)准则 优化 小结 前提 问题提出:模型通过检验&#xff0c;说明是有效的&#xff0c;但有效的模型不唯一。 下面我们用一个例子来解释一下&#xff1a; 例4-7:试对某次化学反应的70个过程数据序列进行拟合。 d<-r…

css中如何实现帧布局_浅谈web前端中的表格布局与CSS盒子布局

在web前端设计排版时我们可能会用到表格布局和divCSS布局&#xff0c;但现在主要使用后者&#xff0c;为何&#xff1f;今天我们来谈一谈两者之间的发展和原理。话不多说下面来干货发展过程上个世纪Web开发人员流行使用表格进行文档整体布局。因为当时大部分浏览器不支持CSS&am…

使用Predicate操作Collection集合

Java 8 起为 Collection 集合新增了一个 removeIf(Predicate filter) 方法&#xff0c;该方法将会批量删除符合 filter 条件的所有元素。该方法需要一个 Predicate 对象作为参数&#xff0c;Predicate 也是函数式接口&#xff0c;因此可使用 Lambda 表达式作为参数。 示例使用…