详解 List接口
本篇博文所讲解的这两个类,都是泛型类(关于泛型,本人在之前的博文中提到过),我们在学习C语言时,对于数据的存储,用的差不多都是数组和链表。
但是,在Java中,链表就相对地失去了它的存在价值,因为Java没有指针,但处处是指针。
但是,本篇博文所讲解的List,并不是完全地比数组好,能够取代数组,因为我们若是要用Java去打一些算法比赛,抑或是参加公司的面试时遇到算法题,想用Java去做的话,数组和List都分别有应用场景。
但是,Java并不是打算法最好的语言,现前阶段最好的打算法语言还是C/C++。扯多了,那么,现在就开始本篇博文的讲解吧:
(请关注 本人“Collection集合”博文——《详解 Collection集合》)
List接口:
特点:
- 元素有序;
- 每一个元素都存在一个索引;
- 元素可以重复
常用方法;
- void add(int index,E element)-----在指定索引处添加元素
- E remove(int index)------------------移除指定索引处的元素 返回的是移除的元素
- E get(int index)------------------------获取指定索引处的元素
- E set(int index,E element)----------更改指定索引处的元素 返回的而是被替换的元素
- Iterator < E > iterator()---------------根据当前List的存储的数据获取迭代器
- int indexOf(Object o)------------------返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
- int lastIndexOf(Object o)------------返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1
- Object[] toArray()----------------------返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)
继承体系:
父接口:
Collection泛型接口、Iterable泛型接口
子实现类:
ArrayList, LinkedList, Vector,
Stack, AbstractList, AbstractSequentialList, AttributeList, CopyOnWriteArrayList, RoleList, RoleUnresolvedList
看到父接口有Iterable接口,我们就知道了它可以获取迭代器(相关知识点详解请观看本人博文——《详解 迭代器 —— Iterator接口、 ListIterator接口 与 并发修改异常》)
那么,在本篇博文中,本人就来讲解一般我们的平常应用中最常见的三个实现子类——
首先,本人先来讲解一下三者各自的特点:
ArrayList:
- 底层数据结构是数组,查询快,增删慢
- 线程不安全,效率高
- 只能存储同一类型 或 定义类型的子类 的元素
Vector:
- 底层数据结构是数组,查询快,增删慢
- 线程安全,效率低
- 可存储不同类型的元素
LinkedList:
- 底层数据结构是链表,查询慢,增删快
- 线程不安全,效率高
- 只能存储同一类型 或 定义类型的子类 的元素
ArrayList:
ArrayList是泛型类,可以存储 任意一种 指定类型数据。
ArrayList最大的好处就是“动态”,使用时可以不必关心数组空间的大小。因为ArrayList可以根据实际存储的数据来调整这个容器空间的大小。
但是,我们要注意的一点是 —— ArrayList的底层是通过数组实现的
我们在访问数组时,也可以采用下标遍历的方法。
下面本人来展示一下使用方法:
package com.mec.study;
import java.util.ArrayList;
public class AboutArrayList {
public static void main(String args[]) {
int[] a = {1, 2, 3, 4, 5};
ArrayList<Integer>arr = new ArrayList<>();
//初始化int 型 ArrayList 对象 array(注意:<>表示ArrayList是一个泛类)
for(int i = 0; i<a.length; i++) {
arr.add(a[i]);
//将a数组中的值,传递到arr数组中去
}
for(int num : arr) { //这条语句等价于:int i = 0; num=a[i], i<a.length; i++
System.out.println(num);
}
}
}
现在,我们来看看运行结果:
上述代码中:int num : arr 一行详解:
“:”前是元素,元素的类型必须与ArrayList的泛型一致;
这个元素就是后面数组的每一个元素,而且是按照下标顺序从前往后取的
上面的操作方法,对于LinkedList也是同样适用的,但二者还是有区别的,本人在《数据结构与算法》专栏的博文中曾将提到过:
数组是连续存储结构,存储空间利用率高,支持随机定位。但是数组的空间大小是固定的,所以,对于元素的增添和删除,时间复杂度就比较高(O(n));
链表是非连续存储结构,存储空间利用率底,只能顺序定位,但空间大小可变,所以,对于元素的增添和删除,时间复杂度就很低(O(1))。
所以,在这里,本人再将《数据结构与算法》专栏中提到的知识点强调一下:
若我们定义的存储空间,大多数是需要追加、查找 甚至是 排序操作,就用ArrayList类列表;
若我们定义的存储空间,大多数是需要数据的插入、删除等操作,就用LinkedList类列表。
那么,虽然 LinkedList的基本知识点和ArrayList 类似,接下来,本人来通过 LinkedList使用例子来展示下对于 LinkedList的使用:
LinkedList
同样地,我们要注意的一点是 —— LinkedList的底层是通过链表实现的
我们直接看代码:
我们借用之前博文中编写的Complex类:
package com.mec.study;
import java.util.LinkedList;
import com.mec.study.complex.Complex;
public class AboutLinkedList {
public static void main(String[] args) {
LinkedList<Complex> complexList = new LinkedList<>();
complexList.add(new Complex());
complexList.add(new Complex(2, 3));
complexList.add(new Complex(4, 5));
for(Complex c : complexList) {
System.out.println(c);
}
}
}

