深入了解java集合框架-List集合以及选用

简介: ListList实现了Collection,所以他拥有Collection的全部方法

List

List实现了Collection,所以他拥有Collection的全部方法

List 的存储方式如下

用代码展示如下

//使用List的接口
List<String> list = new ArrayList<>();//创建ArrayList的实现类
//List<String> list = new LinkedList<>();//创建LinkedList的实现类
//添加元素
list.add("元素1");
list.add("元素2");
list.add("元素3");
list.add("元素4");
list.add("元素5");
//打印输出集合以及下标为2的元素
System.out.println(list);
System.out.println("下标为2:"+ list.get(2));
//删除下标为2的元素
list.remove(2);
//打印输出集合以及下标为2的元素
System.out.println(list);
System.out.println("下标为2:"+ list.get(2));

输出结果

[元素1, 元素2, 元素3, 元素4, 元素5]
下标为2:元素3
[元素1, 元素2, 元素4, 元素5]
下标为2:元素4

什么时候使用List

  • 想要存放一组元素
  • 这些元素可能有重复的

如何选择List

常用的有以下两种

ArrayList

  • 内部维护了一个数组
  • 每一次增加一个元素或者减少一个元素都要重新创建一个数组
  • 增加删除开销大
  • 查询修改速度快

LinkedList

  • LinkedList是一个双向链表,
  • 添加删除元素时具有比ArrayList更好的性能。
  • 但在元素的查询修改方面要弱于ArrayList。

List的源码解析

除了Collection的方法之外,LIst也有几个特有的方法

一般来说,我们如果使用集合,只需要使用接口就行了,没必要使用实现类的对象进行操作所以这里只说明List的方法

void replaceAll(UnaryOperator operator)复制代码

将此列表的每个元素替换为运算后该元素的结果。 运算引发的错误或运行时异常将抛出到调用方。

参数:operator - 应用到每一个元素抛出:
UnsupportedOperationException -如果此列表是不可修改的。 实现方式可以引发此异常如果一个元素不能被替换,或者,如果在一般情况下,不支持修改

NullPointerException -如果指定的操作者为空或如果操作者的结果是一个空值,并且此列表不允许null元素内部代码:

default void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
    final ListIterator<E> li = this.listIterator();
    while (li.hasNext()) {
        li.set(operator.apply(li.next()));
    }
}

void sort(Comparator c)

根据规定产生的顺序排序此列表Comparator 。 排序是稳定的 :这种方法不能重新排序相等的元素。

在这个列表中的所有元素都必须使用指定的比较(即,是可相互比较 c.compare(e1, e2)不得抛出ClassCastException为任何元素e1和e2在列表中)。

如果指定的比较是null则在此列表中的所有元素都必须实现Comparable接口和元素的自然顺序应该被使用。此列表必须是可修改的,但不必是大小可调整。

参数:c -接收Comparator来比较列表元素。 一个null值表示元素的自然顺序 ,应使用抛出:ClassCastException -如果列表中包含使用指定的比较器不可相互比较的元素
UnsupportedOperationException -如果列表中的列表迭代器不支持set操作IllegalArgumentException - 如果比较发现违反Comparator规则

内部代码:

default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
} 复

E get(int index)

index是 0~Integer.MAX_VALUE 之间的数字

返回在此列表中指定位置的元素。

参数:index- 该元素的索引返回:在此列表中的指定位置的元素

抛出:

IndexOutOfBoundsException -如果索引超出范围( index < 0 || index >= size() )

E set(int index, E element)复制代码

替换在List中指定下标的元素

参数:

index - 元素的索引,以取代

element - 元素被存储在指定的位置

返回:

在指定的位置之前的元素

抛出:


UnsupportedOperationException -如果set操作不受此列表支持

ClassCastException -如果类指定的元件防止它的被添加到该列表中

NullPointerException -如果指定的元素为null,并且此列表不允许null元素

IllegalArgumentException -如果从指定的元件防止它的某些属性被添加到这个列表

IndexOutOfBoundsException -如果索引超出范围( index < 0 || index >= size() )

void add(int index, E element)

在指定下标的位置插入该元素,并且将原本的元素下标统一向后移动1位

参数:

index - 索引在该指定的元件将被插入

element - 要插入元素

抛出:


UnsupportedOperationException -如果add操作不受此列表支持

ClassCastException -如果类指定的元件防止它的被添加到该列表中

NullPointerException -如果指定的元素为null,并且此列表不允许null元素

IllegalArgumentException -如果从指定的元件防止它的某些属性被添加到这个列表

IndexOutOfBoundsException -如果索引超出范围( index < 0 || index > size() )

E remove(int index)

index是 0~Integer.MAX_VALUE 之间的数字

删除此列表指定的位置的元素。后面元素向左移动。 返回从被删除的元素。

参数:

index - 下标

返回:

被删除的元素

抛出:


UnsupportedOperationException -如果remove操作不受此列表支持

IndexOutOfBoundsException -如果索引超出范围( index < 0 || index >= size() )

int indexOf(Object o)

在List中寻找 o 元素,返会元素第一次出现在List中的索引

找不到返回-1

参数:

o - 要搜索的元素

返回:

指定元素第一次出现在该列表中的索引,找不到返回-1

int lastIndexOf(Object o)复制代码

返回指定元素的最后一次出现在这个列表中的索引,或-1,如果此列表中不包含的元素。 更正式地说,返回满足i这样Objects.equals(o, get(i))或-1,如果没有这样的指标。

函数:o - 要搜索的元素返回:指定的元素,最后一次出现在这个列表中的索引,或-1,如果此列表中不包含的元素抛出:ClassCastException -如果指定元素的类型是不符合这个列表NullPointerException -如果指定的元素为null,并且此列表不允许null元素

ListIterator listIterator()

返回一个列表迭代器

返回:返回一个列表迭代器

ListIterator listIterator(int index)

返回一个从指定下标开始的列表迭代器

参数:index-迭代器的第一个元素的索引返回:返回一个从指定下标开始的列表迭代器抛出:IndexOutOfBoundsException -如果索引超出范围( index < 0 || index > size() )

List subList(int fromIndex, int toIndex)

截取List

List<Object> subList = list.subList(0, 5);
//其中subList(0, 5)取得的是下标为0到4的元素,不包含下标为5的元素.

参数:fromIndex - 起始点toIndex -终止点返回:此列表内的所述指定范围的视图抛出:IndexOutOfBoundsException -为一个非法端点指数值( fromIndex < 0 || toIndex > size || fromIndex > toIndex )

static List of(E e1)

返回包含一个元素的不可修改的列表。 见不可修改的列表的详细信息。

参数:e1 - 所述单个元件,可以有多个,也可以不写返回一个空的类型参数:< E > -的List的元素类型返回:一个List包含指定元件抛出:NullPointerException -如果元素是null

static List copyOf(Collection coll)

拷贝一个Collection集合,顺序为迭代器的顺序

参数:

coll - 一个Collection集合

类型参数:

< E > -的List的元素类型

返回:

一个List包含给定的元素Collection

抛出:

NullPointerException -如果为null,或者如果它包含任何空

相关文章
|
1月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
1月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
148 3
|
13天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
34 5
|
26天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
38 4
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
218 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
54 2
|
1月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
77 1
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
33 2
|
1月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。