您可以使用本指南查找和安装最新的Java,了解Java发行版(AdoptOpenJdk,OpenJDK,OracleJDK等)之间的差异,以及获得Java语言功能的概述,包括Java版本8-13。

Java 8,Java 11,Java 13 —有什么区别?

您可能还会喜欢:超越Java 8背景资料

首先,让我们看一下人们在尝试为其项目选择正确的Java版本时遇到的一些常见的实际问题。

如果要了解有关特定版本的更多信息,请转到 AdoptOpenJDK 网站,选择最新的Java版本,下载并安装它。然后回到本指南,仍然学习有关不同Java版本的一两个东西。

我应该使用哪个Java版本?

截至2019年9月, Java 13 是最新发布的Java版本,每6个月更新一次版本-Java 14计划在2020年3月发布,Java 15计划在2020年9月发布,依此类推。在过去,Java的发布周期 更长,最长可达3-5年!

随着许多新版本的出现,基本上存在以下实际使用场景:

公司中的旧项目经常使用Java 8进行阻塞(请参阅下面的“ 为什么公司仍停留在Java 8上?”部分)。因此,您也将不得不使用Java 8。

有些旧项目甚至卡在Java 1.5(2004年发布)或1.6(2006年发布)上,对不起,朋友们!

如果您确保使用最新的IDE,框架和构建工具并启动新项目,则可以毫不犹豫地使用Java 11(LTS)或最新的Java 13。

在Android开发的特殊领域,Java版本基本上停留在Java 7上,并提供了一组 特定的Java 8功能 。或者,您可以切换到使用Kotlin编程语言。

为什么公司仍然坚持使用Java 8?

公司仍然坚持使用Java 8的原因多种多样,仅举几例:

构建工具(Maven,Gradle等)和某些库 最初 存在Java版本> 8的错误,并且需要更新。即使在今天,例如使用Java 9+,某些构建工具也会 在构建Java项目时打印出 “反射访问”警告,即使构建良好,也只是“感觉还没有准备好”。

直到Java 8为止,您几乎都在使用Oracle的JDK构建,并且您不必在乎许可。但是,甲骨文在2019年更改了 许可计划,这使Internet疯狂地说“ Java不再免费”了,随之而来的是相当多的混乱。但是,这并不是真正的问题,您可以在本指南的“ Java发行版 ”部分中进行了解。

一些公司制定了仅使用LTS版本的政策,并且依靠其OS供应商为他们提供这些版本,这需要时间。

总结起来,您会遇到一系列实际问题(升级工具,库,框架)和政治问题。

为什么某些Java版本称为1.X?

9之前的Java版本仅具有不同的命名方案。因此,Java 8也可以称为 1.8,Java 5也可以称为 1.5, 依此java -version 类推。以这些版本发出 命令时,将得到如下输出:

