Java7 新特性回顾
来自 <http://deepinmind.iteye.com/blog/2050282>
- 类型推导:<>被称为钻石操作符:
简述:构造方法后面不需要在指定泛型了,他会自动推导。
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<>(); |
- 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"); } |
- 自动资源管理:
简述:实现了AutoCloseable或Closeable (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的特性来自动关闭资源。只要实现了AutoCloseable和Closeable接口都可以。Stream,File,Socket,数据库连接都已经实现了。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"); } } |
- Fork Join框架:他是ExecutorService接口的实现,它使得你可以充分利用现代服务器的多处理器带来的好处。为那些能递归的拆分成更小任务的工作设计。目标是最大化压榨处理器的能力以提升程序的性能。和其他的ExecutorService一样,fork/join框架也是把任务分发给线程池中的多个线程。不同在于,他有一个工作窃取算法,这和生产者,消费者算法很大的不同,已经处理完任务的工作线程可以从别的繁忙的线程那里窃取任务。框架核心是ForkJoinPool extends AbstractExecutorService。ForkJoinPool实现了核心的工作窃取算法,可以执行ForkJoinTask进程。你可以把代码封装在一个ForkJoinTask的子类中,如RecursiveTask或者RecursiveAction中。感觉类似于一个本机模拟的Hadoop
- 数值字面量中可以使用下划线来分隔
简述:只是为了更好的显示,数量比较大的数字
(不能在开头,结尾,小数点后一位中放置下划线)
|
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 |
- 在一个catch中捕捉多个异常:
简述:在catch中通过|分隔要捕捉的多个异常
Java 7 之前:
|
try { ......
}catch(ClassNotFoundException ex) { ex.printStackTrace(); }catch(SQLException ex) { ex.printStackTrace(); } |
Java 7:
|
try { ......
}catch(ClassNotFoundException|SQLException ex) { ex.printStackTrace();
} |
另外,如果多个异常之间不能有子类和父类的关系:
错误示例:FileNotFoundException是IOException的子类
|
try { ......
}catch (FileNotFoundException | IOException ex) { ex.printStackTrace(); } |
- 使用0b前缀的二进制字面量:针对byte,short,int,long
简述:现在,你可以显式的定义这四种常用的进制数了
在这之前,你只能使用8进制(前缀'0'),19进制(0x,0X)的字面量。
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; |
- JavaNIO 2:7
简述:更好的使用文件和文件系统
引入了java.nio.file包已经相关的java.nio.file.attribute包,全面支持了文件IO已经对默认系统的访问。还引入了Path类来表示操作系统中的任意一个路径。新的API兼容老版本且提供了检查,删除,拷贝,移动文件的方法。
- G1垃圾回收器:Garbage First的缩写。它会优先回收垃圾最多的区域。
- 重抛异常的改进:
简述:更精确的抛出异常,也是有益于代码简化的
举例:
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; } } |

浙公网安备 33010602011771号