Java 11新特性
我们还没有完全沉浸在Java 10中,而Java 11就在这里。Java 11的重要性不仅仅是几个原因。甲骨文已经改进了它的支持模式,并提出了一个大约每6个月就会带来快速更新的发布列车。
他们已经更改了许可和支持模式,这意味着如果您下载Java 11 Oracle JDK,它将被支付用于商业用途。
这是否意味着我需要从现在开始支付Java费用?
没有。除非您下载Oracle JDK并在生产中使用它,否则不一定。
注意:IntelliJ IDEA 2018.2.4 Community Edition已经支持Java 11。
目录[ 隐藏 ]
- 1为什么Java 11很重要?
- 2我应该下载哪个JDK版本,每个版本的好处是什么?
- 3如何下载Java 11免费版?
- 4 Java 11功能
- 4.1使用单个命令运行Java文件
- 4.2 Java字符串方法
- 4.3 Lambda参数的局部变量语法
- 4.4基于嵌套的访问控制
- 4.5 JEP 309:动态类文件常量
- 4.6 JEP 318:Epsilon:No-Op垃圾收集器
- 4.7 JEP 320:删除Java EE和CORBA模块
- 4.8 JEP 328:飞行记录器
- 4.9 JEP 321:HTTP客户端
- 4.10在文件中读取/写入字符串
- 4.11 JEP 329:ChaCha20和Poly1305加密算法
- 4.12 JEP 315:改进Aarch64内在函数
- 4.13 JEP 333:ZGC:可扩展的低延迟垃圾收集器(实验性)
- 4.14 JEP 335:弃用Nashorn JavaScript引擎
- 5结论
为什么Java 11很重要?
Java 11是继Java 8之后的第二个LTS版本。从Java 11开始,Oracle JDK将不再免费用于商业用途。
您可以在开发阶段使用它,但要在商业上使用它,您需要购买许可证。如果不这样做,您可以随时从Oracle获得发票账单!
Java 10是可以下载的最后一个免费的Oracle JDK。
Oracle 从2019年1月开始停止Java 8支持。您需要支付更多支持。
您可以继续使用它,但不会获得任何补丁/安全更新。
自Java 11以来,Oracle不会为任何单个Java版本提供免费的长期支持(LTS)。
虽然Oracle JDK不再免费,但您始终可以从Oracle或其他提供商(如AdoptOpenJDK,Azul,IBM,Red Hat等)下载Open JDK版本。在我看来,除非您正在寻找具有支付意愿的企业级使用对于支持费用,您可以使用OpenJDK并在必要时进行升级。
我应该下载哪个JDK版本,每个版本的好处是什么?
由于Oracle创建了一个版本系列,其中每六个月会出现一个新版本,如果您使用Oracle提供的免费Open JDK,则需要每六个月更新一次,因为Oracle将不会提供免费更新。新版本发布。适应公司可能具有挑战性。
支付对Oracle的商业支持,并仅从一个LTS版本迁移到下一个LTS版本。
这样,您将获得Java 11到2026年的所有更新和支持。您可以在2022年下载Java 17。
即使在支持结束后仍保持免费的Java版本。虽然您不会获得安全更新,但它可能会打开安全漏洞。
Oracle不会为Java 9和Java 10 提供商业支持或更新。您需要寻找其他替代版本才能免费使用它们。
了解了Java 11附带的包袱,现在让我们分析Java 11中的重要功能,供开发人员使用。我们也将讨论一些重要的JEP。
注意:JavaFX将作为单独的模块提供,并且与Java JDK的6个月发布周期计划无关。
如何下载Java 11免费版?
您可以从此链接下载生产就绪的OpenJDK版本。二进制文件采用tar或zip格式,因此只需将它们解压缩并设置环境变量即可使用java编译器和java命令。
Java 11功能
我们将讨论JEP Process中Java 11引入的新功能。
使用单个命令运行Java文件
一个主要的变化是你不需要先用javac
工具编译java源文件。您可以使用java命令直接运行该文件,并隐式编译。
此功能在JEP 330下。
以下是对Java 11中引入的Java String类的新方法的预见:
Java字符串方法
isBlank() - 此实例方法返回一个布尔值。只有空格的空字符串和字符串被视为空白。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
System.out.println(" ".isBlank()); //true
String s = "Anupam";
System.out.println(s.isBlank()); //false
String s1 = "";
System.out.println(s1.isBlank()); //true
}
}
线()
此方法返回一个字符串数组,该数组是按行分割的所有子字符串的集合。
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws Exception {
String str = "JD\nJD\nJD";
System.out.println(str);
System.out.println(str.lines().collect(Collectors.toList()));
}
}
上面代码的输出是:
strip(),stripLeading(),stripTrailing()
strip()
- 从字符串的开头和结尾删除空白区域。
但是我们已经有了trim()。那么strip()的需求是什么?
strip()
是“Unicode感知”的演变trim()
。
什么trim()
时候推出,Unicode没有进化。现在,新的strip()删除了所有类型的空格前导和尾随(检查方法Character.isWhitespace(c)
以了解unicode是否为空格)
下面给出使用上述三种方法的示例:
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
String str = " JD ";
System.out.print("Start");
System.out.print(str.strip());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripLeading());
System.out.println("End");
System.out.print("Start");
System.out.print(str.stripTrailing());
System.out.println("End");
}
}
上面代码中控制台的输出是:
重复(INT)
repeat方法简单地以int的形式重复方法中提到的字符串很多次。
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
String str = "=".repeat(2);
System.out.println(str); //prints ==
}
}
Lambda参数的局部变量语法
JEP 323,Lambda参数的本地变量语法是Java 11中唯一的语言特性发行版。
在Java 10中,引入了局部变量类型推断。因此,我们可以从RHS推断出变量的类型 - var list = new ArrayList<String>();
JEP 323允许var
用于声明隐式类型的lambda表达式的形式参数。
我们现在可以定义:
(var s1, var s2) -> s1 + s2
这在Java 8中也是可能的,但在Java 10中被删除了。现在它又回到了Java 11中以保持统一。
但是,当我们可以跳过lambda中的类型时,为什么还需要这个呢?
如果您需要像@Nullable一样应用注释,则在不定义类型的情况下不能这样做。
此功能的限制 - 您必须在所有参数上指定类型var或不指定。
以下情况是不可能的:
(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed
var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.
基于嵌套的访问控制
在Java 11之前,这是可能的:
public class Main {
public void myPublic() {
}
private void myPrivate() {
}
class Nested {
public void nestedPublic() {
myPrivate();
}
}
}
可以通过上述方式从上面的嵌套类访问主类的私有方法。
但是如果我们使用Java Reflection,它会给出一个IllegalStateException
。
Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);
Java 11嵌套访问控制在反射中解决了这个问题。java.lang.Class
介绍了反射API在三种方法:getNestHost()
,getNestMembers()
,和isNestmateOf()
。
JEP 309:动态类文件常量
Java类文件格式现在扩展支持新的常量池形式CONSTANT_Dynamic。此JEP的目标是通过创建可以使用用户提供的行为进行参数化的单个新常量池形式来降低开发新形式的可实现类文件约束的成本和中断。
这提高了性能
JEP 318:Epsilon:No-Op垃圾收集器
与负责分配内存并释放内存的JVM GC不同,Epsilon只分配内存。
它为以下事项分配内存:
- 性能测试。
- 记忆压力测试。
- VM接口测试。
- 非常短暂的工作。
- 最后一次延迟改进。
- 最后一次吞吐量改进。
现在,Elipson仅适用于测试环境。它将导致生产中的OutOfMemoryError并使应用程序崩溃。
Elipson的好处是没有内存清除开销。因此,它将提供准确的性能测试结果,我们不能再用GC来停止它。
注意:这是一个实验性功能。
JEP 320:删除Java EE和CORBA模块
这些模块已在Java 9中弃用。现在它们已完全删除。
下面的包被删除:java.xml.ws
,java.xml.bind
,java.activation
,java.xml.ws.annotation
,java.corba
,java.transaction
,java.se.ee
,jdk.xml.ws
,jdk.xml.bind
JEP 328:飞行记录器
之前曾经是Oracle JDK中的商业插件的Flight Recorder现在是开源的,因为Oracle JDK本身不再是免费的。
JFR是一种分析工具,用于从正在运行的Java应用程序中收集诊断和分析数据。
它的性能开销可以忽略不计,通常低于1%。因此,它可以用于生产应用。
JEP 321:HTTP客户端
Java 11标准化了Http CLient API。
新API支持HTTP / 1.1和HTTP / 2。它旨在提高客户端发送请求和从服务器接收响应的整体性能。它本身也支持WebSockets。
在文件中读取/写入字符串
Java 11致力于使String的读写更方便。
它介绍了以下用于读写文件的方法:
- readString()
- writeString()
下面的代码展示了一个这样的例子
Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD
JEP 329:ChaCha20和Poly1305加密算法
Java 11提供了ChaCha20和ChaCha20-Poly1305 Cipher实现。这些算法将在SunJCE提供程序中实现。
JEP 315:改进Aarch64内在函数
改进现有的字符串和数组内在函数,并在AArch64处理器上为java.lang.Math sin,cos和log函数实现新的内在函数。
JEP 333:ZGC:可扩展的低延迟垃圾收集器(实验性)
Java 11引入了低延迟GC。这是一个实验性功能。
很高兴看到Oracle重视GC的重要性。
JEP 335:弃用Nashorn JavaScript引擎
不推荐使用Nashorn JavaScript脚本引擎和API,从而表明它们将在后续版本中删除。
结论
我们已经了解了Java 11中提供的重要功能和更新。当Java 12发布时,请尽快与您联系。