Java 中的 AbstractSequentialList subList() 方法示例
AbstractSequentialList
是Java
标准库中的一种数据结构,它是 List
接口的实现类,与 List
接口实现有一定的区别,一般用于实现基于链表的数据结构。
subList()
方法是 AbstractSequentialList
类中的一个方法,它返回一个列表的视图,该视图是该列表的子列表,返回的是基于 List
接口的视图。
语法
public List<E> subList(int fromIndex, int toIndex)
参数:
fromIndex
:子列表的起始位置toIndex
:子列表的结束位置(不包含)
返回值:
返回一个从 fromIndex
到 toIndex-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”。
异常处理
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()
方法返回从fromIndex
到toIndex-1
的段列表的视图,在视图中对于原来的序列的修改是立即可见的,而且原来序列改变的同时该视图也改变。-
如果在对子列表操作后改变了原列表的大小,那么该列表的视图将是“不合法”的,因此不应该重新使用该列表。
-
如果对子列表的结构进行了修改而不是通过列表的方法修改了元素,则可能会导致未定义的行为。
-
IndexOutOfBoundsException
在列表开始和结束位置之外使用索引时会抛出异常。
这篇文章总结了关于 Java
中AbstractSequentialList subList()方法
的内容和用法。希望这篇文章对你有所帮助。