jdk各版本的区别(一)

2014-11-24 02:57:38 · 作者: · 浏览: 4

学习使用java也有一段时间了,突然有人问我关于jdk版本的区别,我一下不知道怎么回答,因为以前没有注意过,现在在网络上找到个人认为比较好的资料。
jdk1.5的新特性:
1. 泛型
2 自动装箱/拆箱
3 for-each
4 static import
5 变长参数

1. 泛型 (避免类型强制转换可能引起的运行错误)
例如:
ArrayList list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(4));
int i=((Integer)(list.get(0))).parseInt();
很麻烦
ArrayListlist=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(4));
int i=list.get(0).parseInt();


2 自动装箱/拆箱

上面例子的最后一句可改为:
int i=list.get(0);
因为原始类型与对应的包装类不用显式转换

3 for-each
循环的增强
int a[]={........};//初始化
for(int i:a)
{
......
}
不用以前的i=0;i

4 static import
以前调Java.math
Math.sqrt();
现在 static import java.lang.Math.sqrt;
再 sqrt();
相当于你自己类里有这个方法

5 变长参数
int sum(int ...intlist)
{
int i,sum;
sum=0;
for(int i=0;i {
sum+=list[i];
}
return sum;

}
有任意个参数,把他看作数组

jdk6.0新特性

增强的for循环语句
为了迭代集合和数组,增强的for循环提供了一个简单、兼容的语法。有两点值得一提:
一、在循环中,初始化表达式只计算一次。int表达式

未增强的For:
int sum = 0;
Integer[] numbers = computeNumbers();
for (int i=0; i < numbers.length ; i++)
sum += numbers[i];

增强后的For:
int sum = 0;
for ( int number: computeNumbers() )
sum += number;


局限性
增强的for循环迭代期间不能访问迭代器或下标
请看下面的例子:
for (int i=0; i < numbers.length ; i++) {

if (i != 0) System.out.print(",");

System.out.print(numbers[i]);

}

这是另一个例子:
for (Iterator it = n.iterator() ; it.hasNext() ; )

if (it.next() < 0)

it.remove();

注释
注释处理是一个很大的话题。因为本文只关注核心的语言特性,所以我们不打算涵盖它所有的可能形式和陷阱。 我们将讨论内置的注释(SuppressWarnings,Deprecated和Override)以及一般注释处理的局限性。


Suppress Warnings
该注释关闭了类或方法级别的编译器警告。有时候您比编译器更清楚地知道,代码必须使用一个被否决的方法或执行一些无法静态确定是否类型安全的动作,而使用:
@SuppressWarnings("deprecation")

public static void selfDestruct() {

Thread.currentThread().stop();

}


这可能是内置注释最有用的地方。遗憾的是,1.5.0_04的javac不支持它。但是1.6支持它,并且Sun正在努力将其向后移植到1.5中。
Eclipse 3.1中支持该注释,其他IDE也可能支持它。这允许您把代码彻底地从警告中解脱出来。如果在编译时出现警告,可以确定是您刚刚把它添加进来——以帮助查看那些可能不安全的代码。随着泛型的添加,它使用起来将更趁手。


Deprecated
遗憾的是,Deprecated没那么有用。它本来旨在替换@deprecated javadoc标签,但是由于它不包含任何字段,所以也就没有方法来建议deprecated类或方法的用户应该使用什么做为替代品。大多数用法都同时需要javadoc标签和这个注释。

Override
Override表示,它所注释的方法应该重写超类中具有相同签名的方法:
@Override

public int hashCode() {

...

}


看上面的例子,如果没有在hashCode中将“C”大写,在编译时不会出现错误,但是在运行时将无法像期望的那样调用该方法。通过添加Override标签,编译器会提示它是否真正地执行了重写。
在超类发生改变的情况中,这也很有帮助。如果向该方法中添加一个新参数,而且方法本身也被重命名了,那么子类将突然不能编译,因为它不再重写超类的任何东西。


其它注释
注释在其他场景中非常有用。当不是直接修改行为而是增强行为时,特别是在添加样板代码的情况下,注释在诸如EJB和Web services这样的框架中运行得非常好。
注释不能用做预处理器。Sun的设计特别预防了完全因为注释而修改类的字节码。这样可以正确地理解该语言的成果,而且IDE之类的工具也可以执行深入的代码分析和重构之类的功能。
注释不是银弹。第一次遇到的时候,人们试图尝试各种技巧。请看下面这个从别人那里获得的建议:
public class Foo {

@Property

private int bar;

}


其思想是为私有字段bar自动创建getter和setter方法。遗憾的是,这个想法有两个失败之处:1)它不能运行,2)它使代码难以阅读和处理。 它是无法实现的,因为前面已经提到了,Sun特别阻止了对出现注释的类进行修改。
即使是可能的,它也不是一个好主意,因为它使代码可读性差。第一次看到这段代码的人会不知道该注释创建了方法。此外,如果将来您需要在这些方法内部执行一些操作,注释也是没用的。 总之,不要试图用注释去做那些常规代码可以完成的事情。


枚举
enum 非常像public static final int声明,后者作为枚举值已经使用了很多年。对int所做的最大也是最明显的改进是类型安全——您不能错误地用枚举的一种类型代替另一种类型,这一点和 int不同,所有的int对编译器来说都是一样的。除去极少数例外的情况,通常都应该用enum实例替换全部的枚举风格的int结构。
枚举提供了一些附加的特性。EnumMap和EnumSet这两个实用类是专门为枚举优化的标准集合实现。如果知道集合只包含枚举类型,那么应该使用这些专门的集合来代替HashMap或HashSet。
大部分情况下,可以使用enum对代码中的所有public static final int做插入替换。它们是可比的,并且可以静态导入,所以对它们的引用看起来是等同的,即使是对于内部类(或内部枚举类型)。注意,比较枚举类型的时候,声明它们的指令表明了它们的顺序值。

“隐藏的”静态方法
两个静态方法出现在所有枚举类型声明中。因为它们是枚举子类上的静态方法,而不是Enum本身的方法,所以它们在java.lang.Enum的javadoc中没有出现。
第一个是values(),返回一个枚举类型所有可能值的数组。
第二个是valueOf(),为提供的字符串返回一个枚举类型,该枚举类型必须精确地匹配源