2009 年 4 月 20 日,Java 的亲生父亲 Sun 被养父 Oracle 以 74 亿美元收购,这在当时可是一件天大的事。有不少同学都担心 Java 的前途,我当时傻不啦叽地也很担心:自己刚学会如何通过记事本编写 Java 代码,然后通过 cmd 打印 Hello World 呢,这一下难道白学了?

但其实这种担心是多余的,因为 Java 并不会陪葬,毕竟行业内有太多基于 Java 的软件系统在运行,Java 牵扯了太多人的饭碗。10 年过去了,Java 果然没有陪葬,我仍然坚守在 Java 的阵线上。

2011 年 7 月 7 日,代号「海豚(Dolphin)」的 Java 7 首次推出,这也是 Java 历史上一次非常重要的版本更新。同时推出了非常多实用的新特性,比如说创建泛型实例时自动类型推断、switch-case 语句支持字符串类型、新增 try-with-resources 语句等等。

这么多年过去了,Java 7 的“新”特性显然都变成老古董了——它们似乎也不需要我再赘述了,但好像不是这样的。前几天我发了一篇文章,用到了其中一个新特性,竟然有同学表示从来没见过这个新特性,特意在交流群里@我,要我说清楚怎么回事(代码折叠了,随后贴出来)。

当时我就在想啊,原来技术从来没有“新与旧”之说,只有知不知道。所以借此机会,我就再来“赘述”一下 Java 7 的那些最经常使用的新特性吧。

01、数值中可使用下划线分隔符联接

之前图片中的代码没有展示全,现在我把具体的代码贴出来。

try {AsynchronousFileChannel channel = AsynchronousFileChannel.open(file);Future<Integer> result = channel.read(ByteBuffer.allocate(100_000), 0);
} catch (IOException e) {e.printStackTrace();
}

其中 100_000 就是读者要我解释清楚的那个特性:在数值类型的字面值中使用下划线分隔符联接。

人脑不总是很善于记住很长串的数字,所以在处理长串数字时会采用分割法,比如说电话号码要用一个分隔符“-”隔开,银行卡号会每隔四位有一个空格等等。

数字中没有用逗号(,)和中划线(-)作为分隔符,是因为它们可能会引发歧义,取而代之的是下划线(_)。这个不起眼的特性,让我们开发人员在处理数字上轻松多了,毕竟 100_000100000 (忍不住查了一遍 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);

02、 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("王二他妹妹王六");

03、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();}}

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

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

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

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

05、最后

除了上面我列出的这 4 个常用的新特性,Java 7 还有一些其他的特性,比如说 multi-catch,可以在一个 catch 语句中捕获多个异常;比如说对集合(Collections)的增强支持,可以直接采用 []、{} 的形式存入对象,采用 [] 的形式按照索引、键值来获取集合中的对象等等。

但总体上,我列出的那 4 个特性最为常用,其学习的意义更大。如果你觉得漏掉了某些更为常用的特性,欢迎你在文末提出来。

欢迎关注「沉默王二」公众号,后台回复关键字「java」即可免费获取「Java 程序员进阶必读资料」。

温故而知新,重温 Java 7 的那些“新”特性相关推荐

  1. Java 11 正式发布,新特性解读

    Java 11 正式发布,新特性解读 杨晓峰   2018 年 9 月 26 日 话题:Java语言 & 开发 不知不觉 JDK 11 已经发布了,从 9 开始,JDK 进入了让人学不动的更新 ...

  2. java的发展(8-17新特性整理)

    java java的诞生与历史: 简介:Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. ...

  3. Java基础之Java8 新特性

    hp实训8.19_Java基础之Java8新特性 // 信息展示方法 ,接口中,就可以提供一种实现. 就可以使用这种功能.default void print() {System.out.printl ...

  4. 不停歇的Java即将发布JDK16新特性速览及从菜鸟到架构师[图]

    一.不停歇的Java即将发布JDK16新特性速览 当开发者深陷Java8版本之际,这边下一版本Java16有了最新的消息,与Java15一样,作为短期版本,Oracle仅提供6个月的支持. 根据发布计 ...

  5. 【JAVA拾遗】Java8新特性合辑

    [JAVA拾遗]Java8新特性合辑 文章目录 [JAVA拾遗]Java8新特性合辑 0. 逼逼 [--/--]126 Lambda Expressions & Virtual Extensi ...

  6. 详解 Java 17中的新特性:“密封类”

    作者:程序猿DD 博客:https://blog.didispace.com/ Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360.JD ...

  7. Java 17 版本的新特性

    Java 17 版本的新特性

  8. 详解Java 8十大新特性

    前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java ...

  9. Java系列 – 用Java8新特性进行Java开发太爽了(续)

    本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome-2/ 前言 上周, 我们谈论了关于Ja ...

最新文章

  1. 简评游戏人工智能相关的中文书(下)
  2. Android 测量调用方法耗时的方法
  3. C++高精度运算类bign (重载操作符)
  4. Python编程4道练习题
  5. gitl更新最近代码_常见的蓝屏代码以及解决方法
  6. Nats的消息通信模型
  7. linux下/var/run目录下.pid文件的作用(文件锁,防止重复启动)
  8. oracle数据库建表、修改字段名称类型、增加字段、ID自动增长写法
  9. 多普达D700手机利用USB电缆与电脑连接上网方法
  10. ospf 几种LSA类型的总结
  11. Dlubal RFEM(有限元分析软件)官方中文版V5.25.01 | 结构设计软件下载 | 有限元分析软件有哪些
  12. PicSizer-将图片压缩到指定大小(KB)的软件
  13. linux 脚本设置定时,脚本添加定时任务(Linux)
  14. 如何快速算出一个数有多少个因子(c++)
  15. 零零信安-DD数据泄露报警日报【第43期】
  16. Android系统下 SD卡各文件夹
  17. 独立成分分析ICA系列2:概念、应用和估计原理.
  18. 【系统性学习】Linux Shell常用命令
  19. 天梯赛/PAT甲级常考知识点整理
  20. 【转】实战USB接口手机充电 看3.0/2.0谁更快

热门文章

  1. tcmalloc jemalloc glibc内存分配管理模块性能测试对比
  2. R语言rmarkdown knit导出的时候显示Error in eval找不到对象
  3. 综合课程设计作业——LOL英雄数据分析统计(个人)
  4. webbench 下载_webbench压力测试
  5. 飞奔的B站:正在崛起的投资巨头
  6. 2的5次方用计算机怎么算,2的5次方(2的5次方怎么算)
  7. MATLAB---构造Bezier曲线
  8. Linux记录操作日志
  9. android 原地弹跳动画,有趣的CSS弹跳动画
  10. 涂寐‘s Blogs 文章更新——220613