java jdk1.9新特性_JDK1.9-新特性

1. Java平台级模块系统

该特性使Java9最大的一个特性,Java提供该功能的主要的动机在于,减少内存的开销,JVM启动的时候,至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class,那么JVM是如何知道需要加载哪些class的呢。具体请参考:【JDK9-模块化系统】

2. Linking

当你使用具有显式依赖关系的模块和模块化的JDK时,新的可能性出现了。你的应用程序模块现在讲声明其对其他应用程序模块的依赖以及对其所使用的JDK模块的依赖。为什么不实用这些信息创建一个最小的运行时环境,其中只包含运行应用程序所需的那些模块呢?这可以通过Java9中的新的jlink工具实现。你可以创建针对应用程序进行优化的最小运行时映像而不需要使用完全加载JDK按照版本。

3. JShell:交互式Java REPL

许多语言已经具有交互式编程环境,Java现在加入了,可以从控制台启动jshell,并直接启动输入和执行Java代码。

d5fe4bca49d8ff2fc080110f0b50d184.png

交互式shell还可以提供良好的学习环境以及提高生产力。

4. 改进的Javadoc

Javadoc现在支持在API文档中的进行搜索,另外Javadoc的输出现在符合兼容HTML5标准,此外每个Javadoc页面都包含有关JDK模块类或接口来源的信息。

实例,对Welcome类生成javadoc文档:

381c6a3fe52cc4ae324297d598f13200.png

52817491fefdc877a133963d29e93998.png

5. 集合工厂方法

通常,希望在代码中创建一个集合(如:List,Set等),并直接用一些元素填充它。实例化集合,几个“add”调用,使得代码重复,Java9添加了几种集合工厂方法:

package com.jdk9.m;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;

public class TestFactoryMethods {

public static void main(String[] args) {

Set set = Set.of(1, 2, 3);

Set mySet = new HashSet(set);

mySet.add(4);

System.out.println(mySet);

System.out.println(set.getClass() + ", " + set);

List list = List.of("a", "b");

System.out.println(list.getClass() + ", " + list);

Map map = Map.of("k1", "v1", "k2", "v2");

System.out.println(map.getClass() + ", " + map);

}

}

运行截图:

991530af37e42c5503548fae1356f3e3.png

除了更短和更好阅读之外,这些方法也可以避免你选择特定的集合实现,事实上,从工厂方法返回已放入数个元素的集合实现是高度优化的,因为它们时不可变的:在创建后,继续添加元素到这些集合会导致“UnsupportedOperationException”。

6. 改进的Stream API

Java9中,Stream接口中添加了4个新的方法:dropWhile,takeWhile,ofNullable。还有一个iterate方法的新重载方法,可以让你提供一个Predicate来指定什么时候结束迭代:

package com.jdk9.m;

import java.util.stream.IntStream;

public class TestStream {

public static void main(String[] args) {

IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);

}

}

除了对Stream本身的扩展,OPtional和Stream之间的结合也得到了改进,可以通过OPtional的新方法stream将一个Optional对象转换为一个Stream对象:

Stream s = Optional.of(1).stream();

7. 私有接口方法

Java8带来了接口的默认方法,接口现在也可以包含行为,而不仅仅是方法签名,但是如果在接口上几个默认方法,代码几乎相同,通常将重构这些方法,调用一个可复用的私有方法,但默认方法不能是私有的。将复用代码创建为一个默认方法不是一个解决方案。Java9可以向接口添加私有辅助方法来解决此问题:

package com.jdk9.m;

public interface TestPrivate {

void im();

default void m1() {

init();

}

default void m2() {

init();

}

private void init() {

System.out.println("Initializing");

}

}

如果使用默认方法开发API,那么私有接口方法可能有助于构建其实现。

8. HTTP/2

