新特性总结-JDK1.7

来源:互联网 发布:电脑编程代码 编辑:程序博客网 时间:2024/06/06 04:43

说明

  • 2011年发布
  • 一些子项目被推迟到JKD1.8
  • 新增G1垃圾回收
  • 增强动态语言的支持
  • 新增64位系统的压缩指针
  • NIO 2.0

对集合类的语言支持 【无效】

Java将包含对创建集合类的第一类语言支持。这意味着集合类的创建可以像Ruby和Perl那样了。

注: 经测试,该特性不适用JDK1.7,特性不可用,忽略即可。

原本需要这样:

List<String> list = new ArrayList<String>(); list.add("item"); String item = list.get(0); Set<String> set = new HashSet<String>(); set.add("item"); Map<String, Integer> map = new HashMap<String, Integer>(); map.put("key", 1); int value = map.get("key"); 

现在你可以这样:

List<String> list = ["item"]; String item = list[0]; Set<String> set = {"item"}; Map<String, Integer> map = {"key" : 1}; int value = map["key"];

这些集合是不可变的。

自动资源管理

Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,Sql classes等。

这个新的语言特性:

允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。

以前:

BufferedReader br = new BufferedReader(new FileReader(path));try {    return br.readLine();} finally {    br.close();}

现在:

try (BufferedReader br = new BufferedReader(new FileReader(path)) {     return br.readLine(); } 

你还可以定义多个资源:

try (InputStream in = new FileInputStream(src);         OutputStream out = new FileOutputStream(dest)) {    //TODO something }

为了支持这一行为,所有可关闭的类将被修改为可以实现一个AutoCloseable/Closeable(可关闭的)接口。

增强对通用实例创建的类型推断

类型推断是一个特殊的烦恼,下面的代码:

Map<String, List<String>> map = new HashMap<String, List<String>>(); 

通过类型推断后变成:

Map<String, List<String>> map = new HashMap<>(); 

这个<>被叫做diamond(钻石)运算符,该运算符从引用的声明中推断类型。

数字字面量-下划线支持

很长的数字可读性不好,在Java 7中可以使用下划线分隔长int以及long了,如:

int money = 1_000_000; 

运算时先去除下划线,如:

int sum1 = 1_2 * 10; // 120int sum2 = 1301_0;// 120 

switch中使用string

以前你在switch中只能使用number或enum。现在你可以使用String了:

String str = "case";switch (str) {    case "key":        //TODO    case "word":        //TODO    case "case":        //TODO    case "case1":        //TODO    default:        //TODO}

二进制字面量

由于继承C语言,Java代码在传统上迫使程序员只能使用十进制,八进制或十六进制来表示数(numbers)。
由于很少的域是以bit导向的,这种限制可能导致错误。

现在可以使用0b/0B前缀创建二进制字面量

例如:

int binary = 0b1001_1001; 

现在可以使用二进制字面量这种表示方式,并且以非常简短的代码,将二进制字符转换为数值类型,如byte或short

例如:

byte obByte = (byte)0b001;    short obShort = (short)0B010;    

简化可变参数调用

有些参数类型,例如ArrayList<Number>List<String>,是非具体化的(non-reifiable).在编译阶段,编译器会擦除该类型信息。

当程序员试图使用一个不可具体化的可变参数并调用一个varargs (可变)方法时,编辑器会生成一个“非安全操作”的警告。

例如:

List list = new ArrayList<Number>();  List<String> storeList = list;// unchecked warning  list.add(0, new Integer(10)); // another unchecked warning  String s = storeList .get(0); // ClassCastException is thrown  

在jdk7之前,当你调用一个含有非具体化参数的可变参数方法,你必须自行保证不会发生“heappollution”。

Heappollution 指一个变量被指向另外一个不是相同类型的变量。

这有一个问题,如果调用者对方法不熟悉,他根本无法判断。

JDK7对此做了改进,在可变参数方法中传递非具体化参数(Non-Reifiable Formal Parameters)时,在该方法被定义时就发出警告。

将警告从call转移到了方法声明(methord-declaration)的过程中。这样API设计者就可以使用vararg,因为警告的数量大大减少了。

例如,当你定义下面的函数时

public static <T> void addElementToList (List<T> list, T... elements) {      for (T element : elements) {          list.add( element );      }  }

你会得到一个warning

warning: [varargs] Possible heap pollution from parameterized vararg type

要消除警告,可以有三种方式

  • 加 annotation @SafeVarargs
  • 加 annotation @SuppressWarnings({“unchecked”, “varargs”})
  • 使用编译器参数 –Xlint:varargs
原创粉丝点击