专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java 17 List 接口详解(java list 排序)

temp10 2024-11-02 13:34:59 java教程 9 ℃ 0 评论

Java 17 List 接口详解

思维导图

上一章我们说了 Collection 集合,这一篇我们来说说 List 接口的知识点。 List 遵循接口和实现分开, List 是接口。

定义如下:

Java 17 List 接口详解(java 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

对于出现疑问, 第一解决方案就是第一手资料查阅。 只有见到当事人, 才能更好的解决问题嘛。

任何时间都没有简单的想想就可以搞定的, 都需要经历一定的准备,努力,运气加坚持。愿君有一个好心情继续学习。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表