容器的可替換性
底層容器實(shí)現(xiàn)可以隨意改變,而對用戶的使用不產(chǎn)生影響薯鼠,說白了郎任,就是要統(tǒng)一接口颖医,畢竟開發(fā)者只需要面向接口編程
Iterator設(shè)計(jì)思想
怎么給容器提供一種遍歷方式?你可能會認(rèn)為不就是個遍歷嗎冀续?ArrayList用數(shù)組下標(biāo)進(jìn)行遍歷琼讽,LinkedList也難怪指針next進(jìn)行遍歷。事實(shí)上洪唐,沒那么簡單钻蹬。如果底層的容器實(shí)現(xiàn)變化了,用戶的使用是不是也需要根據(jù)具體實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)來改變遍歷方式呢凭需?顯然不行问欠,不然何必統(tǒng)一接口肝匆。說到這里,你一定知道了Iterator就是一個統(tǒng)計(jì)遍歷的接口
Iterator的幾個角色
1.迭代器Iterator接口
2.迭代器Iterator的實(shí)現(xiàn)類顺献,要求重寫hasNext(),next(),remove()三個方法
3.容器統(tǒng)一接口旗国,要求有一個返回Iterator接口的方法
4.容器實(shí)現(xiàn)類,實(shí)現(xiàn)一個返回Iterator接口的方法
ArrayList的Iterator實(shí)現(xiàn)同樣重寫了hasNext()注整,next()能曾,remove()
modCount
迭代器Iterator允許在容器遍歷的時候?qū)υ剡M(jìn)行刪除,這樣產(chǎn)生了一個問題肿轨,當(dāng)多線程操作容器的時候寿冕,在用Iterator對容器遍歷的同時,其他線程可能已經(jīng)改變了該容器的內(nèi)容(add椒袍,驼唱,remove等操作),所以每次對容器內(nèi)容的更改操作(add驹暑,remove等)都會使modCount + 1玫恳,這樣相當(dāng)于樂觀鎖的版本號+1,當(dāng)在Iterator遍歷中remove時檢查到modCount發(fā)生了變化岗钩,馬上拋出ConcurrentModificationException纽窟,這就是java中容器中的“fail-fast”機(jī)制
樂觀鎖
一般是通過為數(shù)據(jù)庫增加一個“version”字段。讀取數(shù)據(jù)時連同版本號一同讀出兼吓,之后更新時臂港,對比版本號+1.此時將提交的數(shù)據(jù)的版本的數(shù)據(jù)與數(shù)據(jù)庫對應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對,如果提交數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號則予以更新视搏,否則审孽,認(rèn)為是過期數(shù)據(jù)