1. 可以用二进制表达数字

可以用二进制表达数字(加前缀0b/0B),包括:byte, short, int, long

    // 可以用二进制表达数字(加前缀0b/0B),包括:byte, short, int, long
@Test
public void testLiterals() {
// An 8-bit 'byte' value:
byte aByte = (byte)0b00100001; // A 16-bit 'short' value:
short aShort = (short)0b1010000101000101; // Some 32-bit 'int' values:
int anInt1 = 0b10100001010001011010000101000101;
int anInt2 = 0b101;
int anInt3 = 0B101; // The B can be upper or lower case. // A 64-bit 'long' value. Note the "L" suffix:
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L; // 来个简单版本的
byte b = 0b10;
short s = 0B100;
int i = 0b1000;
long l = 0B10000; System.out.println(b + "|" + s + "|" + i + "|" + l);
// ->输出将会是2|4|8|16
}

2. 可以对数字加下划线

可以对数字加下划线以让变量表达得更清楚些;注意:符号“.”左右不可以用下划线、还包括“L/F/0x"等等。

    // 可以对数字加下划线以让变量表达得更清楚些
// 注意:符号“.”左右不可以用下划线、还包括“L/F/0x"等等。
@Test
public void testUnderscores() {
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010; System.out.println(creditCardNumber + "|" + socialSecurityNumber);
// ->下划线仅供代码中直观查看,输出时自动去掉了;输出将会是:1234567890123456|999999999
}

3. switch中可以使用字符串了

    // switch中可以使用字符串了
public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
String typeOfDay;
switch (dayOfWeekArg) {
case "Monday":
typeOfDay = "Start of work week";
break;
case "Tuesday":
case "Wednesday":
case "Thursday":
typeOfDay = "Midweek";
break;
case "Friday":
typeOfDay = "End of work week";
break;
case "Saturday":
case "Sunday":
typeOfDay = "Weekend";
break;
default:
throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
}
return typeOfDay;
}

4. 泛型实例化类型自动推断

    // 泛型实例化类型自动推断
@Test
public void testGeneric() {
// 旧版本
Map<String, List<String>> myMap1 = new HashMap<String, List<String>>(); // 新版本
Map<String, List<String>> myMap2 = new HashMap<>(); List<String> list = new ArrayList<>();
list.add("A"); // 下面这条语句编译不过;如果改成:new ArrayList<String>()则可以。
// list.addAll(new ArrayList<>());
}

5. “非安全操作”的警告

当使用一个不可具体化的参数(Non-Reifiable Formal Parameters)调用一个可变参数方法(Varargs Methods )编辑器会生成一个“非安全操作”的警告。

package com.clzhang.sample.thinking;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import org.junit.Test; /**
* 当使用一个不可具体化的参数(Non-Reifiable Formal Parameters)调用一个可变参数方法(Varargs Methods )
* 编辑器会生成一个“非安全操作”的警告。
* @author acer
*
*/
public class ArrayBuilder {
//Type safety: Potential heap pollution via varargs parameter elements
public static <T> void addToList(List<T> listArg, T... elements) {
for (T x : elements) {
listArg.add(x);
}
} //Type safety: Potential heap pollution via varargs parameter l
@SafeVarargs
public static void faultyMethod(List<String>... l) {
Object[] objectArray = l; // Valid // 这一行代码把列表中的数据类型给改变了!
objectArray[0] = Arrays.asList(new Integer(42)); // 下面再取值,会报错;因为里面已经不再是String类型的数据,而是Integer类型的数据。
String s = l[0].get(0); // ClassCastException thrown here // 如果注释掉本方法中的第2行代码,则此条语句可以执行;否则,执行不到这里。
System.out.println("first param is:" + s);
} @Test
public void testHeapPollution() {
List<String> stringListA = new ArrayList<String>();
List<String> stringListB = new ArrayList<String>(); ArrayBuilder.addToList(stringListA, "Seven", "Eight", "Nine");
ArrayBuilder.addToList(stringListA, "Ten", "Eleven", "Twelve");
List<List<String>> listOfStringLists = new ArrayList<List<String>>();
ArrayBuilder.addToList(listOfStringLists, stringListA, stringListB); ArrayBuilder.faultyMethod(Arrays.asList("Hello!"), Arrays.asList("World!"));
}
}

6. 对资源的自动回收管理

    // JDK1.7之前的做法,需要在finally块中关闭相关资源
