黑马程序员技术交流社区
标题:
下面代码当为”张三“和李四与”王五“equals(user.getName()出现异常和错误结果
[打印本页]
作者:
付家辉
时间:
2015-3-13 17:04
标题:
下面代码当为”张三“和李四与”王五“equals(user.getName()出现异常和错误结果
哪位大神能解释能改正求解释
public class User implements Cloneable{
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(!(obj instanceof User)) {
return false;
}
User user = (User)obj;
//if(this.name==user.name && this.age==user.age)
if(this.name.equals(user.name)
&& this.age==user.age) {
return true;
}
else {
return false;
}
}
public int hashCode() {
return name.hashCode() + age;
}
public String toString() {
return "{name:'" + name + "',age:" + age + "}";
}
public Object clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {}
return object;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
}
复制代码
Collection users = new ArrayList();
users.add(new User("张三",28));
users.add(new User("李四",25));
users.add(new User("王五",31));
Iterator itrUsers = users.iterator();
while(itrUsers.hasNext()){
System.out.println("aaaa");
User user = (User)itrUsers.next();
if("张三".equals(user.getName())){
users.remove(user);
//itrUsers.remove();
} else {
System.out.println(user);
}
}
复制代码
作者:
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