Java版本和功能指南

您可以使用本指南查找和安装最新的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源文件, 而无需先对其进行编译。迈向脚本编写的一步。

[email protected]:~$ 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发行版,存在哪些发行版以及有什么区别。

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

来源:互联网

原文地址:https://www.cnblogs.com/1994july/p/12324639.html

时间: 2024-10-07 22:37:10

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

Java 8 特性 – 终极指南

第一次尝试翻译文章,有错误请见谅:) Java 8 特性 – 终极指南 (原文:http://www.javacodegeeks.com/2014/05/java-8-features-tutorial.html ) 编者注:Java 8出现在公众视野中已经有一段时间了,在这期间,种种迹象都表明Java 8是一个非常重要的版本. 我们已经在Java Code Geeks提供了很多丰富的教程,比方说Playing with Java 8 – Lambdas and Concurrency,Java

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

代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 匿名方法 可以为null的值类型 迭代器 协变和逆变 C# 3.0版 - 2007 自动实现的属性 匿名类型 查询表达式(LINQ) Lambda表达式 表达式树 扩展方法 var 分部方法 对象和集合初始值设定项 C# 4.0版 - 2010 dynamic 命名参数/可选参数 泛型中的协变和逆变

Java 脚本化编程指南

译文出处: coyee   原文出处:docs.oracle Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的对象.此外,脚本语言往往会自动执行许多类型的转换,例如, 必要时 将数字10转换为"10". 开发快速原型:您可以避免编辑编译运行周期,只使用"编辑运行"! 应用扩展/定制:你可以"具体化"的部分应用程序,例如一些

Java版本

Java版本分为J2SE(Java 2 Standard Edition,Java标准版).J2ME(Java 2 Micro Edition,Java微型版本)和J2EE(Java 2 Enterprise Edition,Java企业版)三个体系. JavaSE就是指Java的基础语法和一些Java平台提供的基础类库.而后面两者可以看作是前者的基础上添加一些针对某个领域的类库和框架.并不是说有好几个语法版本的Java.开发时除了安装标准版的Java后两者还需要其它的扩展工具. JavaME是

复利计算5.0(改成Java版本)与 单元测试

//由于C语言版本不方便单元测试,所以改成了java版本,部分代码如下:import java.util.Scanner; public class FuLi{ public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("\n复利计算按 1\n单利计算按 2\n计算筹集的养老金按 3\n计算时间按 4\n计算您要的利率按 5\n计算本利和投资按 6\n计算

JAVA版本微信公众账号开源项目版本发布-jeewx1.0(捷微)

JeeWx, 敏捷微信开发,简称"捷微". 捷微是一款免费开源的微信公众账号开发平台. 平台介绍: 一.简介 jeewx是一个开源,高效,敏捷的微信开发平台采用JAVA语言,它是基于jeecg这个企业级快速开发框架实现的. jeewx的目的是最大化的简化微信开发的流程,使用开发者能把最好的精力放到微信具体业务开发,并能以最快的时间完成.把一些常规而频繁的工作交由jeewx来处理即可,平台兼备的代码生成器,在线开发,可以快速的完成企业应用.为此jeewx提供了详细的二次开发文档,关键代码

关于消息推送的补充,主要介绍服务端的实现,包含object c 版本 c 版本 java 版本 php 版本 (转)

要实现消息推送功能,我们可以采用第三方(腾讯:信鸽:百度:云推送:极光推送:友盟):当然,因为各种原因,我们不能使用第三方的推送服务,那我们就需要自己编写服务端.在网上寻觅了很久,找到一篇很不错的讲解消息推送的文章,包含(object c 版本 c 版本 java 版本 php 版本)的后端实现,分享之. 原文地址:http://tanqisen.github.io/blog/2013/02/27/ios-push-apns/ 一步一步实现iOS应用PUSH功能 FEB 27TH, 2013 1

Java_并发工具包 java.util.concurrent 用户指南(转)

译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf[带书签] 进行下载. 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台

变更Linux下的Java版本 alternatives

默认正常情况下,即使使用Java 1.6版本Java脚本jdk-6u31-linux-i586.bin,安装Java运行后,会出现自动升级为1.7版本状态的情况.针对某些应用程序需要基于1.6版本方可运行的情况,需要降级为1.6.具体的操作方法有两种:1. 使用alternatives命令来实现.alternatives是Linux下的一个功能强大的命令,只能在root权限下执行.如系统中有几个命令功能十分类似,却又不能随意删除,那么可以用 alternatives 来指定一个全局的设置.[[e