subList方法的好处以及注意点

本文探讨了在Python中操作列表时的一些常见问题,特别是如何正确地删除指定范围内的元素,以及使用subList方法时可能遇到的并发修改异常,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在一个列表有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生成的列表是除掉三十个元素的列表)?

转载于:https://my.oschina.net/u/2391658/blog/861749

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值