A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhaihao 中级黑马   /  2014-9-26 01:41  /  1969 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

JDK1.7的新特性是什么,越全越好,有没有人直到

7 个回复

倒序浏览
1、对集合类的语言支持;
2、自动资源管理; try(资源定义语句){要检测异常的代码}
3、改进的通用实例创建类型推断;
4、数字字面量下划线支持;
5、switch中使用string;
6、二进制字面量; 0b11111111
7、简化可变参数方法调用。
回复 使用道具 举报
本帖最后由 new999 于 2014-9-27 09:48 编辑

2、自动资源管理;
考虑如下繁琐的文件拷贝操作:
FileInputStream in = null;  
FileOutputStream out = null;  
try {  
  in = new FileInputStream("xanadu.txt");  
  out = new FileOutputStream("outagain.txt");    int c;
  while ((c = in.read()) != -1)  
    out.write(c);  
}catch(IOException e){
  throw new RuntimeException("文件复制失败:"+e.toString);
}finally{
  try {
    if (in != null)  
      in.close();
  }catch(IOException e){
    throw new RuntimeException("文件输入流关闭失败:"+e.toString);
  }finally{
    try {
      if (out != null)  
        out.close();
    }catch(IOException e){
      throw new RuntimeException("文件输出流关闭失败:"+e.toString);
    }
  }
}

上面不仅有大量的样版代码,而且InputStream.close()的文档表明它会抛出IOException(OutputStream也存在类似的异常,无论何种情况,要想成功编译这些代码,要么在外面加上catch块,要么将异常继续往外抛)。

try-catch-finally块的语义范围还要求变量FileInputStream in与FileOutputStream out声明在块的外面(如果定义在try块内,那么catch块与finally块就访问不到了)。

为了减少上面这些样版代码并且收紧块中所用的资源范围,Java语言在try块中新增了一些内容。最初的try-with-resources块(或者叫做ARM块)规范已经拥有实现了,随后该规范被纳入到JDK 7 build 105中。

新的接口java.lang.AutoCloseable被加到了提案API中,它只定义了一个会抛出Exception的方法close()。该接口是java.io.Closeable的父接口,这意味着所有的InputStream与OutputStream都会自动享受到该行为所带来的好处。此外,FileLock与ImageInputStream也实现了AutoCloseable接口。

这样,上面的代码就可以这样来写:

try (  
  FileInputStream in = new FileInputStream("xanadu.txt");  
  FileOutputStream out = new FileOutputStream("outagain.txt")  
) {  
  int c;  
  while((c=in.read()) != -1 )  
    out.write(c);  
}  

在try块的末尾,无论是正常结束还是抛出了异常,out与in资源都会自动调用close()方法。

关于这种方式,还有一些微妙之处值得我们注意:

◆如上代码所示,在资源部分中,最后一个资源后面是不允许使用分号的。

◆资源块使用()分隔,而不是常见的{},以此将其与现有的try块分隔开来。如果存在资源块,那么里面必须要包含一个或多个资源定义语句。

◆每个资源定义具有如下形式:type var = expression;在资源块中不能使用通常的语句。

◆资源都是隐式final的,也就是说即便没有使用final,这些资源也都是final的。如果尝试为资源变量赋值会得到一个编译期错误。

◆资源必须是AutoCloseable的子类型,如果不是的话会得到一个编译期错误。

◆资源关闭的顺序与定义的顺序正好相反。换句话说,在上面的代码示例中,out.close()要先于in.close()得到调用。这么做可以构建嵌套的流,然后从外向内关闭流,这要比按顺序关闭更好(也就是说,可以在底层的流关闭前先清空缓存)。

◆每个块可以生成n+1个异常,n是资源的数量。这出现在代码主体抛出了异常,然后每个资源关闭语句也都抛出异常的情况下。在这种情况下,代码主体的异常将被抛出,但其他的异常将会被添加到异常的抑制列表(suppressed exception list)中。可以通过getSuppressedExceptions()方法访问这些异常信息。

◆异常堆栈追踪信息可以带有Suppressed前缀:在这些情况下,序列化的Throwable格式也有所不同(如果Java 6客户端调用了远程Java 7运行时中的服务会出现这个问题,反之亦然)。

◆javax.swing与java.sql目前并不会加入到ARM中;类需要继承AutoCloseable才能为ARM所用

回复 使用道具 举报
1、对集合类的语言支持;
List list = ["item"];  
String item = list[0];  

Set set = {"item"};  

Map map = {"key" : 1};  
int value = map["key"];
回复 使用道具 举报
3、改进的通用实例创建类型推断;
Map<String> map = new HashMap<>();  
回复 使用道具 举报
4、数字字面量下划线支持;
int billion = 1_000_000_000;

6、二进制字面量;
int binary = 0b1001_1001;
回复 使用道具 举报
new999 中级黑马 2014-9-27 09:32:42
7#
5、switch中使用string;
String availability = "available";  
switch(availability) {  
case "available":  
    //code  
    break;  

  case "unavailable":  
    //code  
    break;  

  case "merged":  
    //code  

  default:  
    //code  
    break;  
}
回复 使用道具 举报
可以找找一些指导书来看!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马