JDK5的一些新特性大都在编译器上面下功夫,这没办法,java虚拟机的指令集是不能变得。这也使得java中的泛型有很大的局限性。
静态导入:
语法:import static 静态方法的完整路径
import static 语句是写给编译器看的,并没有设计或者效率上的优化。JDK5增加这种特性只是增加代码的可读性。
可变参数:
语法:void XXX(Object... args)
反汇编的结果为
可以看出sum接收的参数仍为数组,也可以把数组参数传递给sum方法。在通过可变参数的传递参数是,会将参数的内容组合成一个数组。数组的长度
由可变参数的个数决定。
增强for循环
语法:for(T t :ts)
反汇编的结果为:
增强for循环的语句要求要操作的结合必须实现Iterable接口。从编译结果可以看出,增强for循环的写法完全可以写成这样
List l = new ArrayList();
Iterator itor = l.iterator();
while(itor.hasNext){
Object o = itor.next;
}
但是这样写显然很繁琐,所以增强for循环可以使得代码更加简洁。但是要慎用这个语句,如下代码所示
Iterable iterable = new ArrayList();
for(Object o :iterable){
}
因为Iterable接口有数十个实现类,这意味着在调用iterator()方法是会解析这些类。如果这样的程序运行在android手机上,那你的程序比相对于
别人的程序,可谓是蚁行了。
自动拆箱和装箱
Integer i = 0;
Integer ii = 0;
boolean b = i ==ii;
Integer i2 = 128;
Integer ii2 = 128;
boolean b2 = i2 == ii2;
Object o = new Object[]{1,"1"};
int i3 = new Integer(1);
int i4 = new Integer(128);
反编译结果为
其实自动装箱就是调用包装类的静态方法valueOf(),为什么没有直接new呢,我们来看看valueOf方法的源码:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Integer有个IntegerCache内部静态类,缓存值为-128~127的整数。调用valueOf()方法是会判断参数是否在-128~127之间,如果是就检查缓存中
是否有值相同的Integer对象,如果有就返回。如果没有就创建,并缓存起来。所以上面的程序中b的值为true,b2的值为false。在java语言规范中有
这样的说明,一个字节(byte)或者一个字符(char)的范围在/u0000到/u007f之间或是int值在-128~127中用valueOf()方法返回的值是==的。至于
为什么这样做我也不太清楚。
自动拆箱就是调用包装类的xxxValue()方法(如果是int就是intValue())