网站首页 > 博客文章 正文
Java 17 List 接口详解
思维导图
上一章我们说了 Collection 集合,这一篇我们来说说 List 接口的知识点。 List 遵循接口和实现分开, List 是接口。
定义如下:
public interface List<E> extends Collection<E>
对于List 接口实现常用实现有两种:使用 ArrayList 和 LinkedList,当然需要同步的时候可以使用 Vector 的集合实现。
对于 List 来讲它本身是个有序集合,当然这个有序是默认规则下, 并不是绝对的有序。 列表中可能包含重复的元素。
并且对于此接口的定义,可以控制每个元素在列表中的插入位置, 用户可以按元素的整数索引访问元素。 并且可以在列表中搜索相应的元素。
对于接口的定义
前缀为 A 代表着为抽象类, 为 D 代表着是 default 默认实现类。
为了实现过程中更加方便, 官方抽象出来了一个抽象类: AbstractList<E>。这个类中实现了那些通用的方法以及存储数据的基础操作。
AbstractList 抽象类的定义:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
ArrayList
最终的实现类 ArrayList 继承了该抽象类, 并实现了接口
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
可以看到该实现使用了主接口 List<E>, 以及随机访问接口, 还有就是克隆接口,主要用于 clone() 方法实现,以及序列化接口。
对于当前说的所有集合的接口和实现, 都提供了泛型使用。 具体泛型的使用方法, 参看之前写的泛型知识点。
最简单的用法。
写一个具体的例子, 把各种用法都演示一遍。 定义个用户类, 操作用户的相关信息, 用户的新增, 删除, 查询等操作。
定义用户的基本信息:
用户的操作处理业务类:
单元测试类,为了使编写的代码更好的插入, 写了两个工具方法, 一个是获得一个用户的基础信息封装。
private UserInfo randomUser(int index){
UserInfo userInfo = new UserInfo();
userInfo.setUid(String.valueOf(index));
userInfo.setName(getRandomChar() + getRandomChar());
userInfo.setStatus("有效");
return userInfo;
}
其中 getRandomChar 方法是为了获得一个汉字。 保证用户的名字随机出现。
public String getRandomChar() {
Random random = new Random();
int highCode = (176 + Math.abs(random.nextInt(39))); //B0 + 0~39(16~55) 一级汉字所占区
int lowCode = (161 + Math.abs(random.nextInt(93))); //A1 + 0~93 每区有94个汉字
byte[] b = new byte[2];
b[0] = (Integer.valueOf(highCode)).byteValue();
b[1] = (Integer.valueOf(lowCode)).byteValue();
String str = "";
try {
str = new String(b, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return str;
}
接下来进行测试。
首先保存 10 个用户, 然后保存之后, 就遍历当前的用户信息,接着删除一个用户, 用户编码为 2, 紧接着继续遍历一遍, 查看当前用户的最新信息, 当然可以单独获得一个确定的用户信息。 比方说编码为 5 的用户。
测试的结果如下:
LinkedList
对于 LinkedList 来说, 从使用方式上和 ArrayList 是一致的。 区别在于该实现是一个双重链表。 是一个可以保证数据顺序的一个集合。
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
因为实现了接口 Deque ,就代表着内部的实现一定基于双向队列实现。 也就是每一个元素都会有一个直接前驱和一个直接后驱, 想要了解更多,还是那句话, 数据结构的链表, 以及双向链表。
使用方式修改 UserService.java 的代码, 把保存用户数据的 ArrayList 修改为 LinkedList。其他的代码不需要改变。
测试代码:
Vector
该集合可以看作是一个可变大小的数组类型,通常用于需要使用同步调用的方式。
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
继承和实现和 ArrayList,区别就在同步上。
实现同步的方式就是方法前加上了关键字: synchronized
可以修改代码, 改成如下测试使用:
对于单独的方法, 不牵扯并发的情况下, 对于结果不会有变化。
List接口以及实现就先说到这, 肯定有很多的知识点,以及底层实现没有详细说明。
看了文章有问题随时评论区见。
更多内容可以参考官方文档API: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html
对于出现疑问, 第一解决方案就是第一手资料查阅。 只有见到当事人, 才能更好的解决问题嘛。
任何时间都没有简单的想想就可以搞定的, 都需要经历一定的准备,努力,运气加坚持。愿君有一个好心情继续学习。
猜你喜欢
- 2024-10-23 macOS Java多版本管理工具(mac javahome)
- 2024-10-23 jdk版本号命名规则在这里(jdk的版本都有哪些)
- 2024-10-23 带你认识JavaSE体系(javase java)
- 2024-10-23 WildFly30发布:2022年11月发布新版本
- 2024-10-23 JAVA模块化 – JDK生成JRE(生成java文档的jdk工具)
- 2024-10-23 Java之父也“带货”,劝大家放弃Java 8,尝试自己东家的Corretto
- 2024-10-23 还在为找不到Java项目练手发愁吗?巩固JavaSE,进攻高级技术必备
- 2024-10-23 29_数据类型_常量_字面常量 1,JavaSE【马士兵说】2
- 2024-10-23 Java|jdk(命令行环境下编译和运行) + netbeans(图形界面集成工具)
- 2024-10-23 JavaSE——数据类型流、内存流、打印流
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)