ArrayList al=new ArrayList();
al.add(new Person1("wang",20));
al.add(new Person1("li",20))
;这种添加方法和
ArrayList al=new ArrayList();
Person1 p1=new Person1("niao",20);
al.add(p1);有什么不一样,
前者在删除元素时必须重写equals方法而后者完全不用直接al.remove(p1)就行了;
这是为什么?

解决方案 »

  1.   

    前者存放的是匿名对象,如果要获取该对象只有新建对象然后用equals来匹配
    后者对象名称为p1,可以直接通过p1来得到该对象。
      

  2.   

    remove(Object o)删除的时候传入值不为空的话,会遍历整个list,然后找到跟o equals以后为true的对象,删除掉,而equals默认比较的是引用,所以后一种直接传入想要删除对象的句柄即可删除,前一种没有句柄指向它,不能通过相同引用来找到,你只能重写equals方法,通过自己特定的逻辑来判断两个对象是否相同,然后删除。
      

  3.   


    首先来讲,这两种方式都是一样的,没有任何的不同,至于你说的删除时需要写equals方法,这是跟判断对象相等有关系。因为默认的情况下User user1 = new User("a");User user2 = new User("a");
     user1.equals(user2) ===> false
    因此 list .add(user1);后,调用list.remove(user2),无法删除user1,为什么?因为list会认为在集合中不存在user2这个对象。
     
      

  4.   

    lz这个问题和String a = "aaa";String b = "aaa";(a == b) == false 而a.equals(b) == true 这个问题有异曲同工之妙。
      

  5.   

    话说a==b 是true.善哉。呵呵
      

  6.   

    推荐楼主看源码
    前者在删除元素时必须重写equals方法而后者完全不用直接al.remove(p1)就行了;
    前者没有引用,现在要找出那个对象的地址比较难。因为是匿名的。
    所以重写equals的方法的意思是 找出 属性相同 的元素(根据你equals的匹配规则)。然后remove掉。
    后者你有p1引用,就不用通过equals匹配,直接remove掉该对象,如果你重写了equals,还是根据匹配规则remove元素。