首页 > 其他分享 >List类初识

List类初识

时间:2023-09-25 12:01:21浏览次数:50  
标签:元素 List 接口 列表 插入 初识 方法


 

先看java Api的中文文档:

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

与 set 不同,列表通常允许重复的元素。更确切地讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。难免有人希望通过在用户尝试插入重复元素时抛出运行时异常的方法来禁止重复的列表,但我们希望这种用法越少越好。

List 接口在 iterator、add、remove、equals 和 hashCode 方法的协定上加了一些其他约定,超过了 Collection 接口中指定的约定。为方便起见,这里也包括了其他继承方法的声明。

List 接口提供了 4 种对列表元素进行定位(索引)访问方法。列表(像 Java 数组一样)是基于 0 的。注意,这些操作可能在和某些实现(例如 LinkedList 类)的索引值成比例的时间内执行。因此,如果调用者不知道实现,那么在列表元素上迭代通常优于用索引遍历列表。

List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。

List 接口提供了两种搜索指定对象的方法。从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。

List 接口提供了两种在列表的任意位置高效插入和移除多个元素的方法。

注意:尽管列表允许把自身作为元素包含在内,但建议要特别小心:在这样的列表上,equals 和 hashCode 方法不再是定义良好的。

某些列表实现对列表可能包含的元素有限制。例如,某些实现禁止 null 元素,而某些实现则对元素的类型有限制。试图添加不合格的元素会抛出未经检查的异常,通常是 NullPointerException 或 ClassCastException。试图查询不合格的元素是否存在可能会抛出异常,也可能简单地返回 false;某些实现会采用前一种行为,而某些则采用后者。概括地说,试图对不合格元素执行操作时,如果完成该操作后不会导致在列表中插入不合格的元素,则该操作可能抛出一个异常,也可能成功,这取决于实现的选择。此接口的规范中将这样的异常标记为“可选”。

List接口是Collection的子接口,用于定义线性表结构,List接口继承于Collection接口,并在此基础上添加了大量的方法,使得我们可以在List中间进行元素的插入和移动。

List有两种类型分别为:

  1. ArrayList,擅长随机访问元素,但是插入、删除元素较慢
  2. LinkedList,擅长插入、删除和移动元素,但是随机访问元素性能较低。

其中ArrayList可以理解为一个动态数组,而LinkedList可以理解为一个链表,数组的存储在内存空间中是连续的。所以在底层,我们可以通过每个元素所占的内存大小以及偏移量计算出每个元素所在的起始地址。但是在删除、插入元素时,由于需要保证数据存储位置的连续性,我们需要对它周围的元素进行搬移,而周围元素的搬移又会引起后续其他元素的搬移需求,所以最终所导致的移动操作很多。

而链表在内存中并不是连续存储的。它是一种逻辑顺序结构,每个链表存储的对象,都会存储下一个元素以及上一个元素的引用,通过引用来进行迭代。在删除、移动和插入时,我们不需要对元素的实际位置进行搬移,仅仅需要改变引用就可以了。但是由于它是逻辑上的顺序表,我们不能够静态的计算它的位置,只能一个一个的寻找,所以它的随机存取性能较低。

常用操作 

插入和删除操作: 

void add(int index,E element): 

将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。 

E remove(int index): 

删除给定位置的元素,并将被删除的元素返回。

get和set方法

List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最常用的就是get和set 

E get(int index):获取集合中指定下标对应的元素,下标从0开始。 

E set(int index, E elment):将给定的元素存入给定位置,并将原位置的元素返回。

 

subList方法

List的subList方法用于获取子List。 

需要注意的是,subList获取的List与原List占有相同的存储空间,对子List的操作会影响的原List。 

List subList(int fromIndex, int toIndex); 

fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括)

List转换为数组

List的toArray方法用于将集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。 

其有两个方法: 

Object[] toArray() 

T[] toArray(T[] a)

ListIterator

ListIterator是更为强大的Iterator的子类型,但是它仅仅针对List的类进行访问。ListIterator可以进行双向移动、获取迭代器所处元素的前后元素的索引,还可以使用set()方法替换它访问过的最后一个元素。如:

List<String> keywords = new ArrayList<>();
keywords.add("hello");
keywords.add(0, "thank");
ListIterator<String> iterator = keywords.listIterator();
while (iterator.hasPrevious()) {
    System.out.println(iterator.previous());
}
while (iterator.hasNext()) {
    iterator.next();
    iterator.set("you");
}

参考:


https://www.tianmaying.com/tutorial/java_collection

https://www.jianshu.com/p/047e33fdefd2

标签:元素,List,接口,列表,插入,初识,方法
From: https://blog.51cto.com/u_6947107/7594414

相关文章

  • Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregate
    MySQL有any_value(field)函数,他主要的作用就是抑制ONLY_FULL_GROUP_BY值被拒绝官方有介绍,地址:https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value我们可以把select语句中查询的属性(除聚合函数所需的参数外),全部放入any_value(field)函数......
  • Java LinkedList与ArrayList源码解析:根本区别和表面区别的详解
    在Java中,LinkedList和ArrayList是两个常见的集合类。它们都实现了List接口,但它们在实现方式上有很大的区别。本篇博客将详细解析LinkedList和ArrayList的源码,解释它们的根本区别和表面区别,并提供详细的代码解释。LinkedList与ArrayList的根本区别:数据结构:LinkedList是基于链表......
  • ArrayList常见面试题
    简介ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。线程安全性对ArrayList的操作一般分为两个步骤,改变位置(size)和操作元素(e)。所以这个过程在多线程的环......
  • ArrayList常见面试题
    简介ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。线程安全性对ArrayList的操作一般分为两个步骤,改变位置(size)和操作元素(e)。所以这个过程在多线......
  • 【1.0】Pandos初识
    【一】Pandas是什么Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas已经成为Python数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具......
  • 1.单列集合(接口 Collection,List,Set)
    单列集合(接口Collection,List,Set)单列集合体系结构:特点:1.List系列集合: 添加的元素是有序、可重复、有索引;2.Set系列集合: 添加的元素是无序、不重复、无索引;3.有序为存入和取出都是一样的顺序,非内部里的顺序;Collection概念:Collection是单列集合的祖宗接口,它的功能......
  • 2.单列集合(List系列 ArrayList,LinkedList)
    单列集合(ArrayList,LinkedList)ArrayList概念:1.集合的长度是可变的;2.集合只能存储引用数据类型,不能存储基本数据类型;创建集合:例:ArrayList<E>list=newArrayList<>(); 1.<>是泛型:限定集合中存储数据的类型,类型只能是引用类型;要使用基本数据类型,则需要使用对应......
  • 【Java 基础篇】Java ArrayList 简明教程:灵活管理数据集合
    在Java编程中,数组是一种常见的数据结构,用于存储一组元素。然而,数组有一些限制,例如大小固定,不支持动态增长等。为了克服这些限制,Java提供了一个灵活的数据结构——ArrayList。ArrayList是Java集合框架中的一部分,它允许我们创建可变大小的数组,方便地添加、删除、获取和修改元素。本篇......
  • 【Java 基础篇】Java LinkedList 详解:数据结构的灵活伙伴
    在Java编程中,数据结构起着至关重要的作用。这些数据结构可以帮助我们组织和管理数据,使我们的代码更加高效和可维护。其中之一是LinkedList,它是一个灵活的数据结构,允许我们高效地进行插入和删除操作。本篇博客将深入探讨Java中的LinkedList,从基础概念到高级用法,为您呈现全面的......
  • 初识结构体
    前言......