Java 从 6 到 21 的重要变动回顾

news2024/11/23 20:43:05

Java 从 6 到 21 的重要变动回顾

Java 自从发布以来,一直是全球最受欢迎的编程语言之一。其不断发展的特性和功能,使得它在各种应用程序中得以广泛应用。从 Java 6 到 Java 21,Java 语言和平台经历了许多重要的变动。本文将深入探讨这些变动,帮助开发者更好地理解和应用这些新特性。

Java 6 (2006 年发布)

主要变动

Java 6 主要是一个性能和开发工具改进版本,没有引入重大的语言特性。主要的更新包括:

  • JDBC 4.0: 增强了对 SQL 数据库的支持,简化了数据库连接代码。
  • 编译器 API: 引入了一个新的编译器 API,使得程序可以在运行时调用 Java 编译器。
  • 脚本引擎: 集成了 JavaScript 引擎 Rhino,可以在 Java 应用中直接运行 JavaScript 代码。

示例代码

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class ScriptExample {
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        engine.eval("print('Hello, Java 6!')");
    }
}

Java 7 (2011 年发布)

主要变动

Java 7 引入了多个重要的语言特性和库改进,包括:

  • 二进制字面量和数字下划线: 提高了代码的可读性。
  • switch 语句支持字符串: 扩展了 switch 语句的功能。
  • Try-with-resources 语句: 简化了资源管理,自动关闭资源。

示例代码

public class Java7Features {
    public static void main(String[] args) {
        // 二进制字面量
        int bin = 0b1001_1001;
        System.out.println(bin);

        // switch 支持字符串
        String day = "MONDAY";
        switch (day) {
            case "MONDAY":
                System.out.println("Start of the work week.");
                break;
            case "FRIDAY":
                System.out.println("End of the work week.");
                break;
            default:
                System.out.println("Midweek day.");
                break;
        }

        // Try-with-resources 语句
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            System.out.println(br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java 8 (2014 年发布)

主要变动

Java 8 是一个革命性的版本,引入了许多新的语言特性和库:

  • Lambda 表达式: 简化了代码的书写,使得函数式编程更加简洁。
  • Stream API: 提供了一种新的方式来处理集合数据。
  • 默认方法: 接口可以有默认实现。
  • Optional 类: 防止空指针异常。
  • 方法引用 :方法引用允许将现有的方法作为参数传递给其他函数或方法。方法引用的出现,使得Java代码更加简洁明了,同时也增强了代码的可读性。

示例代码

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Java8Features {
    public static void main(String[] args) {
        // Lambda 表达式
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        names.forEach(name -> System.out.println(name));

        // Stream API
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        int sum = numbers.stream()
                .filter(n -> n % 2 == 0)
                .mapToInt(Integer::intValue)
                .sum();
        System.out.println("Sum of even numbers: " + sum);

        // Optional 类
        Optional<String> optionalName = Optional.of("Alice");
        optionalName.ifPresent(name -> System.out.println("Hello, " + name));
    }
}

// Java 6
Comparator<String> comparator = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
};
names.sort(comparator);

// Java 8方法引用
names.sort(String::compareTo);

Java 9 (2017 年发布)

主要变动

Java 9 引入了模块系统和许多其他改进:

  • 模块系统: 提高了代码的模块化和可维护性。
  • JShell: 交互式编程工具,适合快速测试和学习。
  • 改进的 JDK API: 增强了集合工厂方法、进程 API 等。
  • HTTP/2 客户端 API:Java 9引入了一个新的 HTTP/2 客户端 API,支持 HTTP/2 协议,该协议提供更高的性能和更低的延迟。新的 HTTP/2 客户端 API使得Java开发人员能够更加方便地构建高性能的网络应用程序。

示例代码

module com.example.module {
    requires java.base;
    exports com.example;
}
import java.util.List;

public class Java9Features {
    public static void main(String[] args) {
        // 集合工厂方法
        List<String> names = List.of("Alice", "Bob", "Charlie");
        System.out.println(names);
    }
}
// Java 8
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://www.example.com"))
    .GET()
    .build();
HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());
String body = response.body();

// Java 9
HttpClient httpClient = HttpClient.newBuilder()
    .version(Version.HTTP_2)
    .build();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://www.example.com"))
    .GET()
    .build();
HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());
String body = response.body();

Java 10 (2018 年发布)

主要变动

Java 10 主要是一个增量更新,带来了以下改进:

  • 局部变量类型推断: 使用 var 简化变量声明。
  • G1 垃圾收集器改进: 提高了垃圾收集性能。

示例代码

