可變性對迭代器的損害

2022-10-11 16:30:10 字數 668 閱讀 7181

在閱讀mit軟體構造的講義時,發現其中對可變性對迭代器的損害做出了介紹。並給出了乙個例項

如下

這裡方法的功能是刪去以「6.」開頭的字串,但是發現結果與預期不同。

分析**後發現好像並沒有什麼問題。

自己復現一下**,發現確實存在這個問題。

其實,這並不是我們設計的myiterator帶來的bug。j**a內建的arraylist迭代器也會有這樣的問題,在使用for遍歷迴圈這樣的語法糖是也會出現bug,只是表現形式不一樣。

如果使用內建的迭代器,會發現丟擲乙個異常,異常的內容是迭代器發現了對迭代物件的修改。

避免這個問題的方法是使用迭代器的remove方法而不是直接對迭代物件進行修改。

發現程式返回了正確的結果。

通過這個例子可以看出在使用可變的型別是可能會出現意想不到的、難以察覺的bug。

關於不可變性與可變性的「巢狀」聯想

先給出定義 先申述乙個概念 變數 引用 值 也就是 該變數初始化的記憶體 可變性與不可變性 引用可變與否,值可變與否。值的可變性取決於 值的型別是否是可變的,這取決於建立該值的類是否可變。而引用的可變性取決於 該變數命名時是否字首有 final 那麼對於乙個物件而言,其不可變性的程度 是什麼?乙個物...

java可變性原則的封裝

可變性原則的封裝就是指將可變的元素封裝起來。abstract class person 不管男性女性都有走路的行為 public void run public void eat public abstract void method class man extends person 這是男性特有的...

Python中對列表的可變性進行討論

在python中,一切皆物件,對於物件中的數字,字串,元組,其是不可變的物件。而對於列表是可變的物件。可變與不可變性,是對記憶體位址而言的。由於python是解釋性語言,因而對於每個物件的賦值都是對記憶體塊的引用,例如 a 2,此時a是2的引用,若這是你修改a 2的表示式,改為a 3,此時a就指向了...