今天在CarrerCup上看到这么一道面试题:
[LinkedList]What's wrong with the code below under JDK 1.4? Fix it. How about JDK 1.5?
LinkedList[] ll = new LinkedList[3];
ll[1].add(1);
ll[1].add("red");
ll[2].add(2);
ll[2].add("green");
ll[3].add(3);
ll[3].add("blue");
其实是很简单的autoboxing机制,一直知道怎么用,但没有好好的去看过。
在JDK1.5之前是没有提供autoboxing机制的,并且在Java中是不能将一个int型或者其他原生数据类型放到一个集合中,集合只能持有对象的引用,所以如果要将原生数据类型放到一个集合中就必须将其包装,比如将int包装为Integer。当需要使用int时,必须使用intValue方法将Integer unbox。在此例中,可修改为
LinkedList[] ll = new LinkedList[3];
ll[1] = new LinkedList();
ll[1].add(new Integer(1));
ll[1].add(1);
ll[1].add("red");
System.out.println(ll[1].get(2));
这样的autoboxing和autounboxing操作会有一些警告:
- 比如一个Integer类型是可以有null值的,当你的程序准备将null值unbox为int型,就会得到一个NullPointerException。
- “==”操作符在Integer expression中比较的是引用地址,在int expression中 比较的值是否相当。
- 最后,这样的autoboxing和autounboxing会带来系统开销。
Use them only when there is an “impedance mismatch” between reference types and primitives, for example, when you have to put numerical values into a collection. It is not appropriate to use autoboxing and unboxing for scientific computing, or other performance-sensitive numerical code. An Integer
is not a substitute for an int
; autoboxing and unboxing blur the distinction between primitive types and reference types, but they do not eliminate it.