import java.util.List;

public class Java10Features {
    public static void main(String[] args) {
        // 局部变量类型推断
        var names = List.of("Alice", "Bob", "Charlie");
        names.forEach(System.out::println);
    }
}

Java 11 (2018 年发布)

主要变动

Java 11 是一个长期支持 (LTS) 版本,带来了许多重要的新特性和改进:

  • HTTP Client API: 新的 HTTP 客户端 API,支持异步和同步请求。
  • 运行时编译: 允许直接运行 Java 源文件。
  • String 方法增强: 新增了一些实用的 String 方法,如 isBlank(), lines(), strip(), repeat()

示例代码

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Java11Features {
    public static void main(String[] args) throws Exception {
        // HTTP Client API
        var client = HttpClient.newHttpClient();
        var request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.github.com"))
                .build();
        var response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());

        // String 方法增强
        var multilineString = "Line1\nLine2\nLine3";
        multilineString.lines().forEach(System.out::println);
    }
}

Java 12 到 Java 20 的重要变动

Java 12 (2019 年发布)

  • Switch 表达式预览: Switch 表达式变得更加简洁和灵活。
  • JVM 常量 API: 提供了对常量池的直接访问。

Java 13 (2019 年发布)

  • 文本块预览: 多行字符串文字,简化了嵌入 HTML、JSON 等字符串内容。

Java 14 (2020 年发布)

  • 记录预览: 简化了数据载体类的声明。
  • NullPointerException 增强: 提供更详细的异常信息。

Java 15 (2020 年发布)

  • 封闭类和接口预览: 限制类的扩展性,提供了更好的封装机制。
  • 隐藏类 API: 支持动态生成和使用隐藏类。

Java 16 (2021 年发布)

  • 模式匹配 instanceof: 简化了类型检查和转换。
  • Vector API 初步预览: 支持矢量运算,提高性能。

Java 17 (2021 年发布)

  • LTS 版本: 提供长期支持。
  • 封闭类和接口正式版: 提供更强的封装和模块化。

Java 18 (2022 年发布)

  • UTF-8 作为默认字符集: 统一了字符集,简化了编码问题。

Java 19 (2022 年发布)

  • 虚拟线程预览: 提供更轻量级的线程,提升并发性能。
  • 外部函数和内存 API: 提高了与本地代码的互操作性。

Java 20 (2023 年发布)

  • 模式匹配 switch: 进一步简化和增强 switch 语句。

Java 21 (2023 年发布)

Java 21 是 Java 语言和平台的最新版本,带来了众多令人兴奋的新特性和改进。本文将深入探讨 Java 21 的重要变动,并提供相应的代码示例,帮助开发者快速掌握这些新功能。

主要变动如下:

1. 记录模式 (Record Patterns)

Java 21 引入了记录模式,使得模式匹配功能更加强大。记录模式允许在模式匹配中解构记录对象,这极大地简化了代码。

示例代码
public record Point(int x, int y) {}

public class RecordPatternExample {
    public static void main(String[] args) {
        Point point = new Point(10, 20);

        if (point instanceof Point(int x, int y)) {
            System.out.printf("Point coordinates: (%d, %d)%n", x, y);
        }
    }
}

2. 虚拟线程 (Virtual Threads)

虚拟线程是 Java 21 中的重要特性,它提供了更轻量级的线程实现,显著提高了并发编程的效率。虚拟线程使得高并发程序更加容易编写和维护。

