0
点赞
收藏
分享

微信扫一扫

Java开发规范02 - 集合篇_ArrayList#subList 坑



文章目录


  • ​​Arrays.subList 规则​​
  • ​​Code​​
  • ​​基本使用​​
  • ​​注意事项​​


​​修改原集合元素的值,会影响子集合​​​​修改原集合的结构,会引起ConcurrentModificationException异常​​​​修改子集合元素的值,会影响原集合​​​​修改子集合的结构,会影响原集合​​

  • ​​源码解读​​
  • ​​小结​​


Java开发规范02 - 集合篇_ArrayList#subList 坑_subList

Arrays.subList 规则

Java开发规范02 - 集合篇_ArrayList#subList 坑_subList_02

Java开发规范02 - 集合篇_ArrayList#subList 坑_程序错误_03

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(不包含)的元素集合

Java开发规范02 - 集合篇_ArrayList#subList 坑_源码解读_04

注意事项

修改原集合元素的值,会影响子集合

【​非结构性修改​】 举个例子,修改集合中的某个值

Java开发规范02 - 集合篇_ArrayList#subList 坑_程序错误_05

虽然我们只是修改了原集合list的值,但是影响到了子集合targetList。

Java开发规范02 - 集合篇_ArrayList#subList 坑_程序错误_06

修改原集合的结构,会引起ConcurrentModificationException异常

【结构性修改】举个例子往原集合list中添加一个元素

Java开发规范02 - 集合篇_ArrayList#subList 坑_java_07

往原集合中添加了元素(结构性修改)后,在遍历子集合时,发生了​​ConcurrentModificationException​​异常。

注意事项:上述异常并不是在添加元素时发生的,而是在添加元素后,​遍历子集合时发生的异常​。

正好对应

Java开发规范02 - 集合篇_ArrayList#subList 坑_程序错误_03

Java开发规范02 - 集合篇_ArrayList#subList 坑_程序错误_09

修改子集合元素的值,会影响原集合

【​非结构性修改​】 修改下子集合targetList中某一元素的值,会影响到原集合中的值。

Java开发规范02 - 集合篇_ArrayList#subList 坑_源码解读_10

Java开发规范02 - 集合篇_ArrayList#subList 坑_subList_11

修改子集合的结构,会影响原集合

【结构性修改】往子集合targetList中添加一个元素 ,会影响原集合

Java开发规范02 - 集合篇_ArrayList#subList 坑_源码解读_12

Java开发规范02 - 集合篇_ArrayList#subList 坑_源码解读_13

源码解读

Java开发规范02 - 集合篇_ArrayList#subList 坑_程序错误_14

看下重点:

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);

Java开发规范02 - 集合篇_ArrayList#subList 坑_java_15

可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。

小结

ArrayList的subList方法,返回的是原集合的一个子集合(视图),


  • 非结构性修改任意一个集合的元素的值,都会彼此影响,
  • 结构性修改原集合时,会报​​ConcurrentModificationException​​异常,
  • 结构性修改子集合时,会影响原集合

所以使用时要注意,避免程序错误或者异常。

Java开发规范02 - 集合篇_ArrayList#subList 坑_程序错误_16



举报

相关推荐

0 条评论