Java 7 的那些“新”特性

  • 数值中可使用下划线分隔符联接
    复制代码其中 100_000 就是读者要我解释清楚的那个特性:在数值类型的字面值中使用下划线分隔符联接。
    人脑不总是很善于记住很长串的数字,所以在处理长串数字时会采用分割法,比如说电话号码要用一个分隔符“-”隔开,银行卡号会每隔四位有一个空格等等。
    数字中没有用逗号(,)和中划线(-)作为分隔符,是因为它们可能会引发歧义,取而代之的是下划线()。这个不起眼的特性,让我们开发人员在处理数字上轻松多了,毕竟 100_000 比 100000 (忍不住查了一遍 0 的个数,害怕多写或者少写)辨识度高得多。
    下划线(
    )位置并不固定,你可以随意摆放,举例如下:
int a = 100_000, b = 100000, c = 10_0000;
System.out.println(a==b); // true
System.out.println(b==c); // true
System.out.println(a==c); // true

复制代码需要注意的是,下划线仅仅能在数字中间,编译器在编译的时候自己主动删除数字中的下划线。反编译后的代码如下所示:

int a = 100000;
int b = 100000;
int c = 100000;
System.out.println(a == b);
System.out.println(b == c);
System.out.println(a == c);

**

  • switch-case 语句支持字符串类型

**
我们都知道,switch 是一种高效的判断语句,比起 if/else 真的是爽快多了。示例如下:

String wanger = "王二";

switch (wanger) {
case "王二":
	System.out.println("王三他哥哥王二");
	break;
case "王三":
	System.out.println("王二他弟弟王三");
	break;

default:
	System.out.println("王二他妹妹王六");
	break;
}

复制代码switch-case 语句在处理字符串的时候,会先将 switch 括号中的字符串和 case 后的字符串转成 hashCode,所以字符串不能为 null,否则会抛出 NullPointerException。反编译后的代码如下所示:

String wanger = "王二";
switch (wanger.hashCode()) {
	case 936926 :
		if (wanger.equals("王三")) {
			System.out.println("王二他弟弟王三");
			return;
		}
		break;
	case 937057 :
		if (wanger.equals("王二")) {
			System.out.println("王三他哥哥王二");
			return;
		}
}

System.out.println("王二他妹妹王六");
  • try-with-resources 语句

try-with-resources 的基本设想是把资源(socket、文件、数据库连接)的作用域限定在代码块内,当这块代码执行完后,资源会被自动释放。
在此之前,资源的释放需要在 finally 中主动关闭,不管 try 中的代码是否正常退出或者异常退出。就像下面这样:

BufferedReader in = null;
try {
	in = new BufferedReader(new FileReader("cmower.txt"));
	int charRead;
	while ((charRead = in.read()) != -1) {
		System.out.printf("%c ", (char) charRead);
	}
} catch (IOException ex) {
	ex.printStackTrace();
} finally {
	try {
		if (in != null)
			in.close();
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

有了 try-with-resources 之后,情况大有改观

try (BufferedReader in = new BufferedReader(new FileReader("cmower.txt"));) {
	int charRead;
	while ((charRead = in.read()) != -1) {
		System.out.printf("%c ", (char) charRead);
	}
} catch (IOException ex) {
	ex.printStackTrace();
}

复制代码是不是清爽多了!把需要释放的资源放在 try 后的 () 中,连 finally 也不需要了。不过,需要注意的是,上面的代码还需要优化,应该为每一个资源声明独立的变量,否则的话,某些特殊的情况下,资源可能无法正常关闭。

try (FileReader fr = new FileReader("cmower.txt"); 
	BufferedReader in = new BufferedReader(fr);) {
	int charRead;
	while ((charRead = in.read()) != -1) {
		System.out.printf("%c ", (char) charRead);
	}
} catch (IOException ex) {
	ex.printStackTrace();
}

复制代码try-with-resources 特性依赖于一个新定义的接口 AutoCloseable,需要释放的资源必须要实现这个接口。

不过,try-with-resources 在本质上仍然使用了 finally 去释放资源,只不过这部分工作不再由开发者主动去做——从反编译后的结果可以看得出来:

try {
	Throwable var1 = null;
	Object var2 = null;

	try {
		FileReader fr = new FileReader("cmower.txt");

		try {
			BufferedReader in = new BufferedReader(fr);

			int charRead;
			try {
				while ((charRead = in.read()) != -1) {
					System.out.printf("%c ", (char) charRead);
				}
			} finally {
				if (in != null) {
					in.close();
				}

			}

**

  • 创建泛型实例时自动类型推断

**
在这个特性出现之前,有关泛型变量的声明略显重复,示例如下:

Map<String, ArrayList<String>> wanger = new HashMap<String, ArrayList<String>>();

复制代码这样的代码简直太长了,很多重复的字符,难道编译器不能推断出泛型的类型信息吗?Java 7 实现了这个心愿。

Map<String, List<String>> wanger = new HashMap<>();
List<String> chenmo = new ArrayList<>();
wanger.put("chenmo", chenmo);

复制代码这个看似简单的特性省去了不少敲击键盘的次数。

作者:沉默王二
链接:https://juejin.im/post/5d3e50d351882504b712224f
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值