1、二进制字面量
JDK7开始,可以用二进制来表示整数(byte,short,int和long),使用二进制字面量的好处是,可以使代码更容易被理解。
语法非常简单,只要在二进制数值前面加 0b或者0B,举例:
//一个8位'byte'值:
byte aByte = (byte)0b00100001;
//一个16位'short'值:
short aShort = (short)0b1010000101000101;
//一些32位'int'值:
int anInt1 = 0b10100001010001011010000101000101;
int anInt2 = 0b101;
int anInt3 = 0B101; // B可以是大写也可以是小写.
//一个64位的'long'值. 注意"L"结尾:
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;
2、在数字字面量使用下划线
为了增强对数值的阅读性,如我们经常把数据用逗号分隔一样。JDK7提供了_对数据分隔,举例:
int x = 100_1000;
/*
注意事项:
不能出现在进制标识和数值之间
不能出现在数值开头和结尾
不能出现在小数点旁边
*/
int a = 0b100_100;
int b = 0b_100_100;
int c = 0b100_100_;
float d = 12.34_56f;
float e = 12._34_56f;
3、switch可以使用string了
public String switchDemo(String uName) {
String personDesc;
switch (uName) {
case "taven_li":
personDesc = "远哥,十年码农";
break;
case "lilei":
case "lily":
case "rose":
personDesc = "菜鸟";
break;
default:
personDesc = "侠客";
}
return personDesc;
}
4、实例创建的类型推断
由于编译器能够从上下文推断出参数类型,所以你可以用一组空类型参数(<>)替换泛型类构造函数的调用所需的类型参数。这对角括号通俗地称为菱形,举例:
Map> tavenMap = new HashMap>();
//可以改为如下形式:
Map> tavenMap = new HashMap<>();
List tavenlist = new ArrayList();
//可以改为如下形式:
List tavenlist = new ArrayList<>();
5、使用Varargs方法使用不可维护的形式参数时改进了编译器警告和错误
List list = new ArrayList();
List ls = list; // unchecked warning
list.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0); // ClassCastException is thrown
6、try-with-resources 资源的自动管理
try-with-resources声明保证每一个资源都会被关闭在声明结束的时候。任何实现了java.lang.AutoCloseable接口或者实现了java.io.Closeable,可以作为一个资源。
下面的例子从文件中读取第一行。用到了BufferedReader得实例去从文件中读取数据。BufferedReader是一个资源,在程序完成之后必须关闭。
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块排除的异常将会被抑制。相反,在例子readFirstLineFromFile中,如果try块和try-with-resources声明都抛出异常,方法readFirstLineFromFile则抛出由try块抛出的异常,由try-with-resources抛出的异常将会被抑制。
以下示例将检索打包在zip文件zipFileName中的文件的名称,并创建一个包含这些文件名称的文本文件:
void writeToFileZipFileContents(String zipFileName, String outputFileName)
throws java.io.IOException {
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("US-ASCII");
java.nio.file.Path outputFilePath = java.nio.file.Paths.get(outputFileName);
// Open zip file and create output file with try-with-resources statement
try (
java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
// Enumerate each entry
for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {
// Get the entry name and write it to the output file
String newLine = System.getProperty("line.separator");
String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}
}
以下示例使用try-with-resources语句自动关闭java.sql.Statement对象:
void viewTable(Connection con) throws SQLException {
String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
try (Statement stmt = con.createStatement()) {
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + ", " + supplierID + ", " + price +
", " + sales + ", " + total);
}
} catch (SQLException e) {
JDBCTutorialUtilities.printSQLException(e);
}
}
注意:try-with-resources的语句可以像普通的try语句一样拥有catch和finally。在try-with-resources语句中,在声明的资源已关闭后,将运行任何catch或finally块。
被抑制的异常
可以从与try-with-resources语句关联的代码块中抛出异常。在该示例中writeToFileZipFileContents,可以从该try块中引发异常,并且try在尝试关闭ZipFile和BufferedWriter对象时最多可以从-with-resources语句中引发两个异常。如果从try块中抛出一个异常,并且从try-with-resources语句抛出了一个或多个异常,那么从try-with-resources语句抛出的这些异常将被抑制,并且该块抛出的异常将被抛出通过该writeToFileZipFileContents方法。您可以通过Throwable.getSuppressed从该try块抛出的异常中调用方法来检索这些抑制的异常。
实现了AutoCloseable或者Closeable接口的类
Closeable接口继承了AutoCloseable接口,当AutoCloseable接口的close方法抛出异常类型为Exception的异常时,Closeable的close方法抛出异常类型为IOException的异常。因此,接口AutoCloseable接口的实现类可以重写由close方法来抛出指定的异常,比如IOException或者完全不抛出异常。
7、捕捉多个异常类型和对重新抛出异常的高级类型检查
catch (IOException ex) {
logger.log(ex);
throw ex;
catch (SQLException ex) {
logger.log(ex);
throw ex;
}
//可以改为如下形式:
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
远哥,作为一个10多年的老程序员,觉得巩固一个知识,最好的方法就是学过之后,对他进行总结和整理,是非常有意义的,也希望对大家有用。