黑马程序员技术交流社区

标题: 【杭州校区】java5、java6、java7、java8、java9新特性 [打印本页]

作者: 小江哥    时间: 2018-12-22 16:44
标题: 【杭州校区】java5、java6、java7、java8、java9新特性
本帖最后由 小江哥 于 2018-12-22 16:55 编辑

[size=2em]1. 介绍

JAVA作为使用的主力语言,掌握下其历史发展也是有必要的。看看从JAVA5开始到现在的JAVA9有哪些变化。借此机会,也可以看看哪些特性我们是已经用到的,哪些是还没有用到的。

我们在IDEA里面也可以看到language level里面的信息,这里也大致写了下各个版本JDK的新特性。
简单概括下就是:

下面我们更加详细的分析下各个版本有哪些新特性。

2. JAVA5新特性2.1 泛型 Generics

引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。Parameterized Type作为参数和返回值,Generic是vararg、annotation、enumeration、collection的基石。

泛型可以带来如下的好处总结如下:

2.2 枚举类型

引入了枚举类型

2.3 自动装箱拆箱(自动类型包装和解包)autoboxing & unboxing

简单的说是类型自动转换。自动装包:基本类型自动转为包装类(int ——Integer)自动拆包:包装类自动转为基本类型(Integer——int)

2.4 可变参数varargs(varargs number of arguments)

参数类型相同时,把重载函数合并到一起了。如:


2.5 Annotations(重要) 它是java中的metadata(注释)

注解在JAVA5中就引入了。这是非常重要的特性。现在注解的应用已经随处可见。不过JAVA5的注解还不成熟,没法自定义注解。

2.6 新的迭代语句2.7 静态导入(import static )

导入静态对象,可以省略些代码。不过这个也不常用。

2.8 新的格式化方法(java.util.Formatter)formatter.format("Remaining account balance: $%.2f", balance);2.9 新的线程模型和并发库Thread Framework(重要)

最主要的就是引入了java.util.concurrent包,这个都是需要重点掌握的。

HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意BlockingQueue、Callable、Executor、Semaphore

3. JAVA6

JAVA6当中

3.1 Web Services

优先支持编写 XML web service 客户端程序。你可以用过简单的annotaion将你的API发布成.NET交互的web services. Mustang 添加了新的解析和 XML 在 Java object-mapping APIs中, 之前只在Java EE平台实现或者Java Web Services Pack中提供.

3.2 Scripting

现在你可以在Java源代码中混入JavaScript了,这对开发原型很有有用,你也可以插入自己的脚本引擎。

3.3 JDBC4.0

JAVA6将联合绑定 Java DB (Apache Derby). JDBC 4.0 增加了许多特性例如支持XML作为SQL数据类型,更好的集成Binary Large OBjects (BLOBs) 和 Character Large OBjects (CLOBs) .

3.4 UI优化3.5 监控管理增强

添加更多的诊断信息,绑定了不是很知名的 memory-heap 分析工具Jhat 来查看内核导出。

3.6 编译API

compiler API提供编程访问javac,可以实现进程内编译,动态产生Java代码

3.7 自定义注解

Java tool和framework 提供商可以定义自己的 annotations ,并且内核支持自定义annotation的插件和执行处理器

3.8 安全性

XML-数字签名(XML-DSIG) APIs 用于创建和操纵数字签名); 新的方法来访问本地平台的安全服务,例如本地Microsoft Windows for secure authentication and communicationnative 的Public Key Infrastructure (PKI) 和 cryptographic services, Java Generic Security Services (Java GSS) 和 Kerberos services for authentication, 以及访问 LDAP servers 来认证用户.

4. JAVA74.1 集合类的语法支持

原来的样子


现在的样子:(这些集合是不可变的...)

4.2 自动资源管理

Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,Sql classes等。这个新的语言特性允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。

以前的写法:

现在的写法(不需要finally来释放资源了)

4.3 类型推断

以前的写法:

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

现在的写法

Map<String, List<String>> anagrams = new HashMap<>();4.4 数字字面量下划线支持

很长的数字可读性不好,在Java 7中可以使用下划线分隔长int以及long了。如:

int one_million = 1_000_000;

这样子还真看不惯。。。不过的确是可读性好了。

4.5 switch中使用string4.6 新增一些取环境信息的工具方法5. java85.1 lambda表达式

提供了lambda表达式,增加了很多内置函数式接口。尤其是其中的stream接口提供了

5.2 注解改进

例如支持多重注解,还有新的target等

5.3 更加详细资料

JAVA8的新内容非常多,都有相关的书来说明。需要更多了解可以看下我的另外一篇文章:java8的新特性以及用法简介

6. java9

根据JAVA 9 new features这篇幻灯片博客来总结。

6.1 REPL: jshell

类似效果:

6.2 javadoc改进

使用了H5的javadoc,优化了搜索功能:

6.3 编译改进

改变了Javac和Java用法,以便使用模块:

javac -release选项支持交叉编译

6.4 语言级别上的优化

主要涉及:

6.4.1 进程控制

能够检查和检测以及杀死Process。

6.4.2 新的Colection——不可变集合6.4.3 增强的Deprecated@Deprecated(since ="1.5", forRemoval = true)6.4.4 Stream

提供了新的inputStream方法,可以直接重定向输入流到一个输出流上

6.4.5 StackWalekr类

更加详细可以参考JAVA9 API

这个类,主要是方便对实例本身做一些类似filter、collect的操作。


7. http/2的支持

关于HTTP2的优点,可以参考我的文章:HTTP2的优点

8. JIGSAW

要在JDK里面内置模块化。这个就要提起OSGI了。这个不是三言两语能详细说清楚,为啥这个模块化这么重要的。简单来说,无论是JIGSAW还是OSGI都是为了对各模块、包的依赖之间做好隔离。这样还可以解决“JAR/Classpath地狱”的问题,Jigsaw项目的一个关键特性就是依赖管理。这个项目一旦大气来,自然而然有这样的模块、包隔离需求。虽然语言层面有了private这样的关键字,但是还是太弱了。

不过我好奇的是JIGSAW是否赶得上OSGI,毕竟人家这么多年了。还有和MAVEN的关系。按照网友的解释:osgi更偏重运行时多版本隔离,maven只到jar,jigsaw编译管理的到代码级别,运行时没有多版本隔离

关于maven和jigsaw在管理依赖上的区别,我觉得应该是maven层次更高点,jigsaw管理代码级别较低层次的依赖。未来应该是两者共存吧。

还有一点就是OSGI太复杂。。用过的大佬最后都放弃了。不过其思路值得学习。

关于这个问题,可以看下以下文章了解下:

下面来简单看下JIGSAW如何生效的:可以看到这里定义了module,module当中引入了其他类的依赖。更像是替换了原来的import
连编译时候的方法都变了:

然后使用ServiceLoader来读取modules


再看另外个例子:

9. 工具10. 其他改进10.1 性能上

提高了竞争锁的性能隔离代码缓存更智能的Java编译

10.2 http2 client

implements HTTP/2 and WebSocket







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2