📅  最后修改于: 2020-10-13 01:53:01             🧑  作者: Mango
Oracle在2014年3月18日发布了Java的新版本Java8。这是Java的革命性版本,用于软件开发平台。它包括对Java编程,JVM,工具和库的各种升级。
Java 8为Java编程提供以下功能:
Lambda表达式可帮助我们以功能样式编写代码。它提供了一种使用表达式来实现SAM接口(单一抽象方法)的简洁明了的方法。它在集合库中非常有用,在该库中它有助于迭代,过滤和提取数据。
有关更多信息和示例:单击此处
Java 8方法引用用于引用功能接口的方法。它是lambda表达式的紧凑而简单的形式。每次使用lambda表达式仅引用方法时,都可以将lambda表达式替换为方法引用。
有关更多信息和示例:单击此处
仅包含一种抽象方法的接口称为功能接口。它可以具有任意数量的默认方法和静态方法。它还可以声明对象类的方法。
功能接口也称为单一抽象方法接口(SAM接口)。
有关更多信息和示例:单击此处
Java在Java 8中引入了一个新的Optional类。它是一个公共的最终类,用于处理Java应用程序中的NullPointerException。我们必须导入java.util包才能使用此类。它提供了检查特定变量的值是否存在的方法。
有关更多信息和示例:单击此处
Java提供了一个新的forEach()方法来迭代元素。它在Iterable和Stream接口中定义。
这是Iterable接口中定义的默认方法。扩展Iterable接口的集合类可以使用forEach()方法来迭代元素。
该方法采用单个参数,该参数是功能接口。因此,您可以将lambda表达式作为参数传递。
有关更多信息和示例:单击此处
Java从Java 8开始引入了新的Date and TimeAPI。java.time包包含Java 8 Date和Time类。
有关更多信息和示例:单击此处
Java提供了一种在接口内部创建默认方法的功能。在接口内部定义并用default关键字标记的方法称为default方法。这些方法是非抽象方法,可以具有方法主体。
有关更多信息和示例:单击此处
Nashorn是JavaScript引擎。它用于在JVM(Java虚拟机)上动态执行JavaScript代码。 Java提供了用于执行JavaScript代码的命令行工具jjs。
您可以通过两种方式执行JavaScript代码:
有关更多信息和示例:单击此处
Java在java.util包中添加了一个新的最终类StringJoiner。它用于构造由定界符分隔的字符序列。现在,您可以通过传递分隔符(例如逗号(,),连字符(-)等)来创建字符串。
有关更多信息和示例:单击此处
收集器是扩展Object类的最终类。它提供归约操作,例如将元素累积到集合中,根据各种标准对元素进行汇总等。
有关更多信息和示例:单击此处
Java 8 java.util.stream包由类,接口和允许对元素进行功能样式操作的枚举组成。它执行延迟计算。因此,它仅在需要时执行。
有关更多信息和示例:单击此处
Java流提供了一个方法filter()根据给定的谓词来过滤流元素。假设您只想获取列表中的偶数元素,则可以借助filter()方法轻松地做到这一点。
此方法以谓词为参数,并返回结果元素流。
有关更多信息和示例:单击此处
Java提供了一个Base64类来处理加密和解密。您需要在源文件中导入java.util.Base64类以使用其方法。
此类提供了三种不同的编码器和解码器,用于在每个级别上加密信息。
有关更多信息和示例:单击此处
Java在Arrays类中提供了一个新的附加功能,该功能用于并行排序数组元素。 parallelSort()方法已添加到java.util.Arrays类,该类使用JSR 166 Fork / Join并行公共池提供数组排序。这是一种重载方法。
有关更多信息和示例:单击此处
1)Java安全套接字扩展(JSSE)提供程序默认在客户端启用协议传输层安全性(TLS)1.1和TLS 1.2。
2)添加了改进的方法AccessController.doPrivileged,该方法使代码可以声明其特权的子集,而不会阻止整个堆栈的遍历以检查其他权限。
3)已将高级加密标准(AES)和基于密码的加密(PBE)算法(例如PBEWithSHA256AndAES_128和PBEWithSHA512AndAES_256)添加到SunJCE提供程序中。
4)Java安全套接字扩展(SunJSSE)在JDK 7中默认为客户端应用程序启用了服务器名称指示(SNI)扩展,并且JDK 8支持服务器应用程序的SNI扩展。 SNI扩展是一项功能,它扩展了SSL / TLS协议,以指示客户端在握手过程中尝试连接的服务器名称。
5)增强了SunJSSE,以支持具有关联数据的身份验证加密(AEAD)算法。增强了Java密码术扩展(SunJCE)提供程序,以支持AES / GCM / NoPadding密码实现以及Galois / Counter Mode(GCM)算法参数。
6)新的命令标志-importpassword被添加到keytool实用程序。它用于接受密码并将其作为秘密密钥安全地存储。添加了诸如java.security.DomainLoadStoreParameter和java.security.PKCS12Attribute之类的类以支持DKS密钥库类型。
7)在JDK 8中,使用消息摘要实现SHA-2系列的SHA-224变体增强了加密算法。
8)增强了对NSA Suite B加密的支持,其中包括:
9)SecureRandom类提供了加密强随机数的生成,该随机数用于私钥或公钥,密码和签名消息。 JDK 8中引入了getInstanceStrong()方法,该方法返回最强的SecureRandom的实例。当您需要创建RSA私钥和公钥时,应使用它。 SecureRandom包括以下其他更改:
10)包括一个新的PKIXRevocationChecker类,该类使用PKIX算法检查证书的吊销状态。它支持尽力而为检查,终端实体证书检查以及特定于机制的选项。
11)公钥密码标准11(PKCS)已扩展为包括对Windows的64位支持。
12)Kerberos 5中添加了两个新的rcache类型。类型none表示完全没有rcache,类型dfl表示基于DFL样式的基于文件的rcache。此外,现在支持接受者请求的子项。使用sun.security.krb5.rcache和sun.security.krb5.acceptor.subkey系统属性来配置它们。
13)在JDK 8中,同一领域内支持Kerberos 5协议转换和约束委派。
14)Java 8默认禁用弱加密。默认情况下不支持与DES相关的Kerberos 5加密类型。可以通过在krb5.conf文件中添加allow_weak_crypto = true来启用这些加密类型。
15)您可以将服务器名称设置为null来表示未绑定的服务器。这意味着客户端可以使用任何服务器名称请求服务。建立上下文后,服务器可以使用密钥名称SASL.BOUND_SERVER_NAME检索该名称作为协商的属性。
16)Mac OS X现在支持到本机Java通用安全服务(JGSS)的Java本机接口(JNI)桥。您可以将系统属性sun.security.jgss.native设置为true来启用它。
17)定义了一个新的系统属性jdk.tls.ephemeralDHKeySize来定制临时DH密钥大小。除可导出的密码套件或传统模式(jdk.tls.ephemeralDHKeySize = legacy)外,最小可接受的DH密钥大小为1024位。
18)默认情况下,Java安全套接字扩展(JSSE)提供程序尊重客户端的密码套件首选项。但是,可以通过在服务器上调用SSLParameters.setUseCipherSuitesOrder(true)来更改行为,以遵守服务器的密码套件首选项。
1)引入了一个jjs命令,该命令以交互外壳模式或解释脚本文件的形式调用Nashorn引擎。
2)如果JavaFX应用程序已正确打包,则java命令能够启动JavaFX应用程序。
3)Java命令手册页(包括nroff和HTML)已被完全重做。现在,根据高级选项的影响范围,它们分为运行时,编译器,垃圾回收和可维护性。现在描述几个以前缺少的选项。还有一个部分介绍自上一发行版以来不建议使用或删除的选项。
4)新的jdeps命令行工具允许开发人员分析类文件以确定包级别或类级别的依赖项。
5)您可以远程访问诊断命令,以前只能通过jcmd工具在本地访问这些命令。使用Java管理扩展(JMX)提供了远程访问,因此诊断命令将向注册到平台MBean服务器的平台MBean公开。 MBean是com.sun.management.DiagnosticCommandMBean接口。
6)jarsigner工具中包含一个新选项-tsapolicyid,使您可以从时间戳管理局要求已签名的时间戳,并将其附加到已签名的JAR文件中。
7)包含一个新方法java.lang.reflect.Executable.getParameters,它使您可以访问任何方法或构造函数的形式参数的名称。但是,.class文件默认情况下不存储形式参数名称。要将形式参数名称存储在特定的.class文件中,从而使Reflection API能够检索形式参数名称,请使用javac编译器的-parameters选项编译源文件。
8)Javac规范现在将正确执行Java语言规范(JLS)15.21节中用于二进制比较的类型规则。
9)在此版本中,删除了com.sun.mirror软件包中包含的apt工具及其相关API。
在Java SE 8中,以下新API已添加到Javadoc工具中。
由于JSR 292支持Java平台上的动态类型语言,因此Java类文件格式已更新。
Pack200引擎已更新,以确保有效压缩Java SE 8类文件。现在,它可以识别常量池条目和JSR 292引入的新字节码。因此,使用此版本的pack200工具创建的压缩文件将与较早版本的unpack200工具不兼容。
在Java 8中,对java.nio.charset.Charset和扩展的charset实现进行了一些改进。它包括以下内容:
1)添加了新类java.net.URLPermission。它代表访问由给定URL定义的资源的权限。
2)已添加软件包jdk.net,其中包含特定于平台的套接字选项以及一种在所有标准套接字类型上设置这些选项的机制。套接字选项在jdk.net.ExtendedSocketOptions中定义。
3)在HttpURLConnection类中,如果安装了安全管理器,并且如果调用了导致尝试打开连接的方法,则调用方必须拥有对目标URL的主机/端口组合的“ connect” SocketPermission或允许此请求的URLPermission。
如果启用了自动重定向,并且此请求被重定向到另一个目标,则调用方还必须具有连接到重定向的主机/ URL的权限。
java.util.concurrent包添加了两个新接口和四个新类。
Interface | Description |
---|---|
public static interface CompletableFuture.AsynchronousCompletionTask | It is a marker interface which is used to identify asynchronous tasks produced by async methods. It may be useful for monitoring, debugging, and tracking asynchronous activities. |
public interface CompletionStage |
It creates a stage of a possibly asynchronous computation, that performs an action or computes a value when another CompletionStage completes. |
Class | Description |
---|---|
public class CompletableFuture |
It is aFuture that may be explicitly completed, and may be used as a CompletionStage, supporting dependent functions and actions that trigger upon its completion. |
public static class ConcurrentHashMap.KeySetView |
It is a view of a ConcurrentHashMap as a Set of keys, in which additions may optionally be enabled by mapping to a common value. |
public abstract class CountedCompleter |
A ForkJoinTask with a completion action performed when triggered and there are no remaining pending actions. |
public class CompletionException extends RuntimeException | It throws an exception when an error or other exception is encountered in the course of completing a result or task. |
ConcurrentHashMap类在其最新版本中引入了几种新方法。它包括各种forEach方法(forEach,forEachKey,forEachValue和forEachEntry),搜索方法(search,searchKeys,searchValues和searchEntries)以及大量的归约方法(reduce,reduceToDouble,reduceToLong等)。还添加了其他方法(mappingCount和newKeySet)。
最新版本通过少量新类DoubleAccumulator,DoubleAdder,LongAccumulator和LongAdder引入了可扩展,可更新的可变支持。它内部采用竞争减少技术,与原子变量相比,可提供巨大的吞吐量提高。
Class | Description |
---|---|
public class DoubleAccumulator extends Number implements Serializable | It is used for one or more variables that together maintain a running double value updated using a supplied function. |
public class DoubleAdder extends Number implements Serializable | It is used for one or more variables that together maintain an initially zero double sum. |
public class LongAccumulator extends Number implements Serializable | It is used for one or more variables that together maintain a running long value updated using a supplied function. |
public class LongAdder extends Number implements Serializable | It is used for one or more variables that together maintain an initially zero long sum. |
此类添加了两个新方法getCommonPoolParallelism()和commonPool(),它们分别返回公共池或公共池实例的目标并行度。
Method | Description |
---|---|
public static ForkJoinPool commonPool() | It returns the common pool instance. |
Public static int getCommonPoolParallelism() | It returns the targeted parallelism level of the common pool. |
添加了新的StampedLock类,该类用于添加具有三种模式的基于功能的锁定,以控制读/写访问(写,读和乐观读)。此类还支持有条件地在三种模式之间提供转换的方法。
Class | Description |
---|---|
public class StampedLock extends Object implements Serializable | This class represents a capability-based lock with three modes for controlling read/write access. |
在Java 8中,为XML处理(JAXP)1.6添加了Java API。它需要使用由java.util.ServiceLoader定义的服务提供程序加载程序工具来从服务配置文件加载服务。
这样做的理由是允许将来对Java SE平台进行模块化,在该平台上可以通过JAR文件之外的其他方式(可能没有服务配置文件)来部署服务提供商。
加强对invokespecial指令的验证,以便只能调用当前类或其直接超类中的实例初始化方法。
Java Mission Control(JMC)是一组高级工具,可进行高效且详细的数据分析,并提供高级的,不受干扰的Java监视和管理。 JMC提供了有关常见分析领域的部分,例如代码性能,内存和延迟。
现在,默认情况下,JDK 8附带的Java Mission Control中包含日语和简体中文的Babel语言包。
JDK 8包括对Unicode 6.2.0的支持。它包含以下功能。
Unicode联盟已发布了通用语言环境数据存储库(CLDR)项目,以“支持世界上的语言,并提供最大和最广泛的语言环境数据标准存储库。” CLDR正在成为语言环境数据的实际标准。 CLDR基于XML的语言环境数据已合并到JDK 8版本中,但是默认情况下处于禁用状态。
语言环境数据有四个不同的来源:
要选择所需的语言环境数据源,请使用java.locale.providers系统属性。以首选顺序列出数据源。例如:java.locale.providers = HOST,SPI,CLDR,JRE默认行为等效于以下设置:java.locale.providers = JRE,SPI
JDK 8包括两个新类,几个新方法以及一个现有静态方法的新返回值。
用于服务提供者的两个新的抽象类已添加到java.util.spi包中。
Class | Description |
---|---|
public abstract class CalendarDataProvider extends LocaleServiceProvider | It is an abstract class for service providers that provide locale-dependent Calendar parameters. |
public abstract class CalendarNameProvider extends LocaleServiceProvider | It is an abstract class for service providers that provide localized string representations (display names) of Calendar field values. |
现在,静态方法可以识别编号系统的Locale.UNICODE_LOCALE_EXTENSION。
Method | Description |
---|---|
public static final DecimalFormatSymbols getInstance(Locale locale) | It is used to get the DecimalFormatSymbols instance for the specified locale. This method provides access to DecimalFormatSymbols instances for locales supported by the Java runtime itself as well as for those supported by installed DecimalFormatSymbolsProvider implementations. It throws NullPointerException if locale is null. |
在日历API中添加了新方法:
Method | Description |
---|---|
public boolean isSupportedLocale(Locale locale) | It returns true if the given locale is supported by this locale service provider. The given locale may contain extensions that should be taken into account for the support determination. It is define in java.util.spi.LocaleServiceProvider class |
public String getCalendarType() | It returns the calendar type of this Calendar. Calendar types are defined by the Unicode Locale Data Markup Language (LDML) specification. It is defined in java.util.Calendar class. |
为Calendar.getDisplayName和Calendar.getDisplayNames方法添加了新的样式说明符,以确定Calendar名称的格式。
Specifier | Description |
---|---|
public static final int SHORT_FORMAT | It is a style specifier for getDisplayName and getDisplayNames indicating a short name used for format. |
public static final int LONG_FORMAT | It is a style specifier for getDisplayName and getDisplayNames indicating a long name used for format. |
public static final int SHORT_STANDALONE | It is a style specifier for getDisplayName and getDisplayNames indicating a short name used independently, such as a month abbreviation as calendar headers. |
public static final int LONG_STANDALONE | It is a style specifier for getDisplayName and getDisplayNames indicating a long name used independently, such as a month name as calendar headers. |
两种新的用于处理语言环境(可选)扩展的语言环境方法。
Method | Description |
---|---|
public boolean hasExtensions() | It returns true if this Locale has any extensions. |
public Locale stripExtensions() | It returns a copy of this Locale with no extensions. If this Locale has no extensions, this Locale is returned itself. |
根据RFC 4647的定义,两个新的Locale.filter方法返回与指定条件匹配的Locale实例列表:
Method | Description |
---|---|
public static List filter(List |
It returns a list of matching Locale instances using the filtering mechanism defined in RFC 4647. This is equivalent to filter(List, Collection, FilteringMode) when mode is Locale.FilteringMode.AUTOSELECT_FILTERING. |
public static List filter(List |
It returns a list of matching Locale instances using the filtering mechanism defined in RFC 4647. |
根据RFC 4647的定义,两个新的Locale.filterTags方法返回与指定条件匹配的语言标签列表。
Method | Description |
---|---|
public static List |
It returns a list of matching languages tags using the basic filtering mechanism defined in RFC 4647. This is equivalent to filterTags(List, Collection, FilteringMode) when mode is Locale.FilteringMode.AUTOSELECT_FILTERING. |
public static List |
It returns a list of matching languages tags using the basic filtering mechanism defined in RFC 4647. |
两种新的查找方法使用RFC 4647中定义的查找机制返回最匹配的语言环境或语言标签。
Method | Description |
---|---|
public static Locale lookup(List |
It returns a Locale instance for the best-matching language tag using the lookup mechanism defined in RFC 4647. |
Public static String lookupTag(List |
It returns the best-matching language tag using the lookup mechanism defined in RFC 4647. |
1)减少了显示应用程序安全提示的频率。
1)在Java控制面板的“高级”选项卡中,有一个选项可以在安装或更新JRE时禁止来自赞助者的报价。
2)可以在JAR文件清单中包含Entry-Point属性,以将一个或多个类标识为RIA(富Internet应用程序)的有效入口点。
1)javafxpackager工具已重命名为javapackager。该工具已通过自包含应用程序捆绑程序的新参数进行了增强。
以下增强功能与java工具有关:
2)已将垃圾收集优化指南添加到Java HotSpot虚拟机中。它描述了Java HotSpot VM附带的垃圾收集器,并帮助您确定哪个垃圾收集器可以最好地优化应用程序的性能,尤其是当它处理大量数据(数GB),具有多个线程并且具有高事务处理率时。
1)在此版本中,从Java控制面板的“高级”选项中删除了SSLv3协议。
1)已添加-XX:+ CheckEndorsedAndExtDirs,因为已弃用了认可标准替代机制(JDK-8065675)和扩展机制(JDK-8065702)。该选项有助于识别这些机制的任何现有用法,并且在JDK 7u80和JDK 8u40中受支持。
2)Java Flight Recorder(JFR)提供了多种方法来解锁商业功能并在应用程序运行时启用JFR。
它在Java Mission Control中包括Java命令行选项,例如jcmd诊断命令和图形用户界面(GUI)控件。这种灵活性使您能够在启动时提供适当的选项,或在以后与JFR交互。
3)选项-XX:StartFlightRecording = parameter = value具有一个新参数dumponexit = {true | false},该参数指定在JVM以受控方式终止时是否应生成JFR数据的转储文件。
4)与受限交易内存(RTM)相关的选项不再试验。这些选项包括-XX:RTMAbortRatio = abort_ratio,-XX:RTMRetryCount = number_of_retries,-XX:+ UseRTMDeopt和-XX:+ UseRTMLocking。
5)在Java 8中,引入了应用程序类数据共享(AppCDS)。 AppCDS扩展了CDS(类数据共享),以允许将标准扩展目录中的类和应用程序类路径放置在共享档案中。这是一项商业功能,不再视为实验性功能。
6)添加了新选项-XX:+ ResourceManagement和-XX:ResourceManagementSampleInterval = value。
7)添加了有关大页面的附加信息。大页面(也称为大页面)是显着大于标准内存页面大小的内存页面。大页面优化了处理器平移后备缓冲区。已经记录了Linux选项-XX:+ UseHugeTLBFS,-XX:+ UseSHM和-XX:+ UseTransparentHugePages。
8)已记录选项-XX:ObjectAlignmentInBytes = alignment。
1)添加了选项–optimistic-types = [true | false]。它通过取消优化重新编译来启用或禁用乐观类型假设。
2)选项–language = [es5]已添加到jjs工具。它指定ECMAScript语言版本。
1)新的参数可用于OS X捆绑器。 mac.CFBundleVersion参数标识要使用的内部版本号。
2)mac.dmg.simple参数指示是否跳过了依赖于执行AppleScript代码的DMG自定义步骤。
Jcmd工具用于与Java Flight Recorder(JFR)动态交互。您可以使用它来解锁商业功能,启用/开始/停止飞行记录并从系统获取各种状态消息。
jstat工具已更新,其中包含有关压缩类空间的信息,该信息是元空间的特殊组成部分。
可扩展本机内存跟踪Hotspot VM功能可帮助诊断VM内存泄漏,并在VM中没有内存泄漏时澄清用户。 Native Memory Tracker可以在大型系统上运行而无需自动关闭,也不会造成严重的性能影响,超出小型程序认为的可接受范围。