首先,让我们来看最重要的事情。为了确定JDK 7中有哪些语言方面的微小变化,有关人员建立了一个名叫Project Coin的项目。描述了最终的五个变化(比五个多一点)。

  Java 7更新内容如下所示:

  ◆允许在switch中使用字符串

  ◆自动资源管理

  ◆通用实例创建来改进类型推断(diamond)

  ◆简化的Varargs方法调用

  ◆更好的整型文字综合性建议

  ◆Collections集合的语言支持

  ◆JSR292的语言支持

  在the OpenJDK 7特性页面中,你还可以看到其他的功能。

  这些功能分为不同的种类:

  ◆虚拟机(VM)

  ◆压缩的64位对象指针

  ◆G1垃圾回收器GC(G1)

  ◆JSR 292:非Java语言的虚拟机支持(动态调用,InvokeDynamic)

  语言方面(lang)

  ◆SR 294:模块化编程的语言以及虚拟机支持

  ◆JSR 308:Java类型注释

  ◆语言微小增强(我所谈论的Project Coin)

  ◆JSR TBD: Project Lambda

  内核(core)

  ◆模块化(Jigsaw项目)

  ◆对类加载器的结构进行升级

  ◆关闭URLClassLoader的方法

  ◆Unicode 5.1标准

  ◆并行以及集合的升级(jsr166y)

  ◆JSR 203:Java平台(NIO.2)的更多新型I/O API

  ◆SCTP (流控制传输协议,Stream Control Transmission Protocol)

  ◆SDP (套接字直接协议,Sockets Direct Protocol)

  ◆椭圆曲线加密技术(ECC)

  客户端(client)

  ◆Java 2D的XRender管道

  ◆转发端口6u10部署特性

  ◆为6u10图形功能创建新的平台API

  ◆Swing的Nimbus外观和感觉

  ◆Swing的JLayer元件

  网络(web)

  ◆更新XML的栈

  就像你所看到的,这涉及了很多东西。几个月前,我亲自尝试了新的 Garbage Collector (GC),其性能表现给我留下了非常深刻的印象。不幸的是,JVM几个小时就会崩溃一次,所以这个产品不能使用JVM。虽然在Java 1.6中也可以使用这个GC,但也会出现同样的问题,经常会出现崩溃。

  我想,这就是Java1.7增加新特性的原因。那么,现在我们最好去看一些代码实例。

  Java 7新特性的代码实例

  下面列出的大多数例子都是来源于Joe Wright博客中(Java7中的新语言特性)的高水平文章。

  集合的语言支持

  在这里我们主要讲的是,当创建一个List、Set或者Map的时候,你怎样尽量少写代码。你不必先实例化Object,然后再给Collection添加元素。你现在只需1行代码就可以完成。

  1.List list = ["item"];

  2.String item = list[0];

  3.

  4.Set set = {"item"};

  5.

  6.Map map = {"key" : 1};

  7.int value = map["key"];

  自动资源管理

  由于try / catch语句的原因,冗长的代码令人非常头痛。你或许会喜欢这个全新的特性。

实际上,下面这些代码:

  8.BufferedReader br = new BufferedReader(new FileReader(path));

  9.try {

  10.   return br.readLine();

  11.} finally {

  12.   br.close();

  13.}

  转变成了如下这种形式:

  14.try (BufferedReader br = new BufferedReader(new FileReader(path)) {

  15.   return br.readLine();

  16.}

 通用实例创建来改进类型推断(diamond)

  当你把对象的接口申明指定成范型后,你在对象实例化时不得不再指定一次。现在,你不必如此了,因为你可以这样:

  17.Map> map = new HashMap<>();

  数值文字的加强

  我不敢肯定这个对大多数人都有用。你可以这样做:

  18.int billion = 1_000_000_000;

  允许在switch中使用字符串

  这个无需解释,其意思很明确。

  19.String availability = "available";

  20.switch(availability) {

  21. case "available":

  22.    //code

  23.    break;

  24.

  25.  case "unavailable":

  26.    //code

  27.    break;

  28.

  29.  case "merged":

  30.    //code

  31.

  32.  default:

  33.    //code

  34.    break;

  35.}

  二进制文字

  你可以使用前缀0b创建二进制文字

  36.int binary = 0b1001_1001;

  以上这些就是Java1.7的代码实例。如果有人能给我指出还有哪些没有包含进去,那就更好了。我敢肯定,已经有其他的开发人员对此进行了关注。

  Java 1.7的性能表现

  Java 7的性能有多大的提升?这里我们来针对Java 7做一个测试,内容如下。在一台装有ArchLinux系统的Macbook Pro电脑上(因特尔Duo CPU T7700,主频2.40GHz,有两年的使用时间)运行了这些测试。内存是2Gb的,把Heap Size设置成了728m(-Xms728m -Xmx728m)。

  ◆测试1 为一个List添加100万个字符串值(String字符串是一个UUID,是用UUID.randomUUID()产生的)。

  ◆测试2 带有100万键、值对的HashMap。每个键、值对通过并行线程进行计算。键是一个UUID,值int是用Math.random()产生的。

  ◆测试3 把100万个ArrayList条目打印到一定数量的文件(1000个)中。把条目写进恰巧并行的不同文件中。

  我只比较了Java1.6 (1.6.0_19) 和 Java 1.7 (b87)。后来根据评论的要求,我把Java1.5也添加了进来,但是并没有添加Java1.4,因为它的时间太久远了。

  结果如下所示:

 


 Java 1.5
 Java 1.6
 Java 1.7
 
Test 1
 10,698 秒
 9,481秒
 9,328秒
 
Test 2
 69,827秒
 37,935秒
 36,636秒
 
Test 3
 26,931秒
 30,868秒
 27,383秒
 


  显然,不同版本之间的性能差异并不是特别大。