【Java利器】JDK5-9新特性解析+代码 - JDK7

本文主要介绍JDK7的新特性。


目录

  • 1.语法上支持集合,而不一定是数组[错误,谣传]
  • 2.switch中可以使用字串了
  • 3.泛型实例化类型自动推断
  • 4.新增一些取环境信息的工具方法
  • 5.Boolean类型反转,空指针安全,参与位运算
  • 6.两个char间的equals
  • 7.安全的加减乘除
  • 8.二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。
  • 9.Try-with-resource语句
  • 10.使用一个catch语言来处理多种异常类型

1.语法上支持集合,而不一定是数组[错误,谣传]

在网上的栗子中,下面这段代码一般用来表示JDK7新特性语法上支持集合,然而经过验证,这是一个错误的描述,JDK7并没有这个特性;作者用JDK8来测试都报语法错误,请大家注意不要上当!!!


final List<Integer> piDigits = [ 1,2,3,4,5,8 ];   

下面是验证代码:
错误验证图片

2.switch中可以使用字串了

String s = "test";
switch (s) {
  case "test":
      System.out.println("test");
  case "test1":
      System.out.println("test1");
      break;
  default:
      // 阿里巴巴开发规范中,默认都需要加default
      System.out.println("default");
      break;
}

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

在前两章讲到的JDK5中支持了泛型类型,我们需要在声明并赋值的时候,两侧都加上泛型类型。例如:


Map<String, String> map = new HashMap<String, String>();

在JDK7中,这种方式得以改进,现在你可以使用如下语句进行声明并赋值:


// 后面的"<>"可以不声明类型,PS:正常使用时尽量在new HashMap<>()括弧中声明初始大小
Map<String, String> map = new HashMap<>();

4.新增一些取环境信息的工具方法

JDK7的工具方法如下:


// IO临时文件夹
File System.getJavaIoTempDir(); 

// JRE的安装目录
File System.getJavaHomeDir();

// 当前用户目录
File System.getUserHomeDir();

// 启动Java进程时所在的目录
File System.getUserDir();

PS:上面的几个方法在JDK8及以上版本都已经被作废,现在JDK8的新方法如下:


// 属性类
Properties properties = System.getProperties();

// IO临时文件夹
System.out.println(properties.getProperty("java.io.tmpdir"));

// JRE的安装目录
System.out.println(properties.getProperty("java.home"));

// 当前用户目录
System.out.println(properties.getProperty("user.home"));

// 启动Java进程时所在的目录
System.out.println(properties.getProperty("user.dir"));

如果想看到 Properties 中有多少的可显示属性,可使用以下代码来查询:


// 打印出所有的属性
System.out.println(System.getProperties().toString());

5.Boolean类型反转,空指针安全,参与位运算


Boolean Booleans.negate(Boolean booleanObj)

True => False , False => True, Null => Null

boolean Booleans.and(boolean[] array)

boolean Booleans.or(boolean[] array)

boolean Booleans.xor(boolean[] array)

boolean Booleans.and(Boolean[] array)

boolean Booleans.or(Boolean[] array)

boolean Booleans.xor(Boolean[] array)

6.两个char间的equals

下面是JDK7中的比较方法:


boolean Character.equalsIgnoreCase(char ch1, char ch2)

在JDK8及以上,此方法已作废,JDK8常用的比较方法有两种,代码如下:


char a = '5';
char b = '3';
// 第一种,使用 < > = != 运算符来判定,结果是:true 或者 false
System.out.println(a > b);
// 第二种,底层使用 a - b 的形式来实现,结果是:等于返回0,大于返回0以上,小于返回0以下
System.out.println(Character.compare(a, b));

7.安全的加减乘除


int Math.safeToInt(long value)

int Math.safeNegate(int value)

long Math.safeSubtract(long value1, int value2)

long Math.safeSubtract(long value1, long value2)

int Math.safeMultiply(int value1, int value2)

long Math.safeMultiply(long value1, int value2)

long Math.safeMultiply(long value1, long value2)

long Math.safeNegate(long value)

int Math.safeAdd(int value1, int value2)

long Math.safeAdd(long value1, int value2)

long Math.safeAdd(long value1, long value2)

int Math.safeSubtract(int value1, int value2)

8.二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。


// 所有整数 int, short,long,byte都可以用二进制表示
// 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;

// 二进制在数组等的使用
final int[] phases = { 0b00110001, 0b01100010, 0b11000100, 0b10001001,
      0b00010011, 0b00100110, 0b01001100, 0b10011000 };

9.Try-with-resource语句

这个所谓的try-with-resources,是个语法糖。实际上就是自动调用资源的close()函数。和Python里的with语句差不多。
例如:


static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

可以看到try语句多了个括号,而在括号里初始化了一个BufferedReader。
这种在try后面加个括号,再初始化对象的语法就叫try-with-resources。
实际上,相当于下面的代码(其实略有不同,下面会说明):


static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }
}

很容易可以猜想到,这是编绎器自动在try-with-resources后面增加了判断对象是否为null,如果不为null,则调用close()函数的的字节码。
只有实现了java.lang.AutoCloseable接口,或者java.io.Closable(实际上继随自java.lang.AutoCloseable)接口的对象,才会自动调用其close()函数。
有点不同的是java.io.Closable要求一实现者保证close函数可以被重复调用。而AutoCloseable的close()函数则不要求是幂等的。

10.使用一个catch语言来处理多种异常类型


public static void main (String[] args) throws Exception {
    try {
        testthrows();
        // 具体点在下面这个 | 符号,或者
    } catch (IOException | SQLException ex) {
        throw ex;
    }
}
public static void testthrows ()throws IOException, SQLException {

}

下一篇应该是讲JDK8的新特性了,这篇文章中有网络谣传的错误信息,已标出,所以请大家在阅读网络文章之后,也不要尽信,最好是自己手动试一试代码,查查文档,一切都出来了。

看都看了,关注一下呗!!!

扫描下面二维码,关注我的公众号哦!!!


关注我的公众号


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值