instanceof 在list

public static void main(String args[]) {

      List  Listlist1 = new ArrayList();

      Listlist1.add(0);

      List Listlist2 = Listlist1;

        System.out.println(Listlist1.get(0) instanceof Integer);

        System.out.println(Listlist2.get(0) instanceof Integer);

}

 

打印出来是:

  • true true

解析
 

collection类型的集合(ArrayList,LinkedList)只能装入对象类型的数据,该题中装入了0,是一个基本类型,但是JDK5以后提供了自动装箱与自动拆箱,所以int类型自动装箱变为了Integer类型。编译能够正常通过。

将list1的引用赋值给了list2,那么list1和list2都将指向同一个堆内存空间。instanceof是Java中关键字,用于判断一个对象是否属于某个特定类的实例,并且返回boolean类型的返回值。显然,list1.get(0)和list2.get(0)都属于Integer的实例

 

不指定ArrayList类型,存入数据,再次取出时,默认是Object类型;但这个题的关键是instanceof关键字,instanceof执行时类似利用java反射机制,识别对象信息。



public class Test { public static void main(String[] args){ List list1 = new ArrayList(); List list2 = list1; list1.add(0); Object o = list1.get(0); Class<?> oClass = o.getClass(); System.out.println(oClass.getSimpleName()); // 实际类型为Integer。 System.out.println(list1.get(0) instanceof Integer); System.out.println(list2.get(0) instanceof Integer); // ArrayList在底层存储数据时就是采用的一个Object[]类型的数组来实现的。在get操作时会强转为泛型类型然后返回, 在 // 此例中并没有给ArrayList泛型。 所以使用的默认值, 即Object类型。所以此例中返回的是一个Object的对象。 // 但是又因为在add的时候由于0是基本类型, 所以在add时会发生自动装箱操作, 将0转换为Integer类型然后添加到ArrayList中。所以 // 通过get获取的对象的实际类型为Integer(第14行通过获取它的Class对象进行验证); // instanceof在进行比较时会获取对象的实际类型进行比较, 所以通过list1.get(0)和list2.get(0)获取到的对象的实际类型肯定是Integer // 类型的, 所以这两个输出的都是true。 }}

 

List集合中的元素必须是对象。

Listlist1.add(0);JDK1.5之后支持自动装箱(int类型自动装箱成Integer),编译通过。

 

instanceof:前一个参数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是一个接口, 它用于判断前面的对象是否是后面的类,或者其子类、实现类的实例

 

List没有使用泛型,说明使用get(0)取出的元素的编译类型是Object型的, 但运行时类型是Integer。所以打印true。这边体现了多态。

而Listlist1把引用赋给了List list2,说明两个指向同一个对象。第二个打印的也是true。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那些年的代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值