A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐林渊 黑马帝   /  2012-3-22 20:33  /  1968 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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的     帮忙找找那里有问题
        }
}

6 个回复

倒序浏览
rchm 黑马帝 2012-3-22 23:07:15
沙发
每一个new就是一个新的对象!即使他们看上去是那么的像, 但他们并不相等!你可以这样试试:
Person p1 = new Person("张三", 19);
List1.add(p1);
List2.add(p2);
这样结果才是:true
回复 使用道具 举报
因为是通过new关键字创建的对象,所以java虚拟机会为他们分配空间,即使内容相同,但是是通过new关键字创建的对象,所以内存地址是不一样的,如果list里面加的不是通过new出来的字符串,这样应该就没问题了。
回复 使用道具 举报
你这个问题,其实就是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 00:47
你这个问题,其实就是containsAll的问题了,在这个内容是对象的集合中,要说包含,那就是说这个里面的对象 ...

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

           了解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马