Oracle JDK 和 OpenJDK 的对比
- Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
- OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;
- Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的
类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过 了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃 的问题,但是,只需切换到Oracle JDK就可以解决问题; - 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;
- Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来 获取最新版本;
- Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。
jdk新版本中都有哪些新特性
jdk 5 泛型
jdk8中推出了lambda表达式,stream,optional,新时间日期API等
jdk9中推出了模块化
jdk10中推出了本地变量类型推断
jdk12中增加了switch表达式
jdk13中增加了textblock
jdk14中增加了records
dk14中增加了instance模式匹配
jdk15中增加了封闭类
jdk17中扩展了switch模式匹配
jdk19中增加了协程
Java Development Kit(JDK)是Java编程语言的开发工具包。JDK的每个版本都会引入新的特性和改进,下面是主要的JDK版本及其主要特性:
JDK 1.0 (1996):第一个版本,包含基础类库、AWT、I/O、网络和字符串处理。
JDK 1.1 (1997):引入了JDBC、RMI、反射、JavaBeans、国际化和新的事件模型。
JDK 1.2 (1998):引入Swing、集合框架、JIT编译器、Java Plug-in、Java IDL、CORBA支持和安全管理器。
JDK 1.3 (2000):改进了RMI、JNDI、JavaSound、HotSpot JVM和支持CORBA。
JDK 1.4 (2002):引入了断言、正则表达式、NIO(新输入/输出)、日志记录、XML解析(JAXP)、Java Web Start和图像I/O API。
JDK 5 (2004):引入泛型、增强的for循环、自动装箱/拆箱、类型安全的枚举、静态导入、元数据(注解)、可变参数和并发工具(java.util.concurrent)。
JDK 6 (2006):改进了Web服务支持(JAX-WS)、脚本引擎(JSR 223)、桌面客户端性能(SwingWorker、桌面类库)、编译器API(JSR 199)和对Pluggable注解处理(JSR 269)的支持。
JDK 7 (2011):引入了Project Coin的许多小改进,如Switch语句支持字符串、泛型类型推断(菱形操作符)、多捕获异常、try-with-resources语句、二进制字面量、下划线分隔符和NIO.2文件系统API。
JDK 8 (2014):引入了Lambda表达式、流API、默认方法、新的日期和时间API(java.time)、重复注解、类型注解和Nashorn JavaScript引擎。
JDK 9 (2017):引入模块系统(Project Jigsaw)、JShell(交互式REPL)、改进的Javadoc、新的HTTP/2客户端API、多版本兼容的JAR文件、集合工厂方法和改进的进程API。
JDK 10 (2018):引入局部变量类型推断(var关键字)、并行Full GC、基于时间的版本控制和Root Certificates。
JDK 11 (2018):引入了新的字符串方法(如strip、repeat、lines)、HttpClient(标准化)、ZGC(实验性)、单文件源代码程序、lambda参数局部变量语法和对多版本兼容的JAR文件的改进。
JDK 12 (2019):引入了Switch表达式(预览)、Default CDS归档、Shenandoah GC(实验性)、微基准套件(JMH)和支持Abortable Mixed Collections for G1。
JDK 13 (2019):引入文本块(预览)、动态CDS归档、重新实现的Socket API和ZGC改进。
JDK 14 (2020):引入了Switch表达式(标准)、记录(预览)、Pattern Matching for instanceof(预览)、NullPointerException诊断和Foreign-Memory Access API(预览)。
JDK 15 (2020):引入了Sealed Classes(预览)、隐藏类、外部记忆访问API(第二次预览)、ZGC改进和文本块(标准)。
JDK 16 (2021):引入了Records(标准)、Pattern Matching for instanceof(标准)、强封闭的类、迁移到Git和新的Vector API(孵化器)。
JDK 17 (2021):长期支持(LTS)版本,引入了Sealed Classes(标准)、Foreign Function & Memory API(孵化器)、新HttpClient API和一些弃用和移除的功能。
JDK 18 (2022):引入了UTF-8作为默认字符集、新的Simple Web Server、Code Snippets in Java API文档、Vector API第二个孵化器版本、外部函数和内存API(第二个孵化器)和对Internet-Address Resolution SPI的改进。
JDK 19 (2022):引入了项目Loom(轻量级线程和虚拟线程),改进的Vector API和外部函数和内存API的更新。
JDK 20 (2023):包含了一些预览和孵化器功能的增强,例如面向模式的switch、记录模式匹配、封闭类和模式匹配的改进。
JDK 21 (2023):长期支持(LTS)版本,继续改进轻量级线程和虚拟线程,增强性能和稳定性,改进开发者工具。
这些版本引入了各种新特性和改进,极大地提高了Java编程的效率和能力。选择合适的JDK版本进行开发非常重要,特别是对于企业级应用程序,通常会选择长期支持(LTS)版本以确保稳定性和长期支持。
jdk 5
引入泛型;
增强循环,可以使用迭代方式; 自动装箱与自动拆箱;
类型安全的枚举;可变参数;静态引入;元数据(注解);引入Instrumentation。
Java 6
• 支持脚本语言;
• 引入JDBC 4.0 API;
• 引入Java Compiler API;
• 可插拔注解;
• 增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持;
• 继承Web Services;
• 做了很多优化。
Java7
(或Java 7)引入了许多新特性和改进,以下是其中一些主要的特性:
- Diamond语法: 允许在实例化泛型类时不需要重复指定泛型参数类型,编译器可以推断出实际的类型。
- try-with-resources语句: 引入了 try-with-resources 语句,简化了对实现了 AutoCloseable 接口的资源进行管理的代码编写。
- 字符串在switch语句中的支持: 在 switch 语句中可以使用字符串作为 case 值,而不仅仅局限于整数类型或枚举类型。
- 改进的异常处理: 引入了多个异常捕获块的支持,允许捕获不同类型的异常并分别处理。
- NIO.2(Java NIO的改进): 引入了一些新的I/O操作特性,包括文件系统访问、文件属性修改、符号链接支持等。
- Fork/Join框架: 引入了用于并行处理任务的 Fork/Join 框架,有助于利用多核处理器的性能优势。
- TWR(Type Inference for Generic Instance Creation): 允许通过 new 表达式创建对象时,省略泛型类型。
- 其他语言级改进: 包括二进制字面量、下划线在数字字面量中的使用、增强的方法调用语法等。
Java 8
其中最为核心的是Lambda表达式和Stream API
• 函数式接口
• Lambda表达式
• 接口的增强
1、Lamdba表达式
2、函数式接口
3、方法引用和构造引用
4、Stream API
5、接口中的默认方法和静态方法
6、新时间日期API:加强对日期与时间处理
7、OPtional:Optional 类已经成为 Java 8 类库一部分,用来解决空指针异常
8、其他特性
Java8中两个最为重要特性:第一个的是Lambda表达式,另一个是Stream API。
StreamAPI它位于java.util.stream包中,StreamAPI帮助我们更好地对数据进行集合操作,它本质就是对数据的操作进行流水线式处理,也可以理解为一个更加高级的迭代器,主要作用是遍历其中每一个元素。,StreamAP提供了一种高效且易于使用的处理数据方式
2、Stream特点:
1、Stream自己不会存储数据。
2、Stream不会改变源对象。相反,它们会返回一个持有结果的新Stream对象
3、Stream操作时延迟执行的。这就意味着它们等到有结果时候才会执行。
和list不同,Stream代表的是任意Java对象的序列,且stream输出的元素可能并没有预先存储在内存中,而是实时计算出来的。它可以“存储”有限个或无限个元素。
例如:我们想表示一个全体自然数的集合,使用list是不可能写出来的,因为自然数是无线的,不管内存多大也没法放到list中,但是使用Sream就可以
1、速度快;
2、代码少、简介(新增特性:lamdba表达式);
3、强大的Stream API;
4、使用并行流和串行流;
5、最大化较少空指针异常Optional;
Java 9
对 String 的内部实现进行了一项改进,称为 Compact Strings(紧凑字符串)
Java JDK 9 中并没有将 String 的内部表示从 char[] 改为 byte[]。String 在 Java 中仍然使用 char[] 来存储字符串的字符内容。
然而,在 JDK 9 中,对 String 的内部实现进行了一项改进,称为 Compact Strings(紧凑字符串)。这个改进是为了节省 String 对象的内存使用,特别是在存储包含大量 Latin-1(ISO-8859-1)字符的字符串时。
在 JDK 8 及之前的版本中,每个 char 对象占用 2 个字节的内存空间,无论是存储 ASCII 字符还是 Unicode 字符。然而,ASCII 字符只需要占用 1 个字节的存储空间就足够了。为了解决这个内存使用问题,JDK 9 中将 String 类的内部表示方式更改为使用 byte[] 存储 Latin-1 字符串,并且添加了额外的标记来区分 Latin-1 字符串和非 Latin-1 字符串。
这种改进使得 String 对象可以根据存储的字符内容类型来选择更加经济高效的内部表示方式,从而在存储 Latin-1 字符串时占用更少的内存。这对于那些包含大量 ASCII 字符的应用程序和系统,可以显著减少内存占用。
需要注意的是,这种改进是对 String 内部实现的优化,对于开发者而言,不会对代码编写和使用 String 产生明显的影响。我们仍然可以正常地使用 String 类来处理字符数据,而无需关心内部的具体实现细节。
为何JDK9要将String的底层实现由char[]改成byte[]?
JDK 版本更新、性能和内存优化的了解,对字符编码的认知以及对代码兼容性的考虑
实际上,JDK 9 并没有将 String 的底层实现由 char[] 改成 byte[]。String 类的底层实现仍然使用的是 char[],即字符数组。
然而,在 JDK 9 中,引入了 Compact Strings 特性,这是一项优化技术,旨在减少 String 对象所占用的内存空间。在此之前,Java 使用 UTF-16 编码来表示字符串,每个字符占用两个字节(char 类型)。这对于大部分英文字符来说是浪费的,因为它们可以用一个字节(byte 类型)来表示。
Compact Strings 特性的目标是将只包含拉丁字符的字符串以字节数组(byte[])的形式进行存储,从而节省内存。这样,在只包含 ASCII 字符的字符串中,每个字符只需要占用一个字节,而不再浪费两个字节。
但是需要注意的是,这种优化只适用于只包含拉丁字符的字符串,当字符串中存在其他字符时,仍然会使用 char[] 来存储。这是因为 UTF-16 编码是一种变长编码,可以表示所有 Unicode 字符,包括拉丁字符以外的字符。
综上所述,JDK 9 并没有将 String 的底层实现由 char[] 改成 byte[],而是引入了 Compact Strings 特性来优化只包含拉丁字符的字符串的存储方式,节省内存。
JDK 11
JDK 11相对于JDK 8引入了多项新功能和改进。以下是JDK 11相对于JDK 8的一些主要区别:
- 新的HTTP客户端:JDK 11引入了java.net.http包,提供了一个现代化的、非阻塞的HTTP客户端,支持HTTP/2和WebSocket。
- Epsilon垃圾收集器(实验性):JDK 11引入了一种实验性的垃圾收集器,称为Epsilon,它适用于不关注内存回收性能的测试和短暂任务。
- 动态类文件常量:JDK 11允许将常量放入类文件中,以提高字节码的动态性和灵活性。
- 预测性G1垃圾收集器:JDK 11在G1垃圾收集器中引入了一些改进,以提供更可靠和确定性的停顿时间。
- 单元测试框架改进:JDK 11集成了JUnit单元测试框架,并引入了新的测试特性和工具。
- 本地变量类型推断:JDK 11增强了Java编译器,使其能够根据上下文自动推断局部变量的类型。
- Unicode 10支持:JDK 11支持Unicode 10版本,包括符号和字符集的更新。
- TLS 1.3支持:JDK 11添加了对TLS 1.3协议的支持,提供更快、更安全的加密通信。
- 增强的性能:JDK 11引入了各种性能优化和改进,包括减少JIT编译时间、提高G1垃圾收集器的效率等。
这只是JDK 11相对于JDK 8的一些重要区别。JDK 11还有其他许多细小的改进和新功能。如果你需要更详细的信息,建议查阅Oracle官方文档或JDK 11的发行说明。需要注意的是,每个Java版本都有自己的特性和改进,选择适合你项目需求的最新版本是明智的选择。
JDK 17
截至目前(2023年8月28日),JDK的最新版本是JDK 17。JDK 17于2021年9月14日发布,它是一个长期支持(LTS)版本,并提供了许多新功能、改进和安全性增强。如果您想获取最新的JDK版本,请访问Oracle官方网站或OpenJDK项目的官方网站,以确保您获取到最新的稳定版本。请注意,未来可能还会发布更高版本的JDK,建议您及时关注并进行更新。
JDK 17是一个重要的版本,引入了许多新功能和改进。以下是JDK 17的一些主要新特性:
- 嵌套的本地变量类型推断(Nested Local Variable Type Inference):允许在lambda表达式、匿名内部类和for循环中使用var关键字来推断局部变量的类型。
- 基于Pattern Matching的switch语句(Pattern Matching for Switch):通过在switch语句中使用模式匹配,可以更方便地编写和匹配多个条件。
- Sealed类(Sealed Classes):引入了一种新的类修饰符sealed,用于限制哪些类可以继承或实现某个类或接口,从而提供更严格的类层次结构控制。
- 垃圾回收器接口(Garbage Collector Interface):为了促进垃圾回收器的开发和插件化,引入了一组接口和抽象类,使开发人员可以实现自定义的垃圾回收器。
- 基于x86的向量API(Vector API):通过引入一组新的类和接口,支持在Java中编写基于SIMD(Single Instruction, Multiple Data)指令集的并行代码,从而提高向量化操作的性能。
- 基于OpenJDK的源代码移植(JEP 391):该JEP(JDK Enhancement Proposal)使得OpenJDK的源代码更易于在不同平台上进行移植和构建。
这些只是JDK 17中的一些新特性和改进,还有其他一些JEP(JDK Enhancement Proposal)也包含在其中。您可以参阅官方文档或JDK 17的发布说明,以获取更详细的信息。