Java9新特性

简介: Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍 Java 9 的新特性。

Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍 Java 9 的新特性。

1.目录结构 
2.repl工具 jShell命令 
3.模块化 
4.多版本兼容jar包 
5.接口方法的改进(在接口中 jdk7 只能声明全名常量和抽象方法 jdk8 添加了静态方法和默认方法 jdk9添加了私有方法)
6.钻石操作符升级 可以有{} 
7.异常处理try升级 
8.下划线标识符命名的限制 _ 不允许了 
9.String底层存储结构的变更(char数组变成byte字节数组) 
10.增强了Stream API(在java8基础上,新增加4个方法) 
11.jdk9 中引入httpClient api 代替原有的HttpURLConnection
复制代码


1、Java9 新特性之---目录结构


包含jdk8及以前的jdk版本,所有目录结构以及目录含义如图:

网络异常,图片无法展示
|

网络异常,图片无法展示
|

jdk9之后,目录结构发生变化如图:
![image](http://upload-images.jianshu.io/upload_images/5018582-dabf0e10676e7496?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

这个新特性只要了解下就可以了,这个目录结构是方便为了接下来新特性做保证


2、Java9新特性之---JShell工具


怎么理解,怎么用呢?这个只是针对于java9来说,相当于cmd工具,你可以和cmd一样,直接写方法等等,不过我认为只是适用于初学者做一些最简单的运算和写一些方法:

在cmd中打开这个工具:

![image](http://upload-images.jianshu.io/upload_images/5018582-21062b260553b2b4?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

进入工具后可以做一些简单的java操作

![image](http://upload-images.jianshu.io/upload_images/5018582-320e4950d7e424a6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

等等,我认为只适用于初学者学习java不用其他编辑工具就可以学习java


3、Java9新特性之---模块化


一个大型的项目,比如淘宝商城等,都会包含多个模块,比如订单模块,前台模块,后台管理模块,广告位模块,会员模块.....等等,各个模块之间会相互调用,不过这种情况下会很少,只针对特殊情况,如果一个项目有30个模块系统进行开发,但是只要某个单独模块运行时,都会带动所有的模块,这样对于jvm来说在内存和性能上会很低,所以,java9提供了这一个特性,某一个模块运行的时候,jvm只会启动和它有依赖的模块,并不会加载所有的模块到内存中,这样性能大大的提高了。写法上如下:

![image](http://upload-images.jianshu.io/upload_images/5018582-5fd1790320b4fa3d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

一个项目中的两个模块,模块之间通过module-info.java来关联,在IDEA编辑器右键创建package-info.java

![image](http://upload-images.jianshu.io/upload_images/5018582-effe0e17d530c372?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

在这个两个模块java9Demo和java9Test中,java9demo编写一个实体类Person,在java9Test调用这样一个过程

这个是java9Demo 将 java9Test 模块需要的文件导出 exports 把它所在的包导出

网络异常,图片无法展示
|

然后在java9Test模块中创建一个package-info.java,引入java9Demo模块导出包名

网络异常,图片无法展示
|

这样就可以直接在java9Test中引入Person实体类了,这只是一个简单的例子。exports 控制着那些包可以被模块访问,所以不被导出的包不能被其他模块访问


4、Java9新特性之---多版本兼容Jar包


怎么理解呢?

好多公司用的jdk大部分还是老版本,jdk6,7 都有,他们都不敢升级主要是因为兼容的问题,但是java9做到了这一点,就是不管公司的项目是用的java6,7,8甚至5,他都可以兼容不出错,打个比方,你之前用的是iphone5,现在出现了iPhone6,iphone7,iphon8和iphone9,但是你不敢买9,因为你自己已经适应了iphone5的所有手机的运行流程,6,7,8每个手机的运行流程不一样,但是这个9很强大,它能够识别你现在所用的版本iphone是5,所以当你升级到iphone9的时候,你的这个手机运行流程还是iphone5的流程,只是在原有基础上拥有了更多的iphone9的所有优势。


5、Java9新特性之---接口Interface的升级


网络异常,图片无法展示
|


6、Java9新特性之---钻石操作符的升级


网络异常,图片无法展示
|


7、Java9新特性之---异常处理try升级


首先看下jdk6,7,8,9 的try catch的比较

Java6处理方式:

网络异常,图片无法展示
|

java7,8 共同的处理方式:

网络异常,图片无法展示
|

java9的处理方式:

网络异常,图片无法展示
|

这下子应该一幕了然了吧


8、Java9新特性之---特殊标识符增加限制


java8 之前 String _ ="hello"; 这样的标识符可以用,java9就用不到。


9、Java9新特性之---String底层存储结构更换


java8之前 String的底层结构类型都是 char[] ,但是java9 就替换成 byte[] 这样来讲,更节省了空间和提高了性能

**

![image](http://upload-images.jianshu.io/upload_images/5018582-5b88232c7d08d4e2?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![image](http://upload-images.jianshu.io/upload_images/5018582-0a549e682a4799e3?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

之所以替换是因为 之前一直是最小单位是一个char,用到两个byte,但是java8是基于latin1的,而这个latin1编码可以用一个byte标识,所以当你数据明明可以用到一个byte的时候,我们用到了一个最小单位chat两个byte,就多出了一个byte的空间。所以java9在这一方面进行了更新,现在的java9 是基于ISO/latin1/Utf-16 ,latin1和ISO用一个byte标识,UTF-16用两个byte标识,java9会自动识别用哪个编码,当数据用到1byte,就会使用iSO或者latin1 ,当空间数据满足2byte的时候,自动使用utf-16,节省了很多空间

![image](http://upload-images.jianshu.io/upload_images/5018582-590576b4b4b2e88e?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

同理,StringBuilder StringBuffer也更换了底层数据结构


10、Java9新特性之---Stream API 新方法的添加


在原有Stream API 新添加了4个方法,takeWhile dropWhile ofNullable iterate(新重载方法)

首先解释 takeWhile 当达到一定条件就结束:输出结果为45 43,如图

![image](http://upload-images.jianshu.io/upload_images/5018582-8153a10bd2a1ad0f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码

而 dropWhile 则和takeWhile 相反

ofNullable, 在java8中 Stream中的元素不能完全为null,否则空指针异常,而在java9的升级中,允许创建null

iterate 不加条件无线循环

![image](http://upload-images.jianshu.io/upload_images/5018582-f517b3087c95e799?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
复制代码


11、Java9新特性之---引进HttpClient


以往我们都是通过maven添加httpclient ,java9直接引入即可

Java9所有特性都是为了提高性能和内存

相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
80 2
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
38 2
|
2月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
38 3
|
2月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
100 1
|
2月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
95 3
|
18天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
27天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
44 6
|
1月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
35 4
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
101 3