各位大侠:遇到一种怪事,用arrayList中remove方法的时候怎么会弄错呢!!指教一下
import java.util.ArrayList;
import java.util.List;import test.common.User;
public class Test2 { private static final long serialVersionUID = 1L;
public static void main(String[] args){
List<User> list = new ArrayList<User>();
User u1 = new User();
u1.setName("a");
User u2 = new User();
u2.setName("b");
User u3 = new User();
u3.setName("c");
list.add(u1);
list.add(u2);
list.add(u3);
for(int i = 0;i<list.size();i++){
System.out.println("1:"+list.get(i).getName());
}
System.out.println("2:"+u2.getName());
list.remove(u2);
for(int i = 0;i<list.size();i++){
System.out.println("3:"+list.get(i).getName());
}
}
}package test.common;import java.io.Serializable;
public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private String pwd; private String img; private int pointX; private int pointY; private String message; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public String getImg() {
return img;
} public void setImg(String img) {
this.img = img;
} public int getPointX() {
return pointX;
} public void setPointX(int pointX) {
this.pointX = pointX;
} public int getPointY() {
return pointY;
} public void setPointY(int pointY) {
this.pointY = pointY;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return true;
}}
import java.util.ArrayList;
import java.util.List;import test.common.User;
public class Test2 { private static final long serialVersionUID = 1L;
public static void main(String[] args){
List<User> list = new ArrayList<User>();
User u1 = new User();
u1.setName("a");
User u2 = new User();
u2.setName("b");
User u3 = new User();
u3.setName("c");
list.add(u1);
list.add(u2);
list.add(u3);
for(int i = 0;i<list.size();i++){
System.out.println("1:"+list.get(i).getName());
}
System.out.println("2:"+u2.getName());
list.remove(u2);
for(int i = 0;i<list.size();i++){
System.out.println("3:"+list.get(i).getName());
}
}
}package test.common;import java.io.Serializable;
public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private String pwd; private String img; private int pointX; private int pointY; private String message; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public String getImg() {
return img;
} public void setImg(String img) {
this.img = img;
} public int getPointX() {
return pointX;
} public void setPointX(int pointX) {
this.pointX = pointX;
} public int getPointY() {
return pointY;
} public void setPointY(int pointY) {
this.pointY = pointY;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return true;
}}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
所以会移除第一个
&& user.getImg().equals(img) && user.getPointX() == pointX
&& user.getPointY() == pointY
&& user.getMessage().equals(message);另外请复写hashcode方法equals与hashCode成对出现。
Good Luck.
if (obj == this) {
return true;
}
if (getClass() != obj.getClass()) {
return false;
}
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 重写equals方法时,需要重写hashCode方法就是为了遵循以上协定
if(obj==null)
return false;
if(obj!=this)
return false;
if(getClass() != obj.getClass())
return false;
return true;
}