Java7新特性
| 特性1:二进制字面值(Binary Literals)   在java7里,整形(byte,short,int,long)类型的值可以用二进制类型来表示了,在使用二进制的值时,需要在前面加上ob或oB,看代码  | 
| Java代码  如果用十六进制来表示的,它们之间的关系就无法一眼看出来了。  特性2:数字变量对下划线_的支持 你可以在数值类型的变量里添加下滑线,除了以下的几个地方不能添加:  
 这个大家期待很久了,switch终于支持String了 public static void first() {         //项目状态         String status = "approval";         //我们之前经常根据项目状态不同来进行不同的操作         //目前已经换成enum类型                  switch (status) {             case "shouli":                 System.out.println("状态是受理");                 break;             case "approval":                 System.out.println("状态是审批");                 break;             case "finish":                 System.out.println("状态是结束");                 break;             default:                 System.out.println("状态未知");         }     }         每个case是使用String的equals方法来进行比较的,对大小写敏感。       和一连串的if-else-then想比,使用switch来比较String,Java编译器会生成更加有效的字节码,写一个例子测试一下。   Java代码    public static void second() {           String status = "approval";           if ("shouli".equals(status)) {               System.out.println("状态是受理");           } else if ("approval".equals(status)) {               System.out.println("状态是审批");           } else if ("finish".equals(status)) {               System.out.println("状态是结束");           } else {               System.out.println("状态未知");           }     }   使用javap之后,生成字节码如下:(略)网上说,用switch之后比用if-else生成的字节码更有效一些,不过目前至少从长度上来说,switch还是长一些 特性4:try-with-resources 声明   try-with-resources 是一个定义了一个或多个资源的try 声明,这个资源是指程序处理完它之后需要关闭它的对象。try-with-resources 确保每一个资源在处理完成后都会被关闭。  来看例子: public static String readFirstLineFromFile(String path) throws IOException {          try (BufferedReader br = new BufferedReader(new FileReader(path))) {            return br.readLine();          }     }        在java 7 以及以后的版本里,BufferedReader实现了java.lang.AutoCloseable接口。           由于BufferedReader定义在try-with-resources 声明里,无论try语句正常还是异常的结束,     它都会自动的关掉。而在java7以前,你需要使用finally块来关掉这个对象。       public static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {        BufferedReader br = new BufferedReader(new FileReader(path));        try {           return br.readLine();        } finally {           if (br != null) br.close();        }      }   然而,如果 readLine() 和 close() 这两个方法都抛出异常,那么readFirstLineFromFileWithFinallyBlock 方法只会抛出后面部分也就是finally块中的内容,try块中的异常就被抑制了,对于我们的程序来说,这显然不是一种好的方式。而在java 7中,无论是try块还是try-with-resource中抛出异常,都能捕捉到。 有 另外,一个try-with-resourcse声明了可以包含多个对象的声明,用分号隔开,和声明一个对象相同,会在结束后自动调用close方法,调用顺序和生命顺序相反。 try ( java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName); java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset) ) { // do something } 此外,try-with-resources 可以跟catch和finally,catch和finally的是在try-with-resources里声明的对象关闭之后才执行的。 特性5:捕获多种异常并用改进后的类型检查来重新抛出异常  在Java SE7里,一个catch可以捕获多个异常,这样可以减少重复代码。每个异常之间用 | 隔开。 public static void first(){      try {       BufferedReader reader = new BufferedReader(new FileReader(""));       Connection con = null;       Statement stmt = con.createStatement();      } catch (IOException | SQLException e) {        //捕获多个异常,e就是final类型的        e.printStackTrace();         }     }        而在Java SE6以前,需要这样写      Java代码          public static void second() {       try {         BufferedReader reader = new BufferedReader(new FileReader(""));         Connection con = null;         Statement stmt = con.createStatement();       } catch (IOException e) {             e.printStackTrace();         } catch (SQLException e) {             e.printStackTrace();         }     }          注意,如果一个catch处理了多个异常,那么这个catch的参数默认就是final的,你不能在catch块里修改它的值。另外,用一个catch处理多个异常,比用多个catch每个处理一个异常生成的字节码要更小更高效。 2、用更包容性的类型检查来重新抛出异常 在方法的声明上,使用throws语句时,你可以指定更加详细的异常类型。 static class FirstException extends Exception { }     static class SecondException extends Exception { }          public void rethrowException(String exceptionName) throws Exception {       try {          if (exceptionName.equals("First")) {              throw new FirstException();          } else {              throw new SecondException();          }       } catch (Exception e) {        throw e;       }      }   这个例子,try块中只能抛出两种异常,但是因为catch里的类型是 Exception,在java SE7以前的版本中,在方法声明中throws 只能写Exception,但是在java SE7及以后的版本中,可以在throws后面写 FirstException和SecondException——编译器能判断出throw e语句抛出的异常一定来自try块,并且try块只能抛出FirstException和SecondException。 public static void reThrowException(String exceptionName) throws FirstException, SecondException{      try {         if ("first".equals(exceptionName))            throw new FirstException();         else            throw new SecondException();      } catch (Exception e) {            throw e;      }     }   所以尽管catch里的异常类型是Exception,编译器仍然能够知道它是FirstException和 SecondException的实例。怎么样,编译器变得更智能了吧。 但是,如果在catch里对异常重新赋值了,在方法的throws后无法再象上面那样写成FirstException和SecondException了,而需要写成 Exception。 具体来说,在Java SE 7及以后版本中,当你在catch语句里声明了一个或多个异常类型,并且在catch块里重新抛出了这些异常,编译器根据下面几个条件来去核实异常的类型:  特性6:创建泛型对象时类型推断 只要编译器可以从上下文中推断出类型参数,你就可以用一对空着的尖括号<>来代替泛型参数。这对括号私下被称为菱形(diamond)。 在Java SE 7之前,你声明泛型对象时要这样 List<String> list = new ArrayList<String>();  |