欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
List遍歷時(shí)刪除元素的正確方式舉例

當要刪除ArrayList里面的某個(gè)元素,一不注意就容易出bug。今天就給大家說(shuō)一下在A(yíng)rrayList循環(huán)遍歷并刪除元素的問(wèn)題。首先請看下面的例子:

import java.util.ArrayList;

public class ArrayListRemove

{

public static void main(String[] args)

{

ArrayList list = new ArrayList();

list.add('a');

list.add('b');

list.add('b');

list.add('c');

list.add('c');

remove(list);

for (String s : list)

{

System.out.println('element : ' + s);

}

}

public static void remove(ArrayList list)

{

}

}

常見(jiàn)錯誤寫(xiě)法:

舉例一:

結果:第二個(gè)“b”的字符串沒(méi)有刪掉。

舉例二:

結果:這種for-each寫(xiě)法會(huì )報出并發(fā)修改異常:java.util.ConcurrentModificationException。

錯誤原因:先看下ArrayList中的remove方法,看入參為Object的remove方法是怎么實(shí)現的:

public boolean remove(Object o) {

if (o == null) {

for (int index = 0; index < size;="">

if (elementData[index] == null) {

fastRemove(index);

return true;

}

} else {

for (int index = 0; index < size;="">

if (o.equals(elementData[index])) {

fastRemove(index);

return true;

}

}

return false;

}

執行路徑會(huì )到else路徑下最終調用faseRemove方法:

private void fastRemove(int index) {

modCount++;

int numMoved = size - index - 1;

if (numMoved > 0)

System.arraycopy(elementData, index+1, elementData, index,numMoved);

elementData[--size] = null; // Let gc do its work

}

可以看到會(huì )執行System.arraycopy方法,導致刪除元素時(shí)涉及到數組元素的移動(dòng)。針對錯誤寫(xiě)法一,在遍歷第一個(gè)字符串b時(shí)因為符合刪除條件,所以將該元素從數組中刪除,并且將后一個(gè)元素移動(dòng)(也就是第二個(gè)字符串b)至當前位置,導致下一次循環(huán)遍歷時(shí)后一個(gè)字符串b并沒(méi)有遍歷到,所以無(wú)法刪除。針對這種情況可以倒序刪除的方式來(lái)避免:

Java

因為數組倒序遍歷時(shí)即使發(fā)生元素刪除也不影響后序元素遍歷。

實(shí)例二的錯誤原因。產(chǎn)生的原因卻是foreach寫(xiě)法是對實(shí)際的Iterable、hasNext、next方法的簡(jiǎn)寫(xiě),問(wèn)題同樣處在上文的fastRemove方法中,可以看到第一行把modCount變量的值加一,但在A(yíng)rrayList返回的迭代器:

public Iterator iterator() { return new Itr();}

這里返回的是AbstractList類(lèi)內部的迭代器實(shí)現private class Itr implements Iterator,看這個(gè)類(lèi)的next方法:

Java

第一行checkForComodification方法:

final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException();}

這里會(huì )做迭代器內部修改次數檢查,因為上面的remove(Object)方法修改了modCount的值,所以才會(huì )報出并發(fā)修改異常。要避免這種情況的出現則在使用迭代器迭代時(shí)(顯示或for-each的隱式)不要使用ArrayList的remove,改為用Iterator的remove即可。

public static void remove(ArrayList list)

{

Iterator it = list.iterator();

while (it.hasNext())

{

String s = it.next();

if (s.equals('b'))

{

it.remove();

}

}

}

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java提高篇(三十)
無(wú)語(yǔ)!這道迭代器筆試題,居然難倒很多人
List接口特點(diǎn)總結
Java集合類(lèi)框架學(xué)習
Java迭代器
竟然有一半的人不知道 for 與 foreach 的區別???
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久