小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

遍歷并批量刪除容器中元素出現(xiàn)ConcurrentModificationException...

 WindySky 2008-09-28
在以下四種遍歷過程中,前兩種會拋出ConcurrentModificationException,而后兩種方法是正確的.

Department類:
package com.sitinspring;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Department {
    
private String name;

    
private List<Member> memberSheet;

    
public Department(String name) {
        
this.name = name;
    }

    
public void addMemer(Member member) {
        
if (memberSheet == null) {
            memberSheet 
= new ArrayList<Member>();
        }

        memberSheet.add(member);
    }

    
public void printMemberSheet() {
        System.out.println(
"----部門" + name + "人員名單---");

        
for (Member member : memberSheet) {
            System.out.println(member);
        }
    }

    
/**
     * 里面的四個清除過程請分別獨立執(zhí)行
     *
     
*/
    
public void removeYoungerFromMemberSheet() {    
        
// 遍歷一:這個處理會拋出java.util.ConcurrentModificationException
        for (Member member : memberSheet) {
            
if (member.getAge() < 30) {
                memberSheet.remove(member);
            }
        }
        
        
// 遍歷二:這個處理也會拋出java.util.ConcurrentModificationException
        for (Iterator it = memberSheet.iterator(); it.hasNext();) {
            Member member 
= (Member) it.next();

            
if (member.getAge() < 30) {
                memberSheet.remove(member);
            }
        }
        
        
// 遍歷三:這個處理調(diào)用Iterator 本身的方法 remove(),會正常執(zhí)行
        for (Iterator it = memberSheet.iterator(); it.hasNext();) {
            Member member 
= (Member) it.next();

            
if (member.getAge() < 30) {
                it.remove();
            }
        }
        
        
// 遍歷四:這個處理不依賴Iterator,也會正常執(zhí)行
        for (int i=0;i<memberSheet.size();i++) {
            Member member 
= memberSheet.get(i);

            
if (member.getAge() < 30) {
                memberSheet.remove(member);
            }
        }
    }

    
public String toString() {
        
return name;
    }

    
public String getName() {
        
return name;
    }

    
public static void main(String[] args) {
        Department resarchDept 
= new Department("研發(fā)部門");
        resarchDept.addMemer(
new Member("張三"38));
        resarchDept.addMemer(
new Member("李四"24));
        resarchDept.addMemer(
new Member("王五"30));
        resarchDept.addMemer(
new Member("錢七"22));
        resarchDept.addMemer(
new Member("孫八"39));
        resarchDept.addMemer(
new Member("周九"30));

        resarchDept.removeYoungerFromMemberSheet();
        resarchDept.printMemberSheet();
    }
}

Member類:
package com.sitinspring;

public class Member{
    
private String name;
    
private int age;
    
private Department department;
    
    
public Member(String name,int age){
        
this.name=name;
        
this.age=age;
    }
    
    
public String toString(){
        StringBuffer sb
=new StringBuffer();
        sb.append(
"員工名="+name);
        sb.append(
" 年齡="+age);
        
        
if(department!=null){
            sb.append(
" 所屬部門="+department);
        }
        
        
return sb.toString();
    }
    
    
public void changeNewDepartment(Department newDepartment) {
        department.removeMemer(name);
        newDepartment.addMemer(
this);
    }
    
    
public String getName() {
        
return name;
    }

    
public void setDepartment(Department department) {
        
this.department = department;
    }
}

為什么會發(fā)生這樣的結(jié)果呢?這是因為

"當(dāng)使用 fail-fast iterator 對 Collection 或 Map 進(jìn)行迭代操作過程中嘗試直接修改 Collection / Map 的內(nèi)容時,即使是在單線程下運行, java.util.ConcurrentModificationException 異常也將被拋出。
Iterator 是工作在一個獨立的線程中,并且擁有一個 mutex 鎖。 Iterator 被創(chuàng)建之后會建立一個指向原來對象的單鏈索引表,當(dāng)原來的對象數(shù)量發(fā)生變化時,這個索引表的內(nèi)容不會同步改變,所以當(dāng)索引指針往后移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。
所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當(dāng)前迭代對象的同時維護索引的一致性。
"

上述這段資料來自http://hi.baidu.com/xjenator/blog/item/23b235a89041d4b0ca130c16.html.

java.util包中很多迭代器都是所謂的fail-fast迭代器.這些迭代器如果發(fā)現(xiàn)集合被修改,而且不是通過迭代器本身,那么拋出一個異常進(jìn)行清除-ConcurrentModificationException-從而避免不安全行為的發(fā)生.

因此,第三種采用it.remove();不會出現(xiàn)任何異常,而第四不依賴于Iterator而依賴于索引當(dāng)然更不會出現(xiàn)異常.

代碼下載:
http://www./Files/sitinspring/ConcurrentModificationTest20071203210937.rar

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多