import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class A {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Collections.addAll(list, 9, 2, 8, 1, 5, 1);
System.out.println(list.toString());//[9,2,8,1,5,1]
List<Integer> subList = new ArrayList<>();
getSubList(list, subList);
System.out.println(subList.toString());//[]
System.out.println(list.toString());//[9,2,8,1,5,1,1]
}
private static void getSubList(List<Integer> list, List<Integer> subList) {
subList = list.subList(list.size() - 3, list.size());
System.out.println(subList.toString());//[1,5,1]
subList.add(1);
}
}
/**
* 结论:subList不能直接赋值给外部引用以达到修改的目的。
*
* 这是因为subList返回的是原列表的一个视图,而不是一个新的列表对象。
*
* 当你对subList进行修改时,实际上是在修改原列表。这是因为subList返回的是原列表的一个视图,
*
* 而不是一个新的列表对象。这个视图是基于原列表的索引范围创建的,所以对subList的修改会反映到原列表上。
*
* 举个例子,假设我们有一个列表list:[1, 2, 3, 4, 5]。
*
* 然后我们获取了一个subList:subList = list.subList(1,4),即[2, 3, 4]。
*
* 如果我们对subList进行修改,比如添加一个元素6,那么原列表也会被修改:list.add(6),变为[1, 2, 3, 4, 5, 6]。
*
* 这是因为subList是原列表的一个视图,它只是原列表的一部分,而不是一个全新的列表。因此,对subList的修改会直接反映到原列表上。
*
* List<Integer> subList = getSubList(list);
*
* private static List<Integer> getSubList(List<Integer> list) {
* return new ArrayList<>(list.subList(list.size() - 3, list.size()));
* }
*
*/