【JDK 11 安装包免费下载 免登录Oracle 】jdk11与jdk8有什么区别?

JDK 11 是 Oracle 于 2018 年发布的 Java 开发工具包,也是继 JDK 8 之后的第二个长期支持(LTS)版本(支持周期至 2026 年 9 月)。

我用夸克网盘分享了「jdk」,:https://pan.quark.cn/s/c72666843e2b

一、JDK 11 与 JDK 8 的相同点

  1. 核心语言基础一致

    两者均遵循 Java 语言的核心设计思想,如面向对象(封装、继承、多态)、异常处理、垃圾回收(GC)机制等核心特性保持一致。基础类库(如 java.langjava.utiljava.io 等)的核心功能(如 StringListMap 的基础用法)未发生破坏性变更。

  2. 兼容性设计

    JDK 11 保持了对 JDK 8 代码的向后兼容性,大多数基于 JDK 8 开发的应用无需修改(或仅需少量调整)即可在 JDK 11 上运行。

  3. LTS 版本特性

    两者均为长期支持版本(LTS),适合企业级应用(Oracle 对 JDK 8 的免费支持已结束,付费支持持续;JDK 11 的免费支持持续至 2024 年,付费支持至 2026 年)。

  4. 基本工具链

    核心开发工具(如 javac 编译器、java 运行器、jar 打包工具)的基础功能保持一致,使用方式无本质差异。

二、JDK 11 与 JDK 8 的不同点及 JDK 11 的升级点

JDK 11 在 JDK 8 的基础上,通过多个中间版本(JDK 9 - 10)的积累,带来了大量新特性、API 增强、性能优化和工具链升级,主要差异如下:

1. 语言特性增强
  • 局部变量类型推断(var 关键字)

    JDK 10 引入,JDK 11 继续支持。允许在声明局部变量时省略类型,由编译器自动推断,简化代码:

    java 复制代码
    // JDK 8 需要显式声明类型
    String str = "hello";
    List<String> list = new ArrayList<>();
    
    // JDK 11 可简化为
    var str = "hello"; // 推断为 String
    var list = new ArrayList<String>(); // 推断为 List<String>
  • Lambda 表达式的局部变量语法增强

    JDK 11 允许在 Lambda 参数中使用 var,同时支持注解:

    java 复制代码
    // JDK 8
    (String s1, String s2) -> s1 + s2;
    
    // JDK 11
    (var s1, var s2) -> s1 + s2;
    (@NonNull var s1, @NonNull var s2) -> s1 + s2; // 支持注解
2. 核心 API 增强

