结论:
无论什么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
关键字节码