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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张翼 黑马帝   /  2011-11-13 08:15  /  1655 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class acc1
{
         private String name;
         private int age;
         acc1(String name,int age)
         {
                 this.name=name;
                 this.age=age;
         }
         public boolean equals(Object obj)
         {
                 if(!(obj instanceof acc1))
                         return false;
                 acc1 p=(acc1)obj;
                 return this.name.equals(p.name) && this.age==p.age;
                 
          }
         public String getName()
         {
                 return name;
         }
         public int getAge()
         {
                 return age;
         }
         


}
public class acc
{
          public static void main(String argv[])
          {
                  ArrayList al=new ArrayList();
                  al.add(new acc1("zhangsan",19));
                  al.add(new acc1("lisi",20));
                  al.add(new acc1("wangwu",21));
                  al.add(new acc1("wangwu",21));
                  
                  al=singleElement(al);
                  //控制输出的部分
                  Iterator it=al.iterator();
                  while(it.hasNext())
                  {
                         acc1 p=(acc1)it.next();//在这里为什么要进行类型转换呢?
                          sop(p.getName()+"::"+p.getAge());
                  }
                 
          }
          public static ArrayList singleElement(ArrayList al)
          {
                  ArrayList newal=new ArrayList();
                  Iterator it=al.iterator();
                  while(it.hasNext())
                  {
                          Object obj=it.next();
                          if(!newal.contains(obj))//contains方法的所谓底层调用是怎么回事?
                                  newal.add(obj);
                  }
                 return newal;
          }
          public static void sop(Object obj)
          {
                          System.out.println(obj);
                  }
上面程序的两个问题该怎么理解?

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

3 个回复

倒序浏览
陈超 黑马帝 2011-11-13 09:05:25
沙发
第一个:因为ArrayList集合存储时没有指定泛型类型,默认是Object类型,迭代时next()返回也是Object类型,向下转型所以要强转。
第二个:contains方法检测对象是否包含于集合中,在将对象与集合中的元素进行比较时,调用的是equals()方法,
        如果对象为自定义类的对象,而没有覆写Object中的equals方法时,equals比较的是两个对象的地址是否相等。
        要比较两个对象的内容是否相等时,必须覆写Object中的equals方法,

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
张翼 黑马帝 2011-11-13 09:33:18
藤椅
哦,原来Object类型可以兼容所有的类型,怪不得在参数中就默认他是Object类,所以需要转型呢,但是contains的底层调用如果仅仅理解成一种公式性质的东西,是不是太简单了,还有更好的解释吗?
回复 使用道具 举报
陈超 黑马帝 2011-11-13 09:36:22
板凳
一种公式性质的东西?没太懂你意思。能说清楚一些吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马