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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© godmmm 高级黑马   /  2015-1-16 21:41  /  2085 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class ArrayListDemo {
  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 List<Object> listA=new ArrayList<Object>();
  9.                 List<Object> listB=new ArrayList<Object>();
  10.                 listA.add(2);
  11.                 listA.add("3");
  12.                 listB.add(2);
  13.                 listB.add(3);
  14.                
  15.                 for(Object o:listA)
  16.                 {
  17.                         System.out.println(listB.contains(o));
  18.                 }
  19.         }

  20. }
  21. /*
  22. 运行结果:true
  23.           false*/
复制代码


按理说定义的Object集合存入数据,数据都变成Object了,
为什么用contains判断,还是按照集合里面具体存入的数据的类型来判断的呢,不是都是Object类型了么??

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

4 个回复

倒序浏览
List<Object>可以存放所有类型的对象...
2和2都是int
3和"3"一个是int 一个是String 所以不等...
不知道对不对.
回复 使用道具 举报
ListA  2 "3"
ListB  2, 3

1、遍历:
2、判断:contains()-->底层调用的还是equals方法
        2(Integer) --> 2(Integer)   
        2(Integer) --> 3(Integer)

        "3"(String) --> 2(Integer)
        "3"(String) --> 3(Integer)-->这里在equals进行比较时就返回false了
回复 使用道具 举报
lwj123 发表于 2015-1-23 18:01
ListA  2 "3"
ListB  2, 3

按照类型提升,不是都提升为Object类型了么,或者理解为强转为Object类型,这就难理解了
回复 使用道具 举报
new出来都的对象都在堆里,listB.add(3)在堆里面添加了Integer的3

而 listA.add("3"),添加的是String类型的3,String是特殊的对象,存放在方法区的常量池中,
listA.add("3")的意思不是直接把Sting的3存放进去,存进去的是“3”这个字符串在常量池的地址值

equals比较地址值,堆里面的地址值会跟方法区里的一样么{:3_60:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马