subList方法的好处以及注意点

原创
2017/03/18 08:10
阅读数 332

现在一个列表有50个元素,要求是删除下标为20~30的元素,那么我们第一个想法是什么?遍历这个列表,再删掉对吧?下面看下删除的程序。

subList方法的好处以及注意点

这边有个注意的就是如果没问倒序的话,前面删完了,后面的元素会往前面移,所以会导致删掉的是20,22,24,26...十个元素。当然这边如果用subList方法,一句代码就可以搞定了,不用循环。

subList方法的好处以及注意点

那么接下来我们来看下subList的一个注意点,subList生成的列表既然是对原表的操作,那么这时候我们操作原表,那么这个视图也会跟着变化吗?

subList方法的好处以及注意点

程序比较简单,这边就不详细说明的。直接来看下运行结果。

subList方法的好处以及注意点

可以看到在list2.size()中报了一个并发修改的错误,那么这个错误是怎么产生的呢?直接进源码看下。

public int size() {

checkForComodification();

return size;

}

size方法比较简单就直接写出来了,这里进来的是检验了一次是否并发修改,我们具体来看下checkForCommodification方法。

subList方法的好处以及注意点

checkForCommodification方法

这里的expectedModCount:表示对ArrayList修改次数的期望值,它的初始值为modCount(在SubList的构造函数里面赋值)。

modCount是AbstractList类中的一个成员变量,所以我们在修改原表的时候,modCount加1了但是这边的expectedModCount却没有重新赋值(大家可以看下ArrayList的add方法,这里有对modCount加1,代码比较多就不贴出来了),所以修改了原表之后,modCount为1但是expectedModCount为0两个就是不想等了,所以这里就报了这个异常了。大家也可以看下SubList类下的其他方法,比如set,get,add方法等,都会检测两个值是否相等。这里我们可以在生成视图后,将原列表设为只读状态。

只要加上list=Collections.unmodifiableList(list);这句代码就可以了。这样就把原表锁定了,有什么好处,大家可以研究研究哈。比如说,我有个List里面的元素有50个,我前面30个是重要的数据,不能修改的,那么,我是不是就可以用这个subList生成视图后把原列表锁定,就可以保护前面30个不被修改了呢(当然subList生成的列表是除掉三十个元素的列表)?

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部