Java7 新特性回顾

原文:Java 8?还记得那年大明湖畔的Java 7吗?

来自 <http://deepinmind.iteye.com/blog/2050282>

 

  1. 类型推导:<>被称为钻石操作符:

简述构造方法后面不需要在指定泛型了,他会自动推导。

Java7之前:类型推导只对方法有用,如果在创建对象时左右两边都要指定泛型类型

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

List<Integer> primes = new ArrayList<Integer>();  

Java7:只需要在左边指定。

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

List<Integer> primes = new ArrayList<>();  

  1. switch中支持String类型

简述:switch语句以前是不支持String的。

Java7:

String state = "NEW";  

  

switch (day) {  

   case"NEW": System.out.println("Order is in NEW state"); break;  

   case"CANCELED": System.out.println("Order is Cancelled"); break;  

   case"REPLACE": System.out.println("Order is replaced successfully"); break;  

   case"FILLED": System.out.println("Order is filled"); break;  

   default: System.out.println("Invalid");  

}  

  1. 自动资源管理:

简述:实现了AutoCloseableCloseable (extends AutoCloseable)后就不需要finally中关闭流了

JDK7之前,我们需要一个finally块来确保资源被释放掉,最常见在文件流中:

public staticvoid main(String args[]) {  

        FileInputStream fin = null;  

        BufferedReader br = null;  

        try {  

            fin = new FileInputStream("info.xml");  

            br = new BufferedReader(new InputStreamReader(fin));  

            if (br.ready()) {  

                String line1 = br.readLine();  

09  

                System.out.println(line1);  

            }  

        } catch (FileNotFoundException ex) {  

            System.out.println("Info.xml is not found");  

        } catch (IOException ex) {  

            System.out.println("Can't read the file");  

        } finally {  

            try {  

                if (fin != null) fin.close();  

                if (br != null) br.close();  

            } catch (IOException ie) {  

                System.out.println("Failed to close files");  

            }  

        }  

    }  

Java 7中,可以使用try-with-resource的特性来自动关闭资源。只要实现了AutoCloseableCloseable接口都可以。StreamFileSocket,数据库连接都已经实现了。Java7的代码如下:

public staticvoid main(String args[]) {  

       try (FileInputStream fin = new FileInputStream("info.xml");  

  BufferedReader br = new BufferedReader(new InputStreamReader(fin));) {  

  if (br.ready()) {  

   String line1 = br.readLine();  

   System.out.println(line1);  

  }  

}catch (FileNotFoundException ex) {  

  System.out.println("Info.xml is not found");  

}catch (IOException ex) {  

  System.out.println("Can't read the file");  

}  

}  

  1. Fork Join框架他是ExecutorService接口的实现,它使得你可以充分利用现代服务器的多处理器带来的好处。为那些能递归的拆分成更小任务的工作设计。目标是最大化压榨处理器的能力以提升程序的性能。和其他的ExecutorService一样,fork/join框架也是把任务分发给线程池中的多个线程。不同在于,他有一个工作窃取算法,这和生产者,消费者算法很大的不同,已经处理完任务的工作线程可以从别的繁忙的线程那里窃取任务。框架核心是ForkJoinPool extends AbstractExecutorServiceForkJoinPool实现了核心的工作窃取算法,可以执行ForkJoinTask进程。你可以把代码封装在一个ForkJoinTask的子类中,如RecursiveTask或者RecursiveAction中。感觉类似于一个本机模拟的Hadoop
  2. 数值字面量中可以使用下划线来分隔

简述:只是为了更好的显示,数量比较大的数字

(不能在开头,结尾,小数点后一位中放置下划线)

int billion =1_000_000_000;

long creditCardNumber=1234_5678_9098_7654L;

long ssn=777_99_8888L;

double pi=3.1344_2334;

float =3.14_15_92_65f;

错误的示例:

double pi = 3._1415_9265; // underscore just after decimal point  

long creditcardNum = 1234_4567_8901_2345_L; //underscore at the end of number  

long ssn = _777_99_8888L; //undersocre at the beginning  

  1. 在一个catch中捕捉多个异常

简述:在catch中通过|分隔要捕捉的多个异常

Java 7 之前:

try {  

    ......  

  

}catch(ClassNotFoundException ex) {  

   ex.printStackTrace();  

}catch(SQLException ex) {  

   ex.printStackTrace();  

}  

Java 7

try {  

   ......  

  

}catch(ClassNotFoundException|SQLException ex) {  

    ex.printStackTrace();  

  

}  

另外,如果多个异常之间不能有子类和父类的关系:

错误示例FileNotFoundExceptionIOException的子类

try {  

   ......  

  

}catch (FileNotFoundException | IOException ex) {  

   ex.printStackTrace();  

}

  1. 使用0b前缀的二进制字面量:针对byte,short,int,long

简述:现在,你可以显式的定义这四种常用的进制数了

在这之前,你只能使用8进制(前缀'0'),19进制(0x0X)的字面量。

Java 7

int mask = 0b01010000101;  

当然,结合上面的下划线特性,这样写会更好:

int binary = 0B0101_0000_1010_0010_1101_0000_1010_0010;  

各种进制表示举例:

int binary = 0b1111_1101;  //二进制

int hex = 0x23f23d; //十六进制

int octal = 02337;    //八进制

int octal_error = 02338;  //语法错误,八进制中数值不能超过7

int decimal = 21329;    

  1. JavaNIO 2:7

简述:更好的使用文件和文件系统

引入了java.nio.file包已经相关的java.nio.file.attribute包,全面支持了文件IO已经对默认系统的访问。还引入了Path类来表示操作系统中的任意一个路径。新的API兼容老版本且提供了检查,删除,拷贝,移动文件的方法。

  1. G1垃圾回收器Garbage First的缩写。它会优先回收垃圾最多的区域。
  1. 重抛异常的改进:

简述更精确的抛出异常,也是有益于代码简化的

举例:

Java 7以前:抛什么异常,捕捉什么异常,如果有多个异常,你会用一个通过的Exception,但是捕捉也只能捕捉Exception,很不精确。

publicvoid obscure() throws Exception{  

    try {  

        new FileInputStream("abc.txt").read();  

        new SimpleDateFormat("ddMMyyyy").parse("12-03-2014");        

    } catch (Exception ex) {  

        System.out.println("Caught exception: " + ex.getMessage());  

        throw ex;  

    }  

}  

Java 7:精确的异常重抛:如果你在catch中重新抛出异常,实际真正抛出的异常类型会是:

1

你的try块抛出的异常

2

还没有被前面的catch块处理过,并且

3

catch的参水猿u类型是Exception的某个子类

Java7

publicvoid precise() throws ParseException, IOException {  

    try {  

        new FileInputStream("abc.txt").read();  

        new SimpleDateFormat("ddMMyyyy").parse("12-03-2014");        

    } catch (Exception ex) {  

        System.out.println("Caught exception: " + ex.getMessage());  

        throw ex;  

    }  

}  

posted @ 2014-04-24 14:39  天外的星星  阅读(283)  评论(0)    收藏  举报