先贴出面试题
以下代码运行结果是什么。
public class Test {
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
解析
1.instanceof
instanceof是用来判断是否属于某个类型
2.基本类型的自动装箱
由于collection只能装入对象类型的数据,0是一个基本数据类型,在jdk1.5之前是不能装入collection中的,但是在jdk1.5之后加入了自动装箱与拆箱,在Listlist1.add(0);代码运行的时候回自动将0转化成Integer类型的对象放入集合中。
3.集合中对象的类型
在执行Listlist1.add(0);语句时,自动装箱操作将0转为Integer放入ArrayList中,由于没有指定泛型,所以ArrayList会将0以Object的形式在集合中保存,
执行List Listlist2 = Listlist1;时,将Listlist1指针指向的地址赋给Listlist2,他们指向的是同一块堆内存空间。
当执行Listlist1.get(0) instanceof Integer时,相当于先从集合中取出编号为0的数据,由于没有指定泛型,系统根据Listlist1.get(0).getClass()拿到数据的实际类型java.lang.Integer再和Integer进行判断。所以结果都是true。
结论
- 集合不能装入基本类型数据,jdk1.5之后在装入基本类型数据时会自动包装成相应的对象类型。
- 集合在底层都是以object对象来存储数据的,在取出数据时会将数据转化为指定泛型的类型,如果不指定泛型,则会转化成object.getClass()实际对象类型。
- 集合之间赋值是将地址传递,并不是复制一个集合过去。