c:\Program Files\Java\jdk1.8.0_191\bin>java -versionjava version "1.8.0_191" (1)Java(TM) SE Runtime Environment (build 1.8.0_191-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

这只是意味着Java8。随着Java 9切换到基于时间的发行版,命名方案也发生了变化,并且Java版本不再以1.x作为前缀。现在,版本号如下所示:

c:\Program Files\Java\jdk11\bin>java -versionopenjdk version "11" 2018-09-25 (1)OpenJDK Runtime Environment 18.9 (build 11+28)OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

Java版本之间有什么区别?我应该学习特定的吗?

来自其他编程语言,并且版本之间存在重大差异,例如Python 2至3,您可能想知道是否同样适用于Java。

Java是特别在这方面,因为它是非常向后兼容。这意味着您的Java 5或8程序可以保证与Java 8-13虚拟机一起运行-某些例外情况您现在不必担心。

显然,它反之亦然。例如,您的程序依赖于Java 13功能,而Java 8 JVM根本无法使用这些功能。

这意味着两件事:

您不仅可以“学习”特定的Java版本,例如Java 12。

而是,直到Java 8为止,您都将在所有语言功能方面都有良好的基础。

然后,您可以从像这样的指南中了解 Java 9-13附带了哪些 附加功能,并尽可能使用它们。

Java版本之间这些新功能的示例是什么?

请看下面的“ Java功能8-13 ”部分。

但根据经验:较旧,较长的发行周期(3-5年,直到Java 8)意味着每个发行版都有许多新功能。

六个月的发布周期意味着每个版本的功能会更少,因此您可以快速掌握Java 9-13语言功能。

JRE和JDK有什么区别?

到目前为止,我们仅谈论“ Java”。但是Java 到底是什么?

首先,您需要区分 JRE (Java运行时环境)和 JDK (Java开发工具包)。

从历史上看, 如果您只对运行Java程序感兴趣,则仅下载 JRE。JRE包括Java虚拟机(JVM)和“ java”命令行工具。

要开发新的Java程序,您需要下载 JDK。JDK包含 JRE拥有的所有内容,以及编译器 javac 和其他一些工具,例如 javadoc (Java文档生成器)和 jdb (Java Debugger)。

现在为什么我用过去时说话呢?

直到Java 8为止,Oracle网站都将JRE和JDK作为单独的下载提供,尽管JDK始终始终在单独的文件夹中包含JRE。对于Java 9,这种区别基本上已经消失了,您总是在下载JDK。JDK的目录结构也已更改,不再有显式的JRE文件夹。

因此,即使某些发行版(请参见“ Java发行版 ”部分)仍提供单独的JRE下载,似乎也存在仅提供JDK的趋势。因此, 从现在开始,我们将交替使用 Java 和 JDK。

然后如何安装Java或JDK?

目前,请忽略Java-Docker映像,.msi包装器或特定于平台的软件包。最后,Java只是一个.zip文件。仅此而已。

因此,将Java安装到计算机上所需要做的就是解压缩jdk- .zip文件。您甚至不需要管理员权限。

您解压缩后的Java文件如下所示:

Directory C:\dev\jdk-1112.11.2019  19:24    <DIR> .12.11.2019  19:24    <DIR> ..12.11.2019  19:23    <DIR> bin12.11.2019  19:23    <DIR> conf12.11.2019  19:24    <DIR> include12.11.2019  19:24    <DIR> jmods22.08.2018  19:18    <DIR> legal12.11.2019  19:24    <DIR> lib12.11.2019  19:23             1.238 release

神奇的事情发生在/ bin目录下,在Windows下看起来像这样:

Directory C:\dev\jdk-11\bin...12.11.2019  19:23           272.736 java.exe...12.11.2019  19:23            20.832 javac.exe...

因此,您所需要做的就是解压缩该文件并将/ bin目录放在PATH变量中,以便可以从任何地方调用“ java”命令。

(如果您想知道,GUI安装程序(例如来自Oracle或AdoptOpenJDK的GUI安装程序)将为您解压缩并修改PATH变量。

要验证您是否正确安装了Java,只需运行即可 java -version。如果输出看起来像下面的输出,那就好了!

openjdk version "11" 2018-09-25OpenJDK Runtime Environment 18.9 (build 11+28)OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)v

现在,还有一个问题:您从哪里获得Java .zip文件?这将我们带到了发行主题。

Java发行版

有许多提供Java下载的站点(阅读:JDK),目前尚不清楚“谁提供什么许可以及哪种许可”。本节将对此进行一些说明。

OpenJDK项目

在Java源代码方面(请阅读:JRE / JDK的源代码), OpenJDK项目 站点 上 只有一个。

这只是源代码,而不是可分发的内部版本(请考虑:您的.zip文件以及针对特定操作系统的已编译Java命令)。从理论上讲,您和我可以从该源代码生成一个内部版本,将其 命名为MarcoJDK, 然后开始进行分发。但是我们的发行版将缺少认证,无法合法地称自己为 Java SE兼容。

这就是为什么在实践中,有少数供应商实际上创建了这些构建,并通过了认证(请参阅 TCK),然后进行分发。

而且,尽管供应商无法在生成新的Java构建之前从String类中删除方法,但他们可以添加商标(是!)或添加他们认为有用的其他实用程序(例如CLI)。但是除此之外 ,所有 Java发行版的原始源代码都是 相同的 。

OpenJDK构建(由Oracle)和OracleJDK构建

从源代码构建Java的供应商之一是Oracle。这导致了 两种不同的Java发行版,一开始可能会非常混乱。

OpenJDK 由Oracle(!)构建。这些版本是免费的且没有商标,但是Oracle不会在Java 14推出后立即发布Java 13等旧版本的更新。

OracleJDK是品牌的商业版本,从2019年许可更改开始。这意味着它可以在开发中免费使用,但是如果在生产中使用Oracle,则需要付费。为此,您将获得更长的支持,即,如果JVM发疯,则可以更新版本和电话号码。

现在,从历史上讲(Java 8之前的版本),OpenJDK构建和OracleJDK构建之间存在实际的源差异,您可以说OracleJDK是“更好”的。但是到今天为止,这两个版本基本上是相同的,只是有 微小的差异。

采用OpenJDK

2017年,一组Java用户组成员,开发人员和供应商(亚马逊,微软,Pivotal,Red Hat等)创建了一个名为AdoptOpenJDK的社区 。

他们提供免费的,坚如磐石的OpenJDK构建,具有 更长的可用性/更新 ,甚至为您提供两种不同的Java虚拟机的选择:HotSpot 和 OpenJ9。

我强烈建议 您如果要安装Java。

Azul Zulu,Amazon Corretto,SAPMachine

您可以在OpenJDK Wikipedia 站点上找到OpenJDK构建的完整列表 。其中包括 Azul Zulu, Amazon Corretto和 SapMachine等。简而言之,归结为您拥有不同的支持选项/维护保证。

但是,请务必查看各个网站,以了解每种发行版本的优势。

建议

要从头开始重申,除非您有非常特殊的要求,否则请在2019年从https://adoptopenjdk.net获取jdk.zip(.tar.gz / .msi / .pkg)文件 或选择提供的软件包由您的操作系统供应商提供。

Java功能8-13

如本指南开头所述:基本上 所有 Java 8语言功能(现在不要挑剔)都可以在Java 13中使用。这之间的所有其他Java版本也是如此。

反过来,这意味着Java 8的所有语言功能都可以作为Java的良好基础知识,而其他所有功能(Java 9-13)则是在 该基线之上的许多附加功能 。

以下是必须提供的特定版本的快速概述:

Java 8

Java 8是一个庞大的版本,您可以在Oracle网站上找到所有功能的列表 。我想在这里提到两个主要功能集:

语言功能:Lambdas等

在Java 8之前,无论何时要实例化一个新的Runnable,都必须编写一个匿名内部类,如下所示:

Runnable runnable = new Runnable(){       @Override       public void run(){         System.out.println("Hello world !");       }     };

对于lambda,相同的代码如下所示:

您还获得了方法参考,重复注释,接口的默认方法以及其他一些语言功能。

Runnable runnable = () -> System.out.println("Hello world two!");

集合和流

在Java 8中,您还获得了集合的函数式操作,也称为Stream API。一个简单的例子:

List<String> list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");

现在,在Java 8之前的版本中,您基本上必须编写for循环才能对该列表进行处理。

使用Streams API,您可以执行以下操作:

list.stream()    .filter(name -> name.startsWith("f"))    .map(String::toUpperCase)    .sorted()    .forEach(System.out::println);

Java 9

Java 9也是一个相当大的发行版,其中增加了一些功能:

集合

集合有几个新的辅助方法,可以轻松地构造列表,集合和地图。

List<String> list = List.of("one", "two", "three");Set<String> set = Set.of("one", "two", "three");Map<String, String> map = Map.of("foo", "one", "bar", "two");

流有几个补充,在形式 takeWhile, dropWhile和 iterate 方法。

Stream<String> stream = Stream.iterate("", s -> s + "s")  .takeWhile(s -> s.length() < 10);

Optionals

Optionals得到了一个非常不错的 ifPresentOrElse 方法。

user.ifPresentOrElse(this::displayAccount, this::displayLogin);

接口

接口有 private 方法:

public interface MyInterface {    private static void myPrivateMethod(){        System.out.println("Yay, I am private!");    }}

其他语言功能

还有其他一些改进,例如改进的try-with-resources语句或diamond operator extensions.。

JShell

最后,Java提供了一个Shell,您可以在其中试用简单的命令并立即获得结果。

% jshell| Welcome to JShell -- Version 9| For an introduction type: /help introjshell> int x = 10x ==> 10

HTTP客户端

Java 9带来了新版本的初始预览版本 HttpClient。直到那时,Java的内置Http支持还只是底层的,您只能依靠Apache HttpClient或OkHttp之类的第三方库(它们是很棒的库,btw!)。

使用Java 9,Java获得了自己的现代客户端,尽管该客户端处于预览模式,这意味着它可能会在更高的Java版本中进行更改。

拼图项目:Java模块和多版本jar文件Java 9获得了 Jigsaw Module System,它在某种程度上类似于旧的 OSGI规范。深入了解拼图,不在本指南的范围内,但是请查看前面的链接以了解更多信息。

多版本.jar文件使一个.jar文件成为可能,该文件包含针对不同JVM版本的不同类。因此,例如,在Java 8与Java 10上运行时,您的程序可以表现不同/具有不同的类。

Java 10

Java 10进行了一些更改,例如垃圾收集等。但是,作为开发人员,您唯一可能真正看到的更改就是引入了var 关键字,也称为局部变量类型推断。

局部变量类型推断:var-keyword

// Pre-Java 10String myName = "Marco";// With Java 10var myName = "Marco"

感觉是Java语言,不是吗?但是,它仍然是强类型的,并且仅适用于方法内部的变量 。

Java 11

从开发人员的角度来看,Java 11的发行版也较小。

字符串和文件字符串和文件有几个新方法(此处未列出所有方法):

"Marco".isBlank();"Mar\nco".lines();"Marco ".strip();Path path = Files.writeString(Files.createTempFile("helloworld", ".txt"), "Hi, my name is!");String s = Files.readString(path);

运行源文件

从Java 10开始,您可以运行Java源文件, 而无需先对其进行编译。迈向脚本编写的一步。

ubuntu@DESKTOP-168M0IF:~$ java MyScript.java

Lambda参数的局部变量类型推断(var)

标头说明了一切:

(var firstName, var lastName) -> firstName + lastName

HttpClient

在 HttpClient 从Java 9在其最后,非预览版。

Java 12

Java 12有一些 新功能和清理功能,但是这里唯一值得一提的是Unicode 11支持和新开关表达式的预览,您将在下一节中看到。

Java 13

您可以在此处找到完整的功能列表 ,但从本质上讲,您将获得Unicode 12.1支持,以及两个新的或改进的预览功能(将来可能会更改):

切换表达(预览)

开关表达式现在可以返回一个值。而且您可以对表达式使用lambda样式的语法,而不会出现直通/突破问题:

旧的switch语句如下所示:

switch(status) {  case SUBSCRIBER:    // code block    break;  case FREE_TRIAL:    // code block    break;  default:    // code block}

而在Java 13中,switch语句如下所示:

boolean result = switch (status) {    case SUBSCRIBER -> true;    case FREE_TRIAL -> false;    default -> throw new IllegalArgumentException("something is murky!");};

多行字符串(预览)

您最终可以在Java中执行此操作:

String htmlBeforeJava13 = "<html>\n" +              " <body>\n" +              " <p>Hello, world</p>\n" +              " </body>\n" +              "</html>\n";String htmlWithJava13 = """              <html>                  <body>                      <p>Hello, world</p>                  </body>              </html>              """;

Java 14及更高版本

一旦发布,将在此处进行介绍!

结论

到目前为止,您应该对以下几件事有了一个很好的了解:

如何安装Java,要获取的版本以及从何处获取(提示:AdoptOpenJDK)。

什么是Java发行版,存在哪些发行版以及有什么区别。

欢迎关注! 持续更新技术干货!

来源:互联网

Java版本和功能指南的更多相关文章

  1. 数据结构和算法(java版本)学习指南

    1 数据结构和算法内容介绍 2 数据结构和算法的概述 3 稀疏数组SparseArray

  2. 这是一篇关于:以时间表的形式来介绍Java如何演变至今,以及Java版本的一些特性的分享

    这是一篇关于:以时间表的形式来介绍Java如何演变至今,以及Java版本的一些特性的分享: Java版本,功能和历史 原文[英]:https://javapapers.com/core-java/ja ...

  3. Java 脚本化编程指南

    Java 脚本化编程指南 Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的 ...

  4. 代码演示C#各版本新功能

    代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...

  5. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  6. 读书笔记系列之java性能优化权威指南 一 第一章

    主题:java性能优化权威指南 pdf 版本:英文版 Java Performance Tuning 忽略:(0~24页)Performance+Acknowledge 1.Strategies, A ...

  7. Java版本

    Java版本 Java版本分为J2SE(Java 2 Standard Edition,Java标准版).J2ME(Java 2 Micro Edition,Java微型版本)和J2EE(Java 2 ...

  8. 前后端分离ueditor富文本编辑器的使用-Java版本

    最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...

  9. Java 11 新功能来了!

    关键时刻,第一时间送达! 目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出 ...

随机推荐

  1. NO28 第四关考试题

    第4章 第4周课前测试考试题 4.1 定时任务规则的含义01 第1题 如果在某用户的crontab文件中有以下记录,该行中的命令多久执行一次(RHCE考试题)?(  ) 30 4 * * 3 mycm ...

  2. 数十万PhpStudy用户被植入后门,快来检测你是否已沦为“肉鸡”!

    北京时间9月20日,杭州公安发布<杭州警方通报打击涉网违法犯罪暨‘净网2019’专项行动战果>一文,文章曝光了国内知名PHP调试环境程序集成包“PhpStudy软件”遭到黑客篡改并植入“后 ...

  3. jenkins#安装gitlab

    通过docker安装gitlab 参考 ------------------------------ 拉docker 镜像: docker pull gitlab/gitlab-ce 创建目录存储gi ...

  4. Vue(九)---自定义指令(directive )

    1.无参数 自定义指令的方式:1. 使用Vue.directive 来自定义2. 第一个参数就是 指令名称 xart3. el 表示当前的html dom对象4. 在方法体内就可以通过 innerHT ...

  5. 京东云与AI 10 篇论文被AAAI 2020 收录,京东科技实力亮相世界舞台

    美国时间2月7-12日,AAAI 2020大会在纽约正式拉开序幕,AAAI作为全球人工智能领域的顶级学术会议,每年评审并收录来自全球最顶尖的学术论文,这些学术研究引领着技术的趋势和未来.京东云与AI在 ...

  6. HDU - 3724 Encoded Barcodes (字典树)

    题意:给定n个字符串和m个经过处理得到的字符串,问对于m个字符串中的每个字符串,n个字符串中以该字符串为前缀的个数.分析:1.误差在[0.95x, 1.05x],因此求8个数的平均数,大于平均数为1, ...

  7. 法国:5G网络不会排除任何设备厂商

    腾讯科技讯,据国外媒体报道,法国财政部长布鲁诺·勒梅尔(Bruno Le Maire)日前表示,法国有关 5G 电信网络的决定将基于网络的安全和性能,他强调说,法国政府不会将某一个特定的厂商排除在法国 ...

  8. Redis 详解 (四) redis的底层数据结构

    目录 1.演示数据类型的实现 2.简单动态字符串 3.链表 4.字典 5.跳跃表 6.整数集合 7.压缩列表 8.总结 上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中, ...

  9. 利用创建的sa token来创建kubectl的config文件

    1.第一步 创建一sa,并授予需要的一个权限(需要授予的权限) 2.第二步 取步骤1中的sa的 secret的token文件并进行base64解码      echo "$TOKEN&quo ...

  10. bzoj 4008、4011、1499

    全是扒题解,,,太弱了... 不乱BB了. 4008 #include <bits/stdc++.h> #define LL long long #define lowbit(x) x&a ...