Java 中的 AbstractSequentialList subList() 方法示例

Java 中的 AbstractSequentialList subList() 方法示例

AbstractSequentialListJava 标准库中的一种数据结构,它是 List 接口的实现类,与 List 接口实现有一定的区别,一般用于实现基于链表的数据结构。

subList() 方法是 AbstractSequentialList 类中的一个方法,它返回一个列表的视图,该视图是该列表的子列表,返回的是基于 List 接口的视图。

语法

public List<E> subList(int fromIndex, int toIndex)

参数:

  • fromIndex:子列表的起始位置
  • toIndex:子列表的结束位置(不包含)

返回值:

返回一个从 fromIndextoIndex-1 的视图。

实例演示

创建一个 LinkedList 对象,然后通过 subList() 方法取出一个子集。在子集中添加元素后,原来的列表也相应地添加了元素。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();

        linkedList.add("Alice");
        linkedList.add("Bob");
        linkedList.add("Charlie");
        linkedList.add("Dave");

        // 获取子列表
        List<String> subList = linkedList.subList(1, 3);

        System.out.println("Sub List : " + subList.toString());

        // 在子列表中添加元素
        subList.add("Eve");

        System.out.println("Sub List After Adding Element : " + subList.toString());
        System.out.println("Original List After Adding Element : " + linkedList.toString());
    }
}

代码输出为:

Sub List : [Bob, Charlie]
Sub List After Adding Element : [Bob, Charlie, Eve]
Original List After Adding Element : [Alice, Bob, Charlie, Eve, Dave]

子列表指向原列表,所有对子列表所做的更改都会反映在原列表中,而对原列表的更改则会影响到子列表中的视图。 在上面的例子中,在子列表中添加元素“Eve”,这个操作也会使原列表添加元素“Eve”。

异常处理

  1. IndexOutOfBoundsException:如果起始位置 fromIndex 大于结束位置 toIndex 或者 toIndex大于列表的长度,则抛出 IndexOutOfBoundsException 异常。

接下来看一下更多的例子,来了解 subList() 方法的其他用法。

import java.util.AbstractSequentialList;
import java.util.LinkedList;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    // 创建一个 LinkedList 对象
    LinkedList<String> linkedList = new LinkedList<>();

    // 向对象添加元素
    linkedList.add("Luca");
    linkedList.add("Sadio");
    linkedList.add("Thiago");
    linkedList.add("Gini");
    linkedList.add("Firmino");

    // 返回一个子集合视图
    List<String> subList = linkedList.subList(1, 4);

    // 使用 Java 8 Stream API 显示子列表
    System.out.println("Sub List : ");
    subList.stream().forEach(System.out::println);

    // 更改子列表对原始列表的影响
    subList.add("Salah");
    System.out.println("Children list added value : ");
    linkedList.stream().forEach(System.out::println);

    // 与数组元素共享同一个引用
    Object[] array = linkedList.toArray();
    System.out.println("Array : ");
    for (int i = 0; i < array.length; i++) {
      System.out.println(array[i]);
    }

    // 鸟瞰图 : 添加一个元素
    System.out.println("Original List : ");
    linkedList.stream().forEach(System.out::println);
    System.out.println("Sub List : ");
    subList.stream().forEach(System.out::println);
    System.out.println("-----------------------");

    // 添加对象
    linkedList.add("Alisson Becker");
    System.out.println("After adding new element: ");
    System.out.println("Original List : ");
    linkedList.stream().forEach(System.out::println);
    System.out.println("Sub List : ");
subList.stream().forEach(System.out::println);
  }
}

代码输出为:

Sub List :
Sadio
Thiago
Gini
Children list added value :
Luca
Sadio
Thiago
Gini
Salah
Firmino
Array :
Luca
Sadio
Thiago
Gini
Firmino
Original List :
Luca
Sadio
Thiago
Gini
Salah
Firmino
Sub List :
Sadio
Thiago
Gini
-----------------------
After adding new element: 
Original List :
Luca
Sadio
Thiago
Gini
Salah
Firmino
Alisson Becker
Sub List :
Sadio
Thiago
Gini
Salah

在上述代码中,我们使用了 stream() 方法来处理列表并使用 forEach() 方法遍历列表。

  • 在第13行和14行中,我们使用了 subList() 方法来获取一个子列表,并使用 stream()forEach() 方法遍历子列表。

  • 在第19行和20行中,我们使用了 stream()forEach() 方法遍历更改后的列表。

  • 在第24行和25行中,我们使用 stream() 方法来遍历通过 toArray() 方法创建的数组。

结论

使用AbstractSequentialList subList()方法 的时候,要注意一下一些问题:

  • subList() 方法返回从 fromIndextoIndex-1 的段列表的视图,在视图中对于原来的序列的修改是立即可见的,而且原来序列改变的同时该视图也改变。

  • 如果在对子列表操作后改变了原列表的大小,那么该列表的视图将是“不合法”的,因此不应该重新使用该列表。

  • 如果对子列表的结构进行了修改而不是通过列表的方法修改了元素,则可能会导致未定义的行为。

  • IndexOutOfBoundsException 在列表开始和结束位置之外使用索引时会抛出异常。

这篇文章总结了关于 JavaAbstractSequentialList subList()方法 的内容和用法。希望这篇文章对你有所帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程