List和List<Object>和List<?>有什么区别?

这篇博客探讨了Java中List类型的使用,指出在添加元素时,List会将所有对象作为Object存储,不论其原始类型。在取出时,需要进行强制类型转换。通过测试代码展示了如何向List添加不同类型的数据,包括字符串、整数和布尔值,并强调了数组的局限性,即不能存储不同数据类型的元素。
摘要由CSDN通过智能技术生成

结论:

无论什么list,在添加的时候都是当作object存入,在取出的时候强转为指定类型。
因为list实际就是一个数组,数组无法存不同数据类型。

测试代码

public class Test {
    public static void main(String[] args) {
        List list1 = new ArrayList();
        list1.add("aa");
        list1.add(1);
        list1.add(true);
        Object o = list1.get(0);

        List<Object> list2 = new ArrayList();
        list2.add("bb");
        list2.add(2);
        list2.add(false);

        ArrayList<Test> list = new ArrayList<>();
        list.add(new Test());
        list.add(new Test());
        list.get(0);
    }
}

对应字节码

  0 new #2 <java/util/ArrayList>
  3 dup
  4 invokespecial #3 <java/util/ArrayList.<init> : ()V>
  7 astore_1
  8 aload_1
  9 ldc #4 <aa>
 11 invokeinterface #5 <java/util/List.add : (Ljava/lang/Object;)Z> count 2
 16 pop
 17 aload_1
 18 iconst_1
 19 invokestatic #6 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
 22 invokeinterface #5 <java/util/List.add : (Ljava/lang/Object;)Z> count 2
 27 pop
 28 aload_1
 29 iconst_1
 30 invokestatic #7 <java/lang/Boolean.valueOf : (Z)Ljava/lang/Boolean;>
 33 invokeinterface #5 <java/util/List.add : (Ljava/lang/Object;)Z> count 2
 38 pop
 39 aload_1
 40 iconst_0
 41 invokeinterface #8 <java/util/List.get : (I)Ljava/lang/Object;> count 2
 46 invokevirtual #9 <java/lang/Object.toString : ()Ljava/lang/String;>
 49 pop
 50 new #2 <java/util/ArrayList>
 53 dup
 54 invokespecial #3 <java/util/ArrayList.<init> : ()V>
 57 astore_2
 58 aload_2
 59 ldc #10 <bb>
 61 invokeinterface #5 <java/util/List.add : (Ljava/lang/Object;)Z> count 2
 66 pop
 67 aload_2
 68 iconst_2
 69 invokestatic #6 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
 72 invokeinterface #5 <java/util/List.add : (Ljava/lang/Object;)Z> count 2
 77 pop
 78 aload_2
 79 iconst_0
 80 invokestatic #7 <java/lang/Boolean.valueOf : (Z)Ljava/lang/Boolean;>
 83 invokeinterface #5 <java/util/List.add : (Ljava/lang/Object;)Z> count 2
 88 pop
 89 new #2 <java/util/ArrayList>
 92 dup
 93 invokespecial #3 <java/util/ArrayList.<init> : ()V>
 96 astore_3
 97 aload_3
 98 new #11 <Test>
101 dup
102 invokespecial #12 <Test.<init> : ()V>
105 invokevirtual #13 <java/util/ArrayList.add : (Ljava/lang/Object;)Z>
108 pop
109 aload_3
110 new #11 <Test>
113 dup
114 invokespecial #12 <Test.<init> : ()V>
117 invokevirtual #13 <java/util/ArrayList.add : (Ljava/lang/Object;)Z>
120 pop
121 aload_3
122 iconst_0
123 invokevirtual #14 <java/util/ArrayList.get : (I)Ljava/lang/Object;>
126 pop
127 return

关键字节码

在这里插入图片描述
在这里插入图片描述

取出操作

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值