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 ,