那么,接下来,本人要讲一个非常重要的方法——indexOf() (元素定位法),我们直接上代码:
为了不让同学们感到复杂疑惑,本人在上面的代码的基础上直接进行追加:
package com.mec.study;
import java.util.LinkedList;
import com.mec.study.complex.Complex;
public class AboutLinkedList {
public static void main(String[] args) {
LinkedList<Complex> complexList = new LinkedList<>();
complexList.add(new Complex());
complexList.add(new Complex(2, 3));
complexList.add(new Complex(4, 5));
for(Complex c : complexList) {
System.out.println(c);
}
Complex c = new Complex(2, 3);
//我们要讲解的方法
int index = complexList.indexOf(c);
System.out.println(index);
}
}

可以看到,这个方法定义:
数组的下标从0开始,这和我们C语言中的下标定义是一样的。
但是,其实这个方法有很深邃的内涵——它会自动调用equals()方法进行“相等判断”
那么,就有同学想起来了,我们在Complex类中已经将equal()方法覆盖了,那么,是不是用Object类所给的equal()方法就要出错呢?
下面本人将对equal()方法的覆盖注释起来,观看运行结果:

可以看到,返回值是-1,没错,上述的猜想是正确的:
调用indexOf()方法,就会自动调用equals()方法,
若不匹配,则返回-1;
若匹配,则返回下标最小的、匹配的元素的下标。
最后一个知识点——contains()方法 (判断元素是否存在的方法):
我们还是直接上代码:
package com.mec.study;
import java.util.LinkedList;
import com.mec.study.complex.Complex;
public class AboutLinkedList {
public static void main(String[] args) {
Complex c = new Complex(2, 3);
LinkedList<Complex> complexList = new LinkedList<>();
complexList.add(new Complex());
complexList.add(new Complex(2, 3));
complexList.add(new Complex(4, 5));
complexList.add(new Complex(2, 3));
//我们要讲解的方法
System.out.println(complexList.contains(c));
}
}

没错,看到这里,基本上我们就能得出结论了:
contains()方法和 indexOf()方法 一样,这个方法也会调用 equals()方法,
而且返回值遵循以下原则:
若该数组中存在该元素,则返回true;
若不存在,则返回false。
总之呢,我们只要时刻记住,ArrayList的本质是数组,LinkedList的本质是链表,那么,在需要的时候,我们就会自然而然会根据以往的编程经验选择出最优方案。
至于有关这两个类的API,本人在本片博文中就仅仅讲解如上几种,其余的API大家在使用时 识名 即可 知其意,不必去死记硬背。
Vector:
概述:
Vector 类可以实现可增长的对象数组 ,
Vector 容器中可以存储 不同类型的元素
Vector 是同步的,即线程安全的
常用特有方法:
- public void addElement(E obj)
- public E elementAt(int index)
- public Enumeration elements()
本人还是来展示下对这个类的方法的使用:
package about_vector;
import java.util.Vector;
public class Test {
public static void main(String[] args) {
Vector vector = new Vector();
vector.addElement(30);
vector.addElement(57.3);
vector.addElement("youzg666");
vector.addElement(new int[] {1 , 2 , 3});
System.out.println(vector);
System.out.println(vector.elementAt(2));
System.out.println(vector.elements());
}
}
那么,现在本人来展示下输出结果:

