各位大侠:遇到一种怪事,用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;
}}

解决方案 »

  1.   

    自己先顶一个!!是不是User类中那个equals方法的问题!!自己拿不准来问一下的!!
      

  2.   

    因为你重写了equals方法,,而ArrayList里的remove方法的源码是用到了equals方法
      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;
        }
    所以会移除第一个
      

  3.   

    重写equals方法判断属性是否同参数对象的属性相等。User user = (User) obj; return user.getName().equals(name) && user.getPwd().equals(pwd)
    && user.getImg().equals(img) && user.getPointX() == pointX
            && user.getPointY() == pointY
            && user.getMessage().equals(message);另外请复写hashcode方法equals与hashCode成对出现。
    Good Luck.
      

  4.   

    主要原因就是你的这两个判断, 当同为一个类时就冲突,如果必须要下面的判断,需要另写一个方来实现
             if (obj == this) {
                return true;
            }
            
            if (getClass() != obj.getClass()) {
                return false;
            }
      

  5.   

    ArrayList里的remove方法的源码是用到了equals方法
      

  6.   

    你的equals重写的还不对,而且hashCode没有重写~
      

  7.   

    弱弱的问一句为什么重写equals方法,一定要重写hashCode方法吗?
      

  8.   

    hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 
    如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 
    如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 重写equals方法时,需要重写hashCode方法就是为了遵循以上协定
      

  9.   

    LZ   User类中的equals()方法逻辑有问题:当比较u1.equals(u2)的时候,所有if语句都不满足,最后却返回了ture。改成下面这样就可以了。 不过最好在equals内部比较User的数据域,而不是对象的引用。    public boolean equals(Object obj) {
            if(obj==null)
             return false;
            if(obj!=this)
             return false;
            if(getClass() != obj.getClass())
             return false;
            return true;
        }
      

  10.   

    根据自己的业务需求重写hashcode()和equals()方法,就目前你的这个类来说,要重写的话,好像就name能用来判断了