JDK9之前,JDK提供的HTTP访问功能,几乎都需要依赖HttpURLConnection,但是这个类大家在写代码的时候很少使用,我们一般都会选择Apache的HttpClient,此处在Java9的版本中引入了一个新的HTTP相关模块,里面提供了堆HTTP访问很好的支持,不仅支持HTTP1.1而且还支持HTTP2,以及WebSocket,但是目前这个模块还在孵化阶段,因此这套API不能保证100%正确。

1a957c619eef33e5de45e21551fa02db.png

实例:

package com.jdk9.m;

import java.io.IOException;

import java.net.URI;

import java.net.URISyntaxException;

import jdk.incubator.http.HttpClient;

import jdk.incubator.http.HttpRequest;

import jdk.incubator.http.HttpResponse;

public class TestHttpClient {

public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).GET().build();

HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString());

System.out.println(response.statusCode());

}

}

运行截图:

649fceca23f8a957ee10cd716fff3dee.png

注意:JDK9的Java工程默认只可以访问java.base模块里面的包,但是HttpClient类是在模块jdk.incubator.httpclient里面,所以如果要访问HttpClient必须要创建模块化文件module-info.java并且在里面显式声明引入jdk.incubator.httpclient,否则无法访问HttpClient

module com.jdk9.m {

requires jdk.incubator.httpclient;

}

9. 多版本兼容JAR

当一个新版本的Java出现的时候,你的库用户要花费数年时间才会切换到这个新的版本,这就意味着库得去向后兼容你想要支持的最老的Java版本。这实际上意味着未来的很长一段时间,你都不能在库中运行Java9锁提供的新特性。多版本兼容JAR功能让你创建仅在特定版本Java环境中运行库程序时选择使用的class版本。

实例:

multirelease.jar

├── META-INF

│ └── versions

│ └── 9

│ └── multirelease

│ └── Helper.class

├── multirelease

├── Helper.class

└── Main.class

multirelease.jar可以在Java9中使用,不过Helper这个类使用的不是顶层的multirelease.Helper这个class,而是处在META-INFO/version/9下面的类。这是特别为Java9准备的class版本,可以运行Java9所提供的特性和库。同时,在早期的Java诸版本中使用这个JAR也是能运行的,因为较老版本的Java只会看到顶层的Helper类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在10分钟内让Redux发挥作用

Hi everyone ❤️大家好❤️ For a while now I’ve been hearing my friends and colleagues complaining about how hard it was to get into Redux.一段时间以来&#xff0c;我一直在听我的朋友和同事抱怨进入Redux有多困难。 I run a freeCodeCamp Study Group in the So…

两个链接合并_如何找到两个链接列表的合并点

两个链接合并了解问题 (Understand the Problem) We are given two singly linked lists and we have to find the point at which they merge.我们给了两个单链表&#xff0c;我们必须找到它们合并的点。 [SLL 1] 1--->3--->5 \ …

安装veket到移动硬盘NTFS分区

如果你已经看过《手动安装veket到硬盘》和《简单的将veket安装到U盘的方法》两篇文章并且安装成功的话&#xff0c;说明不适用本文的安装环境&#xff0c;就不用往下看了。 《手动安装veket到硬盘》一文采用grub4dos来引导硬盘上的veket&#xff0c;主要是用来在本机已安装Wind…

简书使用小技巧

1、不同字体  在 设置->基础设置->富文本 模式下可以实现 2、添加图片&#xff0c;让文章更生动 3、添加代码框 &#xff01;注意&#xff1a;设置为Markdown模式后&#xff0c;只对新创建的文章起作用。转载于:https://www.cnblogs.com/HMJ-29/p/7049540.html

掩码 项目编码_每天进行20天的编码项目

掩码 项目编码by Angela He通过何安佳 每天进行20天的编码项目 (A coding project a day for 20 days) 我如何在20天内自学Web开发 (How I taught myself web development in 20 days) It was the first day of winter break for Stanford students. Back at home, I opened a…

