jdk1.5增加了很多新的特性.其中有:泛型,增强的for,自动装箱与拆箱,可变参数,类型安全的枚举和静态导入。
泛型:关于泛型在我的上一篇博客中已经有提到(泛型详解)这里不再赘述。
增强的for:方便了数组,集合遍历,它也就这一点的好处,没有索引,没有更细致的访问,只是单纯地减少了代码量。
自动装箱与拆箱:针对的是8个原生数据类型及其包装类型。简化了操作,这样就不需要每次使用集合时,先把int a = 99;中的a包装成Integer类型,需要注意的有:
Integer a = 100;
Integer b = 100;
System.out.println(a == b); //true
Integer a = 200;
Integer b = 200;
System.out.println(a == b); //false
原因:Integer a = 100;等价于Integer a = Integer.valueOf(100);下面看源码,源码之下,一切大白于天下 public
static
Integer valueOf(
int
i) {
final
int
offset =
128
;
if
(i >= -
128
&& i <=
127
) {
// must cache
return
IntegerCache.cache[i + offset];
}
return
new
Integer(i);
}
到此应该恍然大悟了,IntegerCache缓存了[-128,127]之间的Integer对象,如果valueOf的参数i处于这之间,就返回缓存的对象。否则就new一
个新的Integer。前面已经说过,“==”作用于对象上的时候,其比较的是对象的地址,例子中的i1和i2都是从缓存中拿的,当然是同一个对象,i3和i4都是通过new Integer获得的,当然不是同一个对象了。
类似地,java.lang.Long,java.lang.Short分别缓存了[-128,127]之间的Long和Short对象,java.lang.Byte缓存了所有的对象,java.lang.Character缓存了[0,127]之间的Character对象。java缓存这些对象是为了性能优化,既然我们已经知道其缓存了这么些对象,在需要new Integer/Long/…的地方,可改用Integer/Long/Short…#valueOf方法。
可变参数:对于可变参数
public static int add(int... args)
{
int sum = 0;
for(int i=0;i<args.length;i++)
{
sum+=args[i];
}
return sum;
}
在方法内部的使用add(int... args)中args类似于数组,调用方法时也可以传进去一个数组add(new int[]{12,23,34,56}),但如果改成数组,范围就小了。
注:对于一个方法带可变参数的变量,最多只能有一个可变参数变量,而且可变参数变量必须在最后。例,add(String ss,double d,int... args)
类型安全的枚举:在开发中枚举常用于表示常量。方便开发使用。有两个常用的方法:values(){返回的
是枚举类型的数组}和valueOf(){将字符串转化成枚举类型的成员}。
所有的枚举都继承于java.lang.Enum类。枚举中的成员都是public static final类型的。每个枚举的类型值在编译期就可以确定下来。
静态导入:典型的鸡肋,没有什么价值,简化了操作(静态的变量或方法) import static com.qidan.Test.FLAG; 这样在使用时虽然无需使用类名.变量的方式访问使用,可直接使用(有点类似于继承),但这样的‘’方便“,迷惑了别人也迷惑了自己。不建议使用!!!