黑马程序员技术交流社区

标题: 关于ArrayList取交集 [打印本页]

作者: 移动小坦克    时间: 2013-3-14 22:42
标题: 关于ArrayList取交集
本帖最后由 韩松范 于 2013-3-15 09:51 编辑

这段代码,最后输出是
al1=[]al2=[java03, java08, Person@e48e45, java06]

如果把
al1.add(new Person());该城al1.add("java10");
al2.add("java10"));
那最后输出是
al1=[java10]al2=[java03, java08, Person@e48e45, java06]

String 不是也是对象吗?为什么两个"java10"相同,可以取交集,Person就不行。。。。

捕获.JPG (45.19 KB, 下载次数: 77)

捕获.JPG

作者: vmvm555    时间: 2013-3-14 23:05
本帖最后由 vmvm555 于 2013-3-14 23:09 编辑

你就定义了一个Person,你让ArrayList以什么依据来判断是相同的元素呢,你试着往Person中添加一些字段,然后覆写equals方法,还有别用图片传代码我复制代码都不好复制
作者: 谢洋    时间: 2013-3-14 23:09
String 不是也是对象吗?为什么两个"java10"相同,可以取交集,Person就不行。。。。
你这代码好像不java的;如果是java代码,那不是交集,而是同一个对象,,如果是其他代码,我不懂
作者: HM李超    时间: 2013-3-14 23:26
       String类型的“java10”可以通过String的equals方法判断al1和al2是否包含字符序列相同的情况,如果都包含“java10”就可以去交集;
       但是你定义了两个Person类的对象进行比较,单单的两个Person对象具有比较性吗?不具有。。。你可以试着往Person中写一些代码,为Person类自定义
一个比较器,使Person对象都具有可比较性,试试看。。。

作者: blackcaismine    时间: 2013-3-15 00:14
我觉得,你在al1.add里new的person是一个对象,对应一个哈希值
al2.add中new的person是另一个对象,哈希值与al1中不一致,如果在al1.retainAll(al2);之前加一个sop打印出al1的元素的话
我试了一下应该是这样
al1=[java01, java02, Person@190d0630, java04]
al1=[]
al2=[java03, java08, Person@26114629, java06]
两个person明显不是一个

如果想要取交集只要先new一个person就没问题了吧
                Person p = new Person();
                ArrayList al1 = new ArrayList();
                al1.add("java01");
                al1.add("java02");
                al1.add(p);
                al1.add("java04");

                ArrayList al2 = new ArrayList();
                al2.add("java03");
                al2.add("java08");
                al2.add(p);
                al2.add("java06");
这样,再取交集就有了
al1=[java01, java02, Person@26114629, java04]
al1=[Person@26114629]
al2=[java03, java08, Person@26114629, java06]

作者: 夏晓彤    时间: 2013-3-15 00:44
本帖最后由 夏晓彤 于 2013-3-15 01:05 编辑

楼上这是List集合,不是Set,怎哈希值都出来了。
楼主al1.add("java10");"java10"是字符串,字符串有自己的equals方法,他重写了Object的equals方法,而Person的equals方法是Object的所有我们要重写,告诉他什么样的对象是同一个对象
下面在Person类中加个equals方法就ok了

public boolean equals(Person pj)  
    {  
        return this.name.equals(p.name) && this.age == p.age;  //名字和年龄相同的为同以对象
}
另外再给Person加一个带参的构造方法,不然new出来的对象怎么比,如果不添加一个带参的构造方法,并且你不给name和age初始化,你用无参的构造方法直接在add中new应该会报错,因为equals方法里涉及到对name和age的操作
作者: itserious    时间: 2013-3-15 00:49
原因:那是因为字符串这个对象与其它对象在内存中的存储方式的不同引起的,字符串相对其它对象要特殊些,它在内存中是存放在一个叫“字符串池”中的。
      如果是通过 String str1=“abc”这种型式生成的String对象,会先去检查内存中“字符串池”里是否已经有一个字符串与 str1 的equalse属性值相等。如果“字符串池”中已经有这样一个字符串;就不会再生成新的字符串,而是直接将这个字符串赋值给 str1;如果池中没有一个字符串与 str1 的equalse属性值相等,才会生成一个新的字符串对象,并存放在池中去。(字符串为什么有这个特点? 因这字符串是一个经常用的对象,使用频率非常高,所以用这种方式来存储是为了节省内存空间。)

所以,al1.add("java10");     al2.add("java10"));这里两次添加的是同一个对象,它们的地址值是相等的。而 两次 new person();会生存两个地址值不同的对象。
但注意:String s2=new String("java10");  String s3= new String("java10");  这里 s2 和 s3也是两个不同的对象。

————————不知我说明白没有,希望对你有帮助!!:)————————
作者: 移动小坦克    时间: 2013-3-15 02:18
itserious 发表于 2013-3-15 00:49
原因:那是因为字符串这个对象与其它对象在内存中的存储方式的不同引起的,字符串相对其它对象要特殊些,它 ...

哈哈,这个答案是正解。。。。。。。。。
作者: 移动小坦克    时间: 2013-3-15 02:25
夏晓彤 发表于 2013-3-15 00:44
楼上这是List集合,不是Set,怎哈希值都出来了。
楼主al1.add("java10");"java10"是字符串,字符串有自己的 ...

集合中存的是对象的地址值。我知道两个Person的地址值不同,
但是为什么两个”java10"的地址值是相同的?
问题的关键在这里。。。。




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