java循环一年月份天数和_javawhile循环编写输入某年某月某日,判断这一天是这一年的第几…...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public class ZuoYe9 {public static void main(String[] args) {int days0; //存储变量这一年的第几天//1.输入年&#xff0c;月&#xff0c;日Scanner inputnew Scanner(System.in);System.out.println("请输入年份&#xf…

leetcode 605. 种花问题(贪心算法)

假设你有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花卉不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给定一个花坛&#xff08;表示为一个数组包含0和1&#xff0c;其中0表示没种植花&…

工程师的成熟模型_数据工程师的成熟度

工程师的成熟模型数据科学与机器学习 (DATA SCIENCE AND MACHINE LEARNING) What does a data engineer do?数据工程师做什么&#xff1f; Let’s start with three big wars that we need to understand before understanding what a data engineer does.让我们从理解数据工…

杭电2064

此题是一道简单的递归 此题是一道递归运算题&#xff0c;这题又是一道汉诺塔问题&#xff01;&#xff01;&#xff01;只要了解其规律&#xff0c;呵呵&#xff0c;你就可以很快AC了&#xff01;&#xff01; 这是一般的汉诺塔问题的解题方法照片&#xff01;&#xff01;&…

/ ./ ../ 的区别

/ 根目录 &#xff08;绝对路径&#xff09; ./ 当前目录 ../父级目录 &#xff08;相对路径&#xff09; ./home是当前目录下的一个叫home的目录/home是绝对路径的/home就是根下的home目录转载于:https://www.cnblogs.com/sjd1118/p/7055475.html

java设置表格列不可修改_Java DefaultTableModel使单元格不可编辑JTable

参见英文答案 >How to make a JTable non-editable 7个我有一个JAVA项目,并希望使用DefaultTableModel使我的JTable不可编辑.我知道一个解决方法,称为&#xff1a;JTable table new JTable(...){public boolean isCellEditable(int row…

阻塞队列实现

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 阻塞队列 1. 什么是阻塞队列2. 标准库中的…

graphql入门_GraphQL入门指南

graphql入门by Leonardo Maldonado莱昂纳多马尔多纳多(Leonardo Maldonado) GraphQL入门指南 (A Beginner’s Guide to GraphQL) One of the most commonly discussed terms today is the API. A lot of people don’t know exactly what an API is. Basically, API stands fo…

leetcode 239. 滑动窗口最大值(单调队列)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出…

scrape创建_确实在2分钟内对Scrape公司进行了评论和评分

scrape创建网页搜罗&#xff0c;数据科学 (Web Scraping, Data Science) In this tutorial, I will show you how to perform web scraping using Anaconda Jupyter notebook and the BeautifulSoup library.在本教程中&#xff0c;我将向您展示如何使用Anaconda Jupyter笔记本…

ArcGIS自定义高程

没写呢。 转载于:https://www.cnblogs.com/jiangyuanjia/p/11220183.html

Java基础——String类(一)

一、String 类代表字符串 Java 程序中的所有字符串字面值&#xff08;如 "abc" &#xff09;都作为此类的实例实现。 字符串是常量&#xff1b;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的&#xff0c;所以可以共享。例如…

java jol原理_Java对象布局(JOL)实现过程解析

java对象布局JOL(java object layout),描述对象在堆内存的布局。如下图&#xff1a;1.markword 固定长度8byte&#xff0c;描述对象的identityhashcode&#xff0c;分代年龄&#xff0c;锁信息等(https://www.jb51.net/article/183984.htm)&#xff1b;2.klasspoint 固定长度4b…

数据库维护相关

&#xff08;1&#xff09;SQL Server 查看数据表使用空间 exec sp_spaceused 表名 &#xff08;2&#xff09;SQL Server 数据表使用空间排序 exec sp_MSForeachTable precommandN create table ##( table_name sysname, records int, save_space Nvarchar(10), use_space var…

Redux初学者指南

by Safeer Hayat通过更安全的哈亚特 Understanding Redux as a beginner can be quite confusing. Redux has an abundance of new terms and concepts which are often pretty unintuitive. This guide presents a very simplified example of a Redux implementation. I wil…