示例代码
public class VirtualThreadsExample {
    public static void main(String[] args) throws InterruptedException {
        Thread vThread = Thread.ofVirtual().start(() -> {
            try {
                Thread.sleep(1000);
                System.out.println("Hello from virtual thread!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        vThread.join();
    }
}

3. 改进的外部函数和内存 API (Foreign Function and Memory API)

Java 21 改进了外部函数和内存 API,使得与本地代码的互操作性和性能进一步提升。这些改进使得调用本地代码更加高效和安全。

示例代码
import jdk.incubator.foreign.*;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class ForeignFunctionExample {
    public static void main(String[] args) throws Throwable {
        System.loadLibrary("example"); // 加载本地库

        try (var session = MemorySession.openConfined()) {
            var linker = Linker.nativeLinker();
            var downcallHandle = linker.downcallHandle(
                linker.defaultLookup().find("nativeFunction").orElseThrow(),
                MethodType.methodType(int.class, int.class, int.class),
                FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.JAVA_INT, ValueLayout.JAVA_INT)
            );

            int result = (int) downcallHandle.invokeExact(5, 3);
            System.out.println("Result from native function: " + result);
        }
    }
}

4. 模式匹配 switch (Pattern Matching for switch)

Java 21 继续增强了 switch 表达式的模式匹配功能,使得 switch 语句更加简洁和强大。

示例代码
public class PatternMatchingSwitchExample {
    public static void main(String[] args) {
        Object obj = "Hello, Java 21";

        String result = switch (obj) {
            case Integer i -> "Integer: " + i;
            case String s -> "String: " + s;
            default -> "Unknown type";
        };

        System.out.println(result);
    }
}

5. 增强的线程调度 (Enhanced Thread Scheduling)

Java 21 引入了增强的线程调度机制,使得虚拟线程和平台线程之间的调度更加高效。

示例代码
public class EnhancedThreadSchedulingExample {
    public static void main(String[] args) throws InterruptedException {
        Thread vThread1 = Thread.ofVirtual().start(() -> {
            try {
                Thread.sleep(500);
                System.out.println("Virtual thread 1 finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread vThread2 = Thread.ofVirtual().start(() -> {
            try {
                Thread.sleep(1000);
                System.out.println("Virtual thread 2 finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        vThread1.join();
        vThread2.join();
    }
}

结语

Java 21 引入了众多重要的新特性和改进,进一步提升了 Java 语言的表达能力和性能。记录模式和虚拟线程的引入,使得代码更加简洁和高效;改进的外部函数和内存 API 提高了与本地代码的互操作性;模式匹配 switch 和增强的线程调度机制使得 Java 的并发编程更加强大和灵活。这些新特性为开发者提供了更丰富的工具,帮助他们应对复杂的编程挑战。

通过上述示例代码,希望能帮助开发者更好地理解和应用 Java 21 的新特性。未来,Java 将继续发展,为我们带来更多的创新和改进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1846534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不出网上线CS的各种姿势(内网横向)

情况一&#xff1a;存在一台中转机器 存在一台中转机器&#xff0c;这台机器出网&#xff0c;这种是最常见的情况。 经常是拿下一台边缘机器&#xff0c;其有多块网卡&#xff0c;用于连接内外网&#xff0c;内网机器都不出网。这种情况下拿这个边缘机器做中转&#xff0c;就…

SpringBoot+Vue物流快递仓库管理系统

物流快递仓库管理是一项非常繁琐复杂的工作&#xff0c;每天要处理大量的单据数据&#xff0c;包括入库、出库、退库、调库等多项货物操作流程。因此&#xff0c;为提高库管工作的质量和效率&#xff0c;就必须根据仓库管理的特点开发库存物流信息系统。 本文立足于物流信息系…

【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案 【格式】PDF版本 【关键词】麦肯锡、物流、价格战略、定价体系 【核心观点】 - 与竞争对…

websocket服务执行playwright测试

上一篇博客从源码层面分析了playwright vscode插件实现原理&#xff0c;在上一篇博客中提到&#xff0c;backend服务是一个websocket服务。这遍博客将介绍如何封装一个websocket服务&#xff0c;通过发送消息来执行playwright测试。 初始化项目 第一步是初始化项目和安装必要的…

深入研究websocket直播中signature这个参数怎么来的,模拟自己生成一个

上一节课我们已经找到了生成signature这个字段的代码位置&#xff0c;就是这个B函数&#xff0c;嗯......听起来好像有点奇怪&#xff0c;但是它确实叫B啊&#xff0c;笑死。不管了&#xff0c;看一下里面的逻辑是啥。 注意e参数的内容是&#xff1a; {"app_name":…

PS系统教学24

去水印 仿制图章工具修复画笔工具选区-编辑-填充-内容识别 人体皮肤亮度 人体皮肤发亮 减淡工具 缺点&#xff1a;不能对所有图层取样 选择减淡工具选择高光打完高光用中间调中和一下也可以用历史记录画笔工具进行修饰也可以用加深工具进行微调 图层中的模式 滤色 曝光过…

go语言day2

使用cmd 中的 go install &#xff1b; go build 命令出现 go cannot find main module 错误怎么解决&#xff1f; go学习-问题记录(开发环境)go: cannot find main module&#xff1b; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…

docker环境部署ruoyi系统前后端分离项目

创建局域网 docker network create net-ry 安装Redis 1 安装 创建两个目录 mkdir -p /data/redis/{conf,data} 上传redis.conf文件到/data/redis/conf文件夹中 cd /data/redis/conf 3.2 配置redis.conf文件 配置redis.conf文件&#xff1a; redis.conf文件配置注意&…

函数栈帧的创建和销毁,带动图详细解析,带你大致分析汇编代码

目录 1.什么是函数栈帧 2.理解函数栈帧有什么用&#xff1f; 3.函数栈帧的创建和销毁解析 3.1什么是栈&#xff1f; 3.2 认识相关寄存器和汇编指令 3.3函数栈帧的创建和销毁解析过程 3.4函数的调用 3.5汇编代码 3.5.1函数栈帧的创建 3.5.2main函数部分 3.5.3Add函数…

无线模块433MHz和2.4GHz的功能与适用性比较

433MHz和2.4GHz这两个频段常用于无线通信中的模块&#xff0c;今天我们就来介绍这两种频段无线模块各自的特点。433MHz和2.4GHz无线模块工作频段都属于国内免许可的ISM开放频段&#xff0c;因此二者使用较为广泛。 433MHz频段无线模块位于超高频(UHF)范围内&#xff0c;具体频…

人类启发的一区新算法|旅行徒步优化算法HOA原理及代码实现(Matlab/Python)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 MATLAB PYTHON 目前&#xff0c;元启发式算法按其灵感来源可以分为&#xff1a; &#xff08;i&#xff09;群体启发&#xff0c;如粒子群PSO和灰狼优化算法GWO等&a…

wvp-GB28181-pro 源码分析-点播流程(三)

文章目录 一 、28181-2016标准文档中的点播流程二 、点播流程源码分析2.1 页面发起点播请求2.2 与ZLM协商SSRC信息2.3 订阅zlmediakit的hook消息及发送invite信令2.4 处理invite信令响应并应答2.5 收到ZLM的推流通知2.6 播放成功2.7 停止点播流程2024年6月20日下载的wvp-GB2818…

如何在华为 Ascend 设备上运行模型

模型转换:使用华为的模型转换工具 ATC ATC 在 ascend-cann-toolkit 包里 环境 Docker Image: ascendhub.huawei.com/public-ascendhub/ascend-pytorch:24.0.RC1-A2-2.1.0-ubuntu20.04 镜像版本CANN版本Pytorch版本变更项24.0.RC18.0.RC12.1.0基础镜像变更为 ubuntu20.04。p…

SAP ScreenPersonas

https://developers.sap.com/mission.screen-personas.html 跟着这个练习做一遍就了解了Personas 访问SAP提供的Personas练习系统 申请用户 登录练习系统 随便找一个可以支持Personas的程序搞起来&#xff0c;比如IW51 执行后等它出现这个图标就可以开始了.

Rocky9使用cockpitweb登陆时root用户无法登陆

Rocky9使用cockpitweb登陆时root用户无法登陆 [rootlvs ~]# vim /etc/cockpit/disallowed-users [rootlvs ~]# systemctl restart cockpit 取消disallowed-users中的root&#xff0c;即可访问 ip:9090 登陆。

模式分解的概念(下)-无损连接分解的与保持函数依赖分解的定义和判断、损失分解

一、无损连接分解 1、定义 2、检验一个分解是否是无损连接分解的算法 输入与输出 输入&#xff1a; 关系模式R&#xff08;U&#xff0c;F&#xff09;&#xff0c;F是最小函数依赖集 R上的一个分解 输出&#xff1a; 判断分解是否为无损连接分解 &#xff08;1&#x…

leetcode 动态规划(基础版)三角形最小路径和

题目&#xff1a; 题解&#xff1a; 一种可行的方案是从下到上&#xff0c;避免了从上到下的下标特判。走到每一个位置的最小值等于该位置的上两个位置中的最小值加上该位置的值。 int minimumTotal(vector<vector<int>>& triangle) {int dp[205][205]{0};f…

Origin电源维修高压发生器GEXUS-3 GEXUS-15R-02U

GEXUS-3电源维修 Origin高压发生器维修 Origin电源维修 光电设备电源维修 Origin高压电源维修故障分析应注意两点&#xff1a; 故障分析检测和故障硬件更换&#xff0c;根据高压电源故障提示和工作表现初步判断故障的类型和哪些硬件出了问题&#xff0c;再根据初步判断缩小检测…

rk3588 cpu npu gpu 定频 变频

网上的资料 cpu: npu&#xff1a; GPU: DDR:

现货黄金应用价格行为交易所需要的环境

在现货黄金投资中&#xff0c;投资者常用价格行为交易法来分析走势。简单来说&#xff0c;这种方法就是只看K线和支撑阻力位&#xff0c;顶多加一些简单的指标&#xff0c;以此构建分析和交易的系统。由于价格行为简单易学&#xff0c;现在的投资者或多或少都在使用这个方法。但…