Java7 新特性(根据学习进度持续更新)
1、改进了switch分支语句,允许switch语句中的控制表达式为java.lang.String类型。
String s = "test"; switch (s) { case "test" : System.out.println("test"); case "test1" : System.out.println("test1"); break ; default : System.out.println("break"); break ; }
2、数值中使用下画线分隔:
int a = 0B1000_0000_0000_0000_0000_0000_0000_0011;
3、新添了一个Objects具类,它提供了一些方法来操作对象,这些工具方法大多是“空指针”安全的。比如,你不能明确地判断一个引用变量是否为null,如果贸然地调用改变量的toString()方法,则可能发生NullPointerException异常;如果使用Objects类提供的toString(Object o)方法,就不会引发空指针异常,当o为null 时,程序将返回一个“null”字符串。
import java.util.Objects; public class ObjectsTest { //定义一个obj变量,默认为null static ObjectsTest obj; public static void main(String[] args) { //输出一个null对象的hashCode值,输出0 System.out.println(Objects.hashCode(obj)); //输出一个null对象的toString,输出null System.out.println(Objects.toString(obj)); //要求obj不能为null,如果为null则引发异常 System.out.println(Objects.requireNonNull(obj)); } }
4、java7新增了一个类ThreadLocalRandom,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程竞争,最终保证系统具有更好的线程安全。
ThreadLocalRandom类的用法与Random用法基本类似,它提供一个静态的current()方法来获取ThreadLocalRandom对象,获取对象之后即可调用各种nextXXX()方法来获取伪随机数了。
ThreadLocalRandom与Random都比Math的random()方法提供更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围。
5、Java7泛型的“菱形”语法:
java7允许在构造器后不跟完整的泛型信息,只需要给出一对尖括号(<>)即可。
List<String> strList = new ArrayList<> ();
6、java7提供多异常捕捉
在java7以前,每个catch只能捕获一种类型的异常,但从java7开始,一个catch块可以捕获多种类型的异常。
使用一个catch捕获多种类型的异常的时候需要注意如下两个地方:
捕获多种异常的时候,多种异常类型之间用竖线(|)隔开;
捕获多种类型的异常的时候,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。
public class MultiExceptionTest { /** * @param args */ public static void main(String[] args) { try{ int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); int c = a / b; System.out.println("您输入的两个数相除的结果是:" + c ); } catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException ie){ System.out.println("程序发生了数组越界、数字格式异常、算术异常之一"); //此处的 ie 默认有final修饰,所以不能改变,不能重新赋值。所以下面一行代码是错误的 //ie = new ArithmeticException("test"); } catch (Exception e){ System.out.println("未知异常。"); //捕获一种异常的时候,异常类型没有final修饰,所以下面的代码是合法的。 e = new RuntimeException("test"); } } }
7、java7中的try语句可以自动关闭资源
java7增强了try语句的功能,它允许在try关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源(此处的资源是指那些必须在学程序结束时显式关闭的资源,比如数据库连接,网络连接等),try语句在该语句结束时自动关闭这些资源。
这些资源必须实现AutoCloseable或者Closeable接口,实现这两个接口就必须实现close() 方法。
Ps. java7几乎把所有的“资源类”(包括文件IO的各种类,JDBC编程的Connection、Statement等接口……)进行了改写,改写后的资源类都实现了AutoCloseable或Closeable接口。
import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; public class AutoCloseTest { /** * @param args */ public static void main(String[] args) throws IOException{ try( //声明、初始化两个可关闭的资源 //try语句会自动关闭这两个资源 BufferedReader br = new BufferedReader(new FileReader("AutoCloseTest.java")); PrintStream ps = new PrintStream(new FileOutputStream("a.txt")) ) { //使用两个资源 System.out.println(br.readLine()); ps.println("庄生晓梦迷蝴蝶"); } //自动关闭资源的try语句相当于包含了隐式的finally块,用于关闭资源,所以这个try语句可以既没有catch块,也没有finally块。 } }
8、java7增强的throw语句
对于如下代码:
try{ new FileOutputStream("a.txt"); } catch(Exception ex){ ex.printStackTrace(); throw ex; }
上面代码片段中“throw ex”再次抛出了捕获到的异常,但这个ex 对象的情况比较特殊:程序捕获该异常时,声明该异常的类型为Exception,但实际上try块中可能只调用了FileOutputStream 构造器,这个构造器声明只是抛出了FileNotFoundException异常。
在java7以前,java编译器的处理“简单而粗暴“——由于在捕获该异常的时候声明ex的类型是Exception,因此java编译器认为这段代码可能抛出Exception异常,所以包含这段代码的方法通常要声明抛出Exception异常,例如以下方法:
import java.io.FileOutputStream; public class ThrowTest2 { public static void main(String[] args) //java6认为 “throw ex”代码可能抛出Exception异常。所以此处声明抛出Exception异常 throws Exception { try { new FileOutputStream("a.txt"); } catch (Exception ex) { ex.printStackTrace(); throw ex; } } }
从java7开始,java编译器会进行更细致的检查,java编译器会检查throw语句抛出异常的实际类型,这样编译器就可以知道”throw ex“语句实际上只可能抛出FileNotFoundException异常,因此在方法签名中只要声明抛出该异常即可。既可以将代码改成如下形式:
public class ThrowTest2 { public static void main(String[] args) throws FileNotFoundException { try { new FileOutputStream("a.txt"); } catch (Exception ex) { ex.printStackTrace(); throw ex; } } }
9、java7为JColorChooser增加了一个HSV标签页,允许用户通过HSV模式来选择颜色。
10、java7 为Statement新增了closeOnCompletion()方法,如果Statement执行了该方法,则当所有依赖于该Statement的ResultSet关闭时,该Statement会自动关闭。java7还为Statement提供了一个isCloseOnCompletion()方法,该方法用于判断该Statement是否打开了"closeOnCompletion".
11、java7为Connection新增了setSchema(String schema)、getSchema()两个方法,这两个方法用于控制该Connection访问的数据库Schema。java7还为Connection新增了setNetWorkTimeout(Executor executor , int milliseconds)、getNetWorkTimeout() 两个方法来控制数据库连接的超时行为。
12、 在Java 6.0 时代,RowSet并未得到广泛应用。Java 7 新增了RowSetProvider 类和RowSetFactory 接口。其中RowSetProvider 负责创建RowSetFactory ,而RowSetFactory 则提供了一些方法来创建RowSet实例。具体见api文档。