注意!在subList生成子列表之后,一定不要随便更改原列表
大家好,我是雄雄。
前幾期我們說過,subList方法是返回原列表的子列表,并且我們還說過,在subList返回的子列表上操作時,會直接影響著原列表,原文在這里:
subList?? subString???
子列表只是原列表的一個視圖
那么,大家有沒有想過這樣一個問題,在調用subList方法返回子列表之后,我們要是不操作子列表,而是操作的原列表,會怎么樣呢?
下面我們先從一段代碼上看起:
public?static?void?testSubList(){//初始化一個集合List<String> lists = new?ArrayList<String>();//給集合中添加四個元素lists.add("A");lists.add("B");lists.add("C");lists.add("D");//遍歷集合System.out.println("原來集合中的元素:");for?(String str: lists) {System.out.print(str+" ");}System.out.println("\n子列表中的元素:");List<String>new_list = lists.subList(0, 2);for?(String str: new_list) {System.out.print(str+" ");}}運行結果如下:
這塊代碼很好理解,無外乎就是初始化了個集合,并添加了幾個元素,通過subList方法返回了一個子列表,最后將兩個列表中的元素都遍歷出來。
接下來我要改一下代碼了,如下:
public?static?void?testSubList(){//初始化一個集合List<String> lists = new?ArrayList<String>();//給集合中添加四個元素lists.add("A");lists.add("B");lists.add("C");lists.add("D");//遍歷集合System.out.println("原來集合中的元素:");for?(String str: lists) {System.out.print(str+" ");}System.out.println("\n子列表中的元素:");List<String>new_list = lists.subList(0, 2);for?(String str: new_list) {System.out.print(str+" ");}//給原來的集合中新加一個元素lists.add("E");System.out.println("\n新加元素之后原來集合的元素:");for?(String str: lists) {System.out.print(str+" ");}System.out.println("\n新加元素之后子列表中的元素:");for?(String str: new_list) {System.out.print(str+" ");}}這段代碼前面部分沒有變,后面只是給原集合中新插入了一個元素“E”,然后對原集合以及子列表進行遍歷,運行結果如下所示:
居然報錯了?并且是在原集合中新加元素之后遍歷子列表時報的錯。ConcurrentModificationException是并發修改異常,但是我們這里并沒有多線程操作,何來并發異常?其實,原因很簡單,那就是subList方法是原列表的子列表,當原來的集合(原列表)修改之后,subList取出的子列表并未跟著一起修改,也就是不會生成新列表,最后在最字列表操作時,程序就會發現修改計數器(Modification)與預期的不符合,故拋出此異常。
因此,在subList生成子列表之后,一定不要隨便更改原列表。
往期精彩
神奇!一行代碼實現刪除某集合下標20-30的元素
2020-10-14
‘小會計’的轉行之旅
2020-10-13
班級日常分享,一天一瞬間
2020-10-14
子列表只是原列表的一個視圖
2020-10-12
“半路出家”的程序猿怎么不被“熊”
2020-10-11
某同學工作之后的感悟
2020-10-10
班級日常分享,一天一瞬間
2020-10-10
點分享
點點贊
點在看
總結
以上是生活随笔為你收集整理的注意!在subList生成子列表之后,一定不要随便更改原列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cf高清大区电脑配置?
- 下一篇: java中如何对对象排序?