黑马程序员技术交流社区

标题: List集合的contains方法疑惑 [打印本页]

作者: godmmm    时间: 2015-1-16 21:41
标题: List集合的contains方法疑惑
  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类型了么??
作者: 梁小刀11    时间: 2015-1-22 22:35
List<Object>可以存放所有类型的对象...
2和2都是int
3和"3"一个是int 一个是String 所以不等...
不知道对不对.
作者: lwj123    时间: 2015-1-23 18:01
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了
作者: godmmm    时间: 2015-1-23 18:45
lwj123 发表于 2015-1-23 18:01
ListA  2 "3"
ListB  2, 3

按照类型提升,不是都提升为Object类型了么,或者理解为强转为Object类型,这就难理解了
作者: Imp_x    时间: 2015-1-25 09:03
new出来都的对象都在堆里,listB.add(3)在堆里面添加了Integer的3

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

equals比较地址值,堆里面的地址值会跟方法区里的一样么{:3_60:}





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