黑马程序员技术交流社区

标题: 帮忙判断 [打印本页]

作者: 唐林渊    时间: 2012-3-22 20:33
标题: 帮忙判断
public class Exercise6 {

        public static void main(String[] args) {
                List<Person> list1 = new ArrayList<Person>();
                list1.add(new Person("张三", 19));
                list1.add(new Person("李四", 22));
                list1.add(new Person("王五", 19));
               
                List<Person> list2 = new ArrayList<Person>();
                list2.add(new Person("张三", 19));               
                list2.add(new Person("李四", 22));
                list2.add(new Person("王五", 19));
               
                List<Person> list3 = new ArrayList<Person>();
                list3.add(new Person("张三", 19));               
                list3.add(new Person("李四", 22));
                list3.add(new Person("赵六", 21));
                System.out.println(deepEquals(list1, list3));
                System.out.println(deepEquals(list1, list2));
        }
        public static boolean deepEquals(List list1,List list2){
               

        return list1.containsAll(list2) && list2.containsAll(list1);                    //返回的结果都是false   求助  list1 和list2  完全相等  第二个应该是true的     帮忙找找那里有问题
        }
}
作者: rchm    时间: 2012-3-22 23:07
每一个new就是一个新的对象!即使他们看上去是那么的像, 但他们并不相等!你可以这样试试:
Person p1 = new Person("张三", 19);
List1.add(p1);
List2.add(p2);
这样结果才是:true
作者: 冯建鹏    时间: 2012-3-22 23:39
因为是通过new关键字创建的对象,所以java虚拟机会为他们分配空间,即使内容相同,但是是通过new关键字创建的对象,所以内存地址是不一样的,如果list里面加的不是通过new出来的字符串,这样应该就没问题了。
作者: 朱亚安    时间: 2012-3-23 00:47
你这个问题,其实就是containsAll的问题了,在这个内容是对象的集合中,要说包含,那就是说这个里面的对象在相同的地址上,才算是包含了
比如吧:Person p = new Person("aaa",20);
            ArrayList<Person> a1 = new ArrayList<Person>();
            ArrayList<Person> a2 = new ArrayList<Person>();
            这个时候,在使用a1.add(p);a2.add(p);
             这样的话,a1.containsAll(a2) && a2.containsAll(a1)才返回true的。因为他们都有同样地址的内容。这是为什么呢,其实这是由于Person类没有复写
            equals方法导致,默认的equals方法是和“==”实现是一样的,就是比较地址相同,才认为是相同的。
            
            所以你如果想第二个返回true,就复写Person类的equals方法。不过这个不用自己手写,让MyEclipse给咱们直接生成,你点在Person类名上,右击source中选择Generate hashCode() and equals().这样就省事了。然后你在运行试试,结果就是你想要的。这个我刚刚试过的。。。嘿嘿
作者: 唐林渊    时间: 2012-3-23 09:15
朱亚安 发表于 2012-3-23 00:47
你这个问题,其实就是containsAll的问题了,在这个内容是对象的集合中,要说包含,那就是说这个里面的对象 ...

                          受教
作者: 张锦萍    时间: 2012-3-23 09:30
你这里面这么多new Person(),每个new都会产生一个新的对象,
但是可以重写一下Person类的equals()和hashCode()方法,当name和age一样是返回true,
在用containsAll(list2) 方法比较就相等了
作者: 唐林渊    时间: 2012-3-24 00:26
张锦萍 发表于 2012-3-23 09:30
你这里面这么多new Person(),每个new都会产生一个新的对象,
但是可以重写一下Person类的equals()和hashCod ...

           了解




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