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。