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,一经查实,立即删除!

相关文章

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

两个链接合并了解问题 (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

杭电2064

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

阻塞队列实现

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

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笔记本…

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…

java入门学习_Java入门学习进阶知识点

Java入门学习进阶知识点入门阶段&#xff0c;主要是培养Java语言的编程思想。了解Java语言的语法&#xff0c;书写规范等&#xff0c;掌握Eclipse、MyEclipse等开发工具&#xff0c;编写Java代码的能力。学完这个阶段你应该可进行小型应用程序开发并且可以对数据库进行基本的增…

JDBC 数据库连接操作——实习第三天

今天开始了比较重量级的学习了&#xff0c;之前都是对于Java基础的学习和回顾。继续上篇的话题&#xff0c;《谁动了我的奶酪》&#xff0c;奉献一句我觉得比较有哲理的话&#xff1a;“学会自嘲了,而当人们学会自嘲,能够嘲笑自己的愚蠢和所做的错事时,他就在开始改变了。他甚至…

java基本特性_Java面试总结之Java基础

无论是工作多年的高级开发人员还是刚入职场的新人&#xff0c;在换工作面试的过程中&#xff0c;Java基础是必不可少的面试题之一。能不能顺利通过面试&#xff0c;拿到自己理想的offer&#xff0c;在准备面试的过程中&#xff0c;Java基础也是很关键的。对于工作多年的开发人员…

php 匹配图片路径_php正则匹配图片路径原理与方法

下面我来给大家介绍在php正则匹配图片路径原理与实现方法&#xff0c;有需要了解的朋友可进入参考参考。提取src里面的图片地址还不足够&#xff0c;因为不能保证那个地址一定是绝对地址&#xff0c;完全的地址&#xff0c;如果那是相对的呢&#xff1f;如果地址诸如&#xff1…

数据科学 python_适用于数据科学的Python vs(和)R

数据科学 pythonChoosing the right programming language when taking on a new project is perhaps one of the most daunting decisions programmers often make.在进行新项目时选择正确的编程语言可能是程序员经常做出的最艰巨的决定之一。 Python and R are no doubt amon…

win10专业版激活(cmd方式)

转载于:https://www.cnblogs.com/bug-baba/p/11225322.html

命令行窗口常用的一些小技巧

一. 打开命令行窗口的方式 1. 按住【shift】键&#xff0c;在桌面右击&#xff0c;选择“在此处打开命令行窗口(W)”,如下图所示&#xff1a; 2. 按住【开始】 R快捷键&#xff0c;弹出运行窗口&#xff0c;输入cmd&#xff0c;回车&#xff08;确定&#xff09;即可。 二. 常用…

为什么即使在班级均衡的情况下,准确度仍然令人困扰

Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that many people are too comfo…

filebeat向kafka传输数据,无数据现象

通过netstat 能够看到filebeat确实是有向kafka传输数据&#xff0c; filebeat 日志显示 那就需要修改 /etc/hosts文件 将kafka主机的名字和ip写入filebeat主机的hosts文件中。 转载于:https://www.cnblogs.com/liuYGoo/p/11226272.html

感想篇:4)越来越精简的机械设计

本章目的&#xff1a;述说机械设计方向的发展。 kiss原则需要后期追加。 作者在写电机选用章节时想到了机构的问题&#xff0c;机械发展的前半生对机构来说无疑有会辉煌的成就&#xff0c;各种各样的机构能取得难以置信的成效&#xff0c;最终甚至可以说上升到了艺术的阶段。如…

浅谈传统企业网络运营那些事儿

网络的变革、更新推动的速度很快&#xff0c;小到出门购物全方位在原基础的微信/支付宝等第三方支付等&#xff0c;随着微信公众号/微信小程序等"轻"级传播推广渠道的发展&#xff0c;以及客观的传统企业在互联网的冲击下&#xff0c;同样的价格比服务&#xff1f;比…

vim 下web开发html css js插件

Vim下的Web开发之html,CSS,javascript插件HTML 下载HTML.zip 解压HTML.zip&#xff0c;然后将里面的所有文件copy到C:\Program Files\Vim\vimfiles目录下首先&#xff0c;你应该把“ filetype plugin on ”写入你的vimrc。重启vim。新建一个test.html文件。用gvim打开按 "…

Android_Event Bus 的基本用法

1 //事件总线分发2 public class MainActivity extends ActionBarActivity {3 Button button;4 TextView text;5 6 Override7 protected void onCreate(Bundle savedInstanceState) {8 super.onCreate(savedInstanceState);9 setContentView(R…