当前位置:编程学习 > JAVA >>

java传统集合的一些弊病以及解决办法

 

一、HashSet和HashMap有和联系?我们可以看看源码:
在HashSet的源码里,我们可以看到如下一些代码:……
public HashSet(){
    map = new HashMap<E, Object>();
}
……
public Iterator<E> iterator(){
    return map.keySet().iterator();
}
……
 看到这里,便可知道:HashSet其实质也就是一个Map,只不过没有使用到其中的value值而已
 
二、传统集合的弊病
1、  容易导致死循环
 


2、  容易报异常,导致程序中断
看如下三段代码以及输出情况:
(1)、
public class CollectionModifyExceptionTest {
       public static void main(String[] args) {
              Collection users = new ArrayList();
              users.add(new User("张三",28));
              users.add(new User("李四",25));
              users.add(new User("王五",31));
              Iterator iterUsers = users.iterator();
              while(iterUsers.hasNext()){
                     User user = (User)iterUsers.next();
                     if("张三".equals(user.getName())){
                            users.remove(user);
                     }else{
                            System.out.println(user);
                     }
              }
       }
}
输出:
 
 
(2)、
public class CollectionModifyExceptionTest {
       public static void main(String[] args) {
              Collection users = new ArrayList();
              users.add(new User("张三",28));
              users.add(new User("李四",25));
              users.add(new User("王五",31));
              Iterator iterUsers = users.iterator();
              while(iterUsers.hasNext()){
                     User user = (User)iterUsers.next();
                     if("李四".equals(user.getName())){
                            users.remove(user);
                     }else{
                            System.out.println(user);
                     }
              }
       }
}
 
输出:
 


(3)、
public class CollectionModifyExceptionTest {
       public static void main(String[] args) {
              Collection users = new ArrayList();
              users.add(new User("张三",28));
              users.add(new User("李四",25));
              users.add(new User("王五",31));
              Iterator iterUsers = users.iterator();
              while(iterUsers.hasNext()){
                     User user = (User)iterUsers.next();
                     if("王五".equals(user.getName())){
                            users.remove(user);
                     }else{
                            System.out.println(user);
                     }
              }
       }
}
打印:
 
观察上面三种情况,第一和第三都抛出异常,程序中断;第二程序没有抛出异常,却没有我们理想的运行结果。下面,我来仔细分析一下这三种情况的运行现象:
 
第一种:当我们删除张三的时候可以看到报异常的是:
User user = (User)iterUsers.next();
 
这里报错,进入源码一看:
[java]
1. private void checkForComodification() {  
2.         if (l.modCount != expectedModCount)  
3.             throw new ConcurrentModificationException();  
4.     }  
 
报错的是这里,这里表示的模块的计数与预期的计数不相等的时候,就会抛出这个异常,那这两个计数是怎么回事呢?接着看AbstractList.java源码:
private void checkForComodification() {
        if (l.modCount != expectedModCount)
    &
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,