Arrays.subList 规则
Code
基本使用
/** * subList的注意事项 */ public static void subList(){ List<String> list = new ArrayList<>(); list.add("小工匠"); list.add("Java"); list.add("AI"); list.add("Big Data"); list.add("LOT"); // 基本使用 List<String> targetList = list.subList(2, 3); System.out.println(list); System.out.println(targetList); }
基本使用很简单, 返回的是索引从fromIndex(包含)到 toIndex(不包含)的元素集合
注意事项
修改原集合元素的值,会影响子集合
【非结构性修改】 举个例子,修改集合中的某个值
虽然我们只是修改了原集合list的值,但是影响到了子集合targetList。
修改原集合的结构,会引起ConcurrentModificationException异常
【结构性修改】举个例子往原集合list中添加一个元素
往原集合中添加了元素(结构性修改)后,在遍历子集合时,发生了ConcurrentModificationException异常。
注意事项:上述异常并不是在添加元素时发生的,而是在添加元素后,遍历子集合时发生的异常。
正好对应
修改子集合元素的值,会影响原集合
【非结构性修改】 修改下子集合targetList中某一元素的值,会影响到原集合中的值。
修改子集合的结构,会影响原集合
【结构性修改】往子集合targetList中添加一个元素 ,会影响原集合
源码解读
看下重点:
Returns a view of the portion of this list between the specified {@code fromIndex}, inclusive, and {@code toIndex}, exclusive.
返回指定的{@code fromIndex}(
包含)和{@code toIndex}
(排除)之间的列表部分的视图
视图嘛 ,对比对比数据库的视图,好理解一些
看下源码 java.util.ArrayList#subList
public List<E> subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex); }
重点看
new SubList(this, 0, fromIndex, toIndex);
可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。
小结
ArrayList的subList方法,返回的是原集合的一个子集合(视图),
- 非结构性修改任意一个集合的元素的值,都会彼此影响,
- 结构性修改原集合时,会报
ConcurrentModificationException
异常, - 结构性修改子集合时,会影响原集合
所以使用时要注意,避免程序错误或者异常。