String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null)
br.close();
}
} // JDK1.7中已经不需要手工关闭这些资源了,JRE自动关闭这些资源。
// 一个对象实现了java.lang.AutoCloseable接口,或者是包含的所有对象实现了java.io.Closeable接口,即可以作为一个资源来使用。
String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
} @Test
public void testAutoClose() throws Exception {
String path = "D:\\TDDOWNLOAD\\readme.txt"; System.out.println(readFirstLineFromFileWithFinallyBlock(path));
System.out.println(readFirstLineFromFile(path));
}

7. 多个异常的合并与重抛异常的检查

7.1 捕捉多个异常

看下面这段代码:

catch (IOException ex) {
logger.log(ex);
throw ex;
catch (SQLException ex) {
logger.log(ex);
throw ex;
}

在JDK1.7中,上述代码可以改写为:

catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}

7.2 重抛异常

看下面这段代码:

  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;
}
}

在之前 JDK版本中,它不可以:throws FirstException, SecondException。而在JDK1.7中,它可以了,如下:

  public void rethrowException(String exceptionName)
throws FirstException, SecondException {
try {
// ...
}
catch (Exception e) {
throw e;
}
}

注意:try/catch中throw的是Exception,但在函数头中,却是:throws FirstException, SecondException。这在之前的版本中编译是通不过的。

JDK1.7新特性,语言篇的更多相关文章

  1. 有点干货 | Jdk1.8新特性实战篇(41个案例)

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获!

  2. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  3. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  4. JDK1.7新特性

    jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...

  5. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  6. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  7. JDK1.8新特性之(一)--Lambda表达式

    近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...

  8. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  9. C# 9 新特性 —— 补充篇

    C# 9 新特性 -- 补充篇 Intro 前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充. Top-Level Statements 在以往的代码里 ...

  10. jdk1.5新特性之-----自动装箱与自动拆箱

    import java.util.ArrayList; /* jdk1.5新特性之-----自动装箱与自动拆箱. java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述j ...

随机推荐

  1. Java中经常使用缓存Cache机制的实现

    缓存,就是将程序或系统常常要调用的对象存在内存中,一遍其使用时能够高速调用,不必再去创建新的反复的实例. 这样做能够降低系统开销.提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件 ...

  2. 有限状态机(FSM)的Java 学习FSM

    本文从简单的例子入手,逐步演变成非常复杂的程序. 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说,多种状态是分割的.无关的.状态模式最有趣的地方正是讨论其状态的变迁. 1.引子 空调( ...

  3. 微信扫码支付springboot版本

    发布时间:2018-11-06   技术:springboot+freemarker   概述 该项目是一个采用springboot构建的web项目,主要实现了微信扫码支付功能.包含最基本的创建订单, ...

  4. Indy Changed from Indy10

    Indy Changed from Indy10 http://stackoverflow.com/questions/16339656/delphi-xe4-indy-compatibility-i ...

  5. maven 下载 源码和javadoc命令(转)

    转自:http://blog.csdn.net/topwqp/article/details/8902863 maven 下载 源码和javadoc命令 目录(?)[+] Maven命令下载源码和ja ...

  6. libev4.15学习

    libev作为优秀的高性能IO框架,非常值得学习! 虽然我是菜鸟,但也必须学习啦,从今天一点一点地学习,慢慢进步! # include "ev.h" struct event_ba ...

  7. DHCP工作过程的六个主要步骤

    对于学习DHCP来说,很重要的一部分就是对于DHCP工作过程的理解. DHCP分为两个部分:一个是服务器端,另一个是客户端. 所有客户机的IP地址设定资料都由DHCP服务器集中管理,并负责处理客户端的 ...

  8. Centos7-Lvs+Keepalived架构

      Centos7-Lvs+Keepalived架构 LVS+Keepalived 介绍 1 .   LVS LVS 是一个开源的软件,可以实现 LINUX 平台下的简单负载均衡. LVS 是 Lin ...

  9. [转]MySQL DBA面试全揭秘

      本文起源于有同学留言回复说想了解下MySQL DBA面试时可能涉及到的知识要点,那我们今天就来大概谈谈吧. MySQL DBA职位最近几年特别热门,不少朋友让我帮忙推荐什么的,也有很多公司找不到合 ...

  10. 蓝牙进阶之路 (001) - HC-05蓝牙无线模块设置

    USB转串口的有线转接方式,实在太难看了,尤其是寻接头,那是相当的不方便.其它电器厂商都想把是接头做小,做精致,唯独串口接头还是那么庞大,感觉应该换一换了,都已经完全不符合这个时代的审美观了. 于是, ...