子列表只是原列表的一个视图
原文參考:《編寫高質(zhì)量代碼:改善java程序的151個建議》
本文原創(chuàng):穆雄雄
上期文章:
subList?? subString???
上期我們說到,List接口提供了subList方法,其作用是返回一個列表的子列表。并且我們通過案例說明了一個問題,那便是,在原來的list集合基礎(chǔ)上,調(diào)用subList產(chǎn)生新的List的時候,那么原來的list集合也會隨之而改。
在看為什么之前,我們還是先從subList的源碼上說起吧。
public?List<E> subList(int?fromIndex, int?toIndex)?{return?(this?instanceof?RandomAccess ?new?RandomAccessSubList<E>(this, fromIndex, toIndex) :new?SubList<E>(this, fromIndex, toIndex));}從代碼中我們可以看到,instanceof的作用就是查看當(dāng)前的對象是否是RandomAccess的實例,如果是,則調(diào)用RandomAccessSubList方法,否則調(diào)用SubList方法,況且進(jìn)一步查看源碼可以得知RandomAccessSubList類也繼承至SubList類,所以我們直接來看SubList的源碼:
class?SubList<E> extends?AbstractList<E> {private?final AbstractList<E> l;private?final int?offset;private?int?size;SubList(AbstractList<E> list, int?fromIndex, int?toIndex) {if?(fromIndex < 0)throw?new?IndexOutOfBoundsException("fromIndex = "?+ fromIndex);if?(toIndex > list.size())throw?new?IndexOutOfBoundsException("toIndex = "?+ toIndex);if?(fromIndex > toIndex)throw?new?IllegalArgumentException("fromIndex("?+ fromIndex +") > toIndex("?+ toIndex + ")");l = list;offset = fromIndex;size = toIndex - fromIndex;this.modCount = l.modCount;}} //后面省略其他方法通過閱讀這段代碼,我們就很清楚的知道SubList方法的實現(xiàn)原理,它返回的SubList類也是AbstractList的子類,其所有的方法如get、set、add、remove等都是在原始列表上的操作,它自身并沒有生成一個數(shù)組或是鏈表,也就是子列表只是原列表的一個視圖(View),所有的修改動作都反映在了原列表上。
所以我們表面上操作的是newList,其實操作的還是原來的列表。subList產(chǎn)生的列表只是一個視圖,所有的修改動作直接作用于源列表。
往期精彩
“半路出家”的程序猿怎么不被“熊”
2020-10-11
某同學(xué)工作之后的感悟
2020-10-10
班級日常分享,一天一瞬間
2020-10-10
為了金秋那沉甸甸的麥穗,我絕不辜負(fù)春天
2020-10-09
subList?? subString???
2020-10-08
"爸媽沒多大本事"……
2020-10-07
點分享
點點贊
點在看
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的子列表只是原列表的一个视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: em生物菌的配制方法?
- 下一篇: 蘑菇菌的配制方法?