黑马程序员技术交流社区

标题: 下面代码当为”张三“和李四与”王五“equals(user.getName()出现异常和错误结果 [打印本页]

作者: 付家辉    时间: 2015-3-13 17:04
标题: 下面代码当为”张三“和李四与”王五“equals(user.getName()出现异常和错误结果
哪位大神能解释能改正求解释
  1. public class User implements Cloneable{
  2.         private String name;
  3.         private int age;
  4.        
  5.         public User(String name, int age) {
  6.                 this.name = name;
  7.                 this.age = age;
  8.         }
  9.         public boolean equals(Object obj) {
  10.                 if(this == obj) {
  11.                         return true;
  12.                 }
  13.                 if(!(obj instanceof User)) {
  14.                         return false;       
  15.                 }
  16.                 User user = (User)obj;
  17.                 //if(this.name==user.name && this.age==user.age)
  18.                 if(this.name.equals(user.name)
  19.                         && this.age==user.age) {
  20.                         return true;
  21.                 }
  22.                 else {
  23.                         return false;
  24.                 }
  25.         }
  26.         public int hashCode() {
  27.                 return name.hashCode() + age;
  28.         }
  29.        
  30.         public String toString() {
  31.                 return "{name:'" + name + "',age:" + age + "}";
  32.         }
  33.         public Object clone()  {
  34.                 Object object = null;
  35.                 try {
  36.                         object = super.clone();
  37.                 } catch (CloneNotSupportedException e) {}
  38.                 return object;
  39.         }
  40.         public void setAge(int age) {
  41.                 this.age = age;
  42.         }
  43.         public String getName() {
  44.                 return name;
  45.         }
  46. }
复制代码
  1. Collection users = new ArrayList();
  2.    users.add(new User("张三",28));  
  3.    users.add(new User("李四",25));      
  4.    users.add(new User("王五",31));  
  5.    Iterator itrUsers = users.iterator();
  6.    while(itrUsers.hasNext()){
  7.       System.out.println("aaaa");
  8.       User user = (User)itrUsers.next();
  9.       if("张三".equals(user.getName())){
  10.         users.remove(user);
  11.         //itrUsers.remove();
  12.       } else {
  13.         System.out.println(user);        
  14.       }
  15.    }
复制代码

作者: hamesksk    时间: 2015-3-13 17:19
用Iterator遍历集合的时候,不能对集合增删操作,因为这样会改变集合的指针,所以会抛异常
你用 ListIterator 遍历,用这个类有 remove函数来操作!
作者: wdhm5423    时间: 2015-3-13 17:23
会报同时修改异常,在迭代器遍历中,只能使用一次迭代器操作,Iterator.next()获取下一个元素,如果你再使用remove()删除元素,会报ConcurrentModificationException,同时修改异常。
作者: 付家辉    时间: 2015-3-14 09:34
wdhm5423 发表于 2015-3-13 17:23
会报同时修改异常,在迭代器遍历中,只能使用一次迭代器操作,Iterator.next()获取下一个元素,如果你再使 ...

//当"张三".equals():抛出java.util.ConcurrentModificationException;查看AbstractList.java是由于next()方法里调用final void checkForComodification() {

if (modCount != expectedModCount)throw new ConcurrentModificationException();}

//当"李四".equals():没有异常;运行结果aaaa   {name:'张三',age:28}  aaaa是由于两个add()和

remove()操作使public boolean hasNext() { return cursor != size();}返回false;从而出现如上结果

//当"王五".equals():aaaa {name:'张三',age:28}  aaaa  {name:'李四',age:25}  aaaa aaaa抛出java.util.ConcurrentModificationException;调用final void checkForComodification()方法 {if (modCount != expectedModCount)throw new ConcurrentModificationException();}

CopyOnWriteArrayList可以处理集合并发线程问题, 即修改new CopyOnWriteArrayList()实现集合并发同步操作。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2