上面的例子并不是表明Vector只有这几种方法,
一般的List接口能掉用的方法,这个类都可以调用
那么,本篇博文的主要内容就讲解完了,若是对上述知识点或代码有任何疑惑、意见或者建议,请在下方评论区提出,本人将尽早予以答复,觉得有所帮助的同学请留下小赞赞,谢谢!!!
(Collection链接:https:////www.cnblogs.com/codderYouzg/p/12416566.html)
(集合总集篇链接:https://www.cnblogs.com/codderYouzg/p/12416560.html)
详解 List接口的更多相关文章
- 详解EBS接口开发之库存事务处理采购接收--补充
除了可以用 详解EBS接口开发之库存事务处理采购接收的方法还可以用一下方法,不同之处在于带有批次和序列控制的时候实现方式不同 The script will load records into ...
- 详解EBS接口开发之采购申请导入
更多内容可以参考我的博客 详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*+++++++ ...
- 详解EBS接口开发之库存事务处理批次更新
库存事务处理批次有时候出现导入错误需要更新可使用次程序更新,批次导入可参考博客 详解EBS接口开发之库存事务处理-物料批次导入 http://blog.csdn.net/cai_xingyun/art ...
- 供应商API补充(详解EBS接口开发之供应商导入)(转)
原文地址 供应商导入的API补充(详解EBS接口开发之供应商导入) --供应商 --创建 AP_VENDOR_PUB_PKG.Create_Vendor ( p_api_version IN NUM ...
- 详解 Set接口
(请关注 本人"集合"总集篇博文--<详解 Collection接口>) 在Collection接口的子接口中,最重要的,也是最常见的两个-- List接口 和 Set ...
- 集合类 Contains 方法 深入详解 与接口的实例
.Net 相等性:集合类 Contains 方法 深入详解 http://www.cnblogs.com/ldp615/archive/2009/09/05/1560791.html 1.接口的概念及 ...
- 详解EBS接口开发之应收款处理
参考实例参考:杜春阳 R12应收模块收款API研究 (一)应收款常用标准表简介 1.1 常用标准表 如下表中列出了与应收款处理相关的表和说明: 表名 说明 其他信息 AR_BATCHES_ALL ...
- 详解EBS接口开发之库存事务处理采购接收和退货
(一)接收&退货常用标准表简介 1.1 常用标准表 如下表中列出了与采购接收&退货导入相关的表和说明: 表名 说明 其他信息 RCV_TRANSACTIONS 采购接收事务表 事务 ...
- 详解EBS接口开发之供应商导入
(一)供应商常用标准表简介 1.1 常用标准表 如下表中列出了与供应商相关的表和说明: 表名 说明 其他信息 ap_suppliers 供应商头表 供应商的头信息如:供应商名.供应商编码.税号等 ...
随机推荐
- MySql InnoDB中的锁研究
# MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...
- 从DeepNet到HRNet,这有一份深度学习“人体姿势估计”全指南
从DeepNet到HRNet,这有一份深度学习"人体姿势估计"全指南 几十年来,人体姿态估计(Human Pose estimation)在计算机视觉界备受关注.它是理解图像和视频 ...
- PMP学习笔记(一)
前9节列举出了很多例子来辅助理解什么是项目管理,在学习的过程当中听到了一些名词,查询过一些资料之后,在这里梳理出来 1.关键路径法 关键路径是指设计中从输入到输出经过的延时最长的逻辑路径.优化关键路径 ...
- 解决pycharm不能导入bs4模块问题
问题描述: 在导入bs4模块时有报错提示 “ Traceback (most recent call last): File "E:/project/code/py-pengfu/py-pf ...
- Ali_Cloud++:安装 RabbitMQ安装及环境配置
注意事项:rabbitMA版本和erlang并不是同步更新的,会出现版本不匹配,安装不了. 两都版本对应 参考官网文档 其它下载地址 1):Erlang安装 (因为是erlant语言编写的, ...
- JS 剑指Offer(五) 二叉树的重建
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目分析:已知二叉树的前序和中序遍历,根据前序遍历和中序遍历的规则,前序遍历的第一 ...
- 面试必备:详解Java I/O流,掌握这些就可以说精通了?
@TOC Java IO概述 IO就是输入/输出.Java IO类库基于抽象基础类InputStream和OutputStream构建了一套I/O体系,主要解决从数据源读入数据和将数据写入到目的地问题 ...
- Blazor入门笔记(3)-C#与JS交互
1.环境 VS2019 16.5.1 .NET Core SDK 3.1.200 Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.前言 Bl ...
- H - 蓬松的头发 HDU - 5504
给你一个N个整数的序列. 你应该选择一些数字(至少一个),并使它们的乘积尽可能大. 它保证你在初始序列中选择的任何数的乘积的绝对值不会大于263−1. Input 在第一行有一个数字T(表示样例数). ...
- 《Python Enhancement Proposal #8》要点 学习摘录
<Python Enhancement Proposal #8> (8号python增强提案)又叫PEP8,他针对的python代码格式而编订的风格指南. 空白 使用space来表示缩进, ...