网站首页 > java教程 正文
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-11-02 java中判断list不为空的工具类(java list 判断空)
- 2024-11-02 如何在Java 8中处理对象类型的List集合:交集、并集、差集及去重
- 2024-11-02 java 集合类之List(二)(java中集合类有哪些)
- 2024-11-02 面试官问线程安全的List,看完再也不怕了
- 2024-11-02 Java List集合遍历数据的八种方式
- 2024-11-02 Java代码更高效地遍历List(java怎么遍历list)
- 2024-11-02 java集合框架(List集合的特有功能概述和测试)
- 2024-11-02 Java中List 和 Map、Set 的区别(java中list,set,map的区别)
- 2024-11-02 java集合List接口(java集合linkedlist)
- 2024-11-02 Java 的 ArrayList(java的arraylist类)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)