JDK 11 对大量基础类库进行了扩展,新增了实用方法,简化开发:

  • String 类增强

    新增 isBlank()(判断空白字符串备注)、lines()(按行拆分字符串)、strip()(去除首尾空白,支持 Unicode备注)等方法:

    java 复制代码
    String str = "  \nhello world  \n";
    str.isBlank(); // false(非全空白)
    str.lines().count(); // 2(拆分出两行)
    str.strip(); // "hello world"(去除首尾空白,比 trim() 更强大)
  • 集合类增强

    新增 of() 方法快速创建不可变集合(替代 Collections.unmodifiableXXX):

    java 复制代码
    List<String> list = List.of("a", "b"); // 不可变 List
    Map<String, Integer> map = Map.of("a", 1, "b", 2); // 不可变 Map
  • Optional 类增强

    新增 isEmpty()(判断是否为空,替代 !isPresent())、orElseThrow()(无参版本,更简洁):

    java 复制代码
    Optional<String> opt = Optional.empty();
    opt.isEmpty(); // true
    opt.orElseThrow(); // 抛出 NoSuchElementException
  • 标准化 HTTP 客户端(HttpClient

    JDK 9 引入实验性 HTTP 客户端,JDK 11 将其正式纳入 java.net.http 包,支持 HTTP/2 和 WebSocket,替代老旧的 HttpURLConnection

    java 复制代码
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://example.com"))
        .build();
    // 发送同步请求
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
3. 模块化系统(Jigsaw)

JDK 9 引入的模块化系统在 JDK 11 中进一步完善,这是与 JDK 8 最核心的差异之一:

  • JDK 8 以"JAR 包 + 类路径(classpath)"管理依赖,存在依赖混乱、应用体积过大等问题。

  • JDK 11 通过 module-info.java 定义模块,明确声明依赖和导出的接口,实现"按需加载",减少内存占用,增强安全性。

    java 复制代码
    // module-info.java 示例
    module com.example.demo {
        requires java.base; // 依赖基础模块
        requires java.net.http; // 依赖 HTTP 客户端模块
        exports com.example.demo.service; // 导出可被其他模块访问的包
    }
4. 工具链升级与变更
  • 新增 jlink 工具

    可根据模块依赖,将应用和所需的 JDK 模块打包为自定义运行时镜像(精简版 JRE),大幅减小部署体积(尤其适合容器化场景)。

  • jshell 交互式工具

    JDK 9 引入,JDK 11 完善。支持交互式编写和执行 Java 代码(类似 Python 终端),方便快速测试:

    bash 复制代码
    $ jshell
    jshell> int a = 10;
    a ==> 10
    jshell> a * 2
    $2 ==> 20
  • 移除与合并工具

    • 移除 javah(生成 native 头文件,功能被 javac -h 替代)、policytool 等过时工具。
    • 不再提供单独的 JRE 安装包(JRE 可通过 jlink 生成)。
5. 性能与垃圾回收优化
  • G1 垃圾收集器优化

    JDK 11 中 G1 引入"并行 Full GC",解决了 JDK 8 中 G1 Full GC 单线程执行效率低的问题,减少大堆场景下的停顿时间。

  • 新增低延迟垃圾收集器

    引入 ZGC(实验性,JDK 15 转正)和 Shenandoah(实验性),支持 TB 级堆内存,停顿时间控制在毫秒级(JDK 8 仅支持 G1、ParallelGC、CMS 等)。

  • JVM 常量 API

    新增 java.lang.constant 包,提供对字节码常量池的编程访问,方便框架(如 Spring、Lombok)处理常量。

6. 安全性增强
  • 默认启用 TLS 1.3(更安全、性能更好的加密协议),替代 JDK 8 中的 TLS 1.2 作为默认协议。
  • 移除了多个不安全的加密算法(如 MD5、SHA-1 用于证书验证时被禁用)。
  • 加强对内部 API 的限制(如 sun.misc.Unsafe 需通过反射显式允许,避免依赖非标准 API 导致兼容性问题)。
7. 其他重要变更
  • 终止对 appletJava Web Start 的支持(JDK 8 已标记为过时,JDK 11 彻底移除),因浏览器已普遍停止支持 Java 插件。
  • UTF-8 作为默认字符集(JDK 8 依赖系统默认字符集,可能导致跨平台乱码)。
  • 增强 Process :新增 pid()(获取进程 ID)、info()(获取进程信息)等方法,简化进程管理。
相关推荐
没有bug.的程序员1 分钟前
微服务基础设施清单:必须、应该、可以、无需的四级分类指南
java·jvm·微服务·云原生·容器·架构
武子康4 分钟前
Java-204 RabbitMQ Connection/Channel 工作流程:AMQP 发布消费、抓包帧结构与常见坑
java·分布式·消息队列·rabbitmq·ruby·java-activemq
郑州光合科技余经理5 分钟前
海外国际版同城服务系统开发:PHP技术栈
java·大数据·开发语言·前端·人工智能·架构·php
Yorelee.7 分钟前
ms-swift在训练时遇到的部分问题及解决方案
开发语言·nlp·transformer·swift
行走的bug...10 分钟前
python项目管理
开发语言·python
appearappear15 分钟前
Mac 上重新安装了Cursor 2.2.30,重新配置 springboot 过程记录
java·spring boot·后端
CryptoRzz24 分钟前
日本股票 API 对接实战指南(实时行情与 IPO 专题)
java·开发语言·python·区块链·maven
yugi98783825 分钟前
基于M序列的直扩信号扩频码生成方法及周期长码直扩信号的MATLAB实现方案
开发语言·matlab
程序员水自流26 分钟前
MySQL数据库自带系统数据库功能介绍
java·数据库·mysql·oracle
谷哥的小弟31 分钟前
Spring Framework源码解析——RequestContext
java·后端·spring·框架·源码