当前位置: 首页 > news >正文

Java 8 到 Java 22 新特性详解

Java 8 到 Java 22 新特性详解

Java自发布以来一直在不断演进,添加新特性以提升开发效率和性能。本文将介绍Java 8到Java 22的主要新特性,帮助开发者了解各版本的新功能和改进。

Java 8 (2014)

1. Lambda 表达式

Lambda 表达式允许使用简洁的语法定义匿名函数,主要用于简化集合操作和并行处理。

为什么需要 Lambda 表达式?

在 Java 8 之前,匿名内部类通常用于实现功能性接口,例如 RunnableComparator。但这种方式语法冗长且可读性差。Lambda 表达式提供了一种更简洁的方式来实现这些接口,使代码更简洁、可读。

如何定义 Lambda 表达式

Lambda 表达式的基本语法如下:

(parameters) -> expression
或
(parameters) -> { statements; }
示例

下面是一个使用 Lambda 表达式对列表进行排序的示例:

List<String> names = Arrays.asList("张三", "李四", "王五");
names.sort((String a, String b) -> b.compareTo(a));
names.forEach(name -> System.out.println(name));

2. Stream API

Stream API 提供了一种声明性方式处理集合数据,通过链式操作实现复杂的数据处理逻辑。

为什么需要 Stream API?

传统的集合处理方式通常使用迭代器或循环,这种方式代码冗长且易出错。Stream API 提供了一种更简洁和强大的方式来处理集合数据,使得代码更具表达力和可读性。

如何使用 Stream API

Stream API 主要由源、零或多个中间操作和终端操作组成。中间操作是惰性的,只有在终端操作调用时才会执行。

示例

下面是一个使用 Stream API 过滤和收集数据的示例:

List<String> names = Arrays.asList("张三", "李四", "王五");
List<String> filteredNames = names.stream().filter(name -> name.startsWith("张")).collect(Collectors.toList());
filteredNames.forEach(System.out::println);

3. 默认方法

默认方法(Default Methods)是Java 8引入的一个非常有用的特性,它允许在接口中定义带有实现的方法。

为什么需要默认方法?

在Java 8之前,接口只能包含抽象方法,即没有方法体的方法。这样在扩展接口时,如果为接口新增方法,所有实现了该接口的类都必须实现新增加的方法。这会导致大量的代码修改,尤其是在维护大型项目时非常不便。默认方法解决了这一问题。

默认方法的使用场景
  1. 接口演进:在框架或库中扩展接口功能,而不影响已有的实现。
  2. 提供常用功能:在接口中提供一些常用的工具方法,这些方法可以在实现类中直接使用或重写。
如何定义默认方法

默认方法使用 default 关键字进行定义。下面是一个简单的示例:

interface MyInterface {default void defaultMethod() {System.out.println("默认方法");}void abstractMethod();
}class MyClass implements MyInterface {@Overridepublic void abstractMethod() {System.out.println("抽象方法实现");}// 可以选择重写默认方法@Overridepublic void defaultMethod() {System.out.println("重写默认方法");}
}public class Main {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.abstractMethod();  // 输出:抽象方法实现myClass.defaultMethod();   // 输出:重写默认方法}
}
多重继承中的默认方法

在使用默认方法时,可能会遇到接口多重继承的问题。如果一个类实现了多个接口,而这些接口中有同名的默认方法,那么必须在实现类中重写该默认方法,以解决冲突。

interface InterfaceA {default void defaultMethod() {System.out.println("InterfaceA 默认方法");}
}interface InterfaceB {default void defaultMethod() {System.out.println("InterfaceB 默认方法");}
}class MyClass implements InterfaceA, InterfaceB {// 必须重写 defaultMethod 以解决冲突@Overridepublic void defaultMethod() {InterfaceA.super.defaultMethod();InterfaceB.super.defaultMethod();}
}public class Main {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.defaultMethod();  // 输出:InterfaceA 默认方法//      InterfaceB 默认方法}
}

4. 新的日期时间 API (java.time)

Java 8 引入了新的日期时间 API,提供了更好的日期和时间处理。

为什么需要新的日期时间 API?

在 Java 8 之前,java.util.Datejava.util.Calendar 存在设计上的缺陷,例如线程不安全、API 使用复杂等。新的日期时间 API 提供了一种更现代化、更直观的方式来处理日期和时间。

如何使用新的日期时间 API

新的日期时间 API 位于 java.time 包下,主要包括 LocalDateLocalTimeLocalDateTimeZonedDateTime 等类。

示例

下面是一些常用的日期时间操作示例:

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);
Period age = Period.between(birthday, today);
System.out.println("年龄: " + age.getYears() + " 年");LocalTime now = LocalTime.now();
LocalTime bedTime = LocalTime.of(22, 0);
Duration duration = Duration.between(now, bedTime);
System.out.println("距离睡觉时间还有: " + duration.toHours() + " 小时");

Java 9 (2017)

1. 模块系统 (Project Jigsaw)

模块系统允许开发者将代码组织成独立的模块,提高代码的可维护性和封装性。

为什么需要模块系统?

在 Java 9 之前,Java 平台和应用程序通常是通过类路径管理依赖,这种方式在大型项目中容易导致类冲突和依赖管理复杂等问题。模块系统提供了一种更好的依赖管理和封装机制。

如何定义模块

模块由 module-info.java 文件定义,包含模块的名称、依赖和导出包等信息。

示例

下面是一个简单的模块定义示例:

module my.module {requires java.base;exports com.example;
}
使用模块系统的好处
  1. 强封装:模块系统强制模块之间的依赖关系,避免了类路径下的类冲突。
  2. 可维护性:通过模块化设计,代码更加清晰和可维护。
  3. 性能优化:模块化可以减少应用程序的启动时间和内存占用。

2. JShell

JShell 是一个交互式编程工具,方便开发者试验Java代码片段。

为什么需要 JShell?

在 Java 9 之前,Java 没有提供类似 Python REPL 或者 JavaScript 控制台的工具。JShell 提供了一个交互式的编程环境,可以快速测试和调试 Java 代码。

如何使用 JShell

JShell 提供了一种 REPL(Read-Eval-Print Loop)环境,可以直接输入 Java 代码并立即执行。

示例
jshell> System.out.println("你好, JShell!");

3. 改进的集合工厂方法

新的工厂方法可以更简洁地创建不可变集合。

为什么需要改进的集合工厂方法?

在 Java 9 之前,创建集合通常需要多行代码,而且创建不可变集合相对复杂。改进的集合工厂方法提供了一种更简洁的语法来创建不可变集合。

如何使用改进的集合工厂方法

新的集合工厂方法位于 ListSetMap 接口中,可以通过静态方法创建不可变集合。

示例
List<String> list = List.of("苹果", "香蕉", "橙子");
Set<String> set = Set.of("红色", "绿色", "蓝色");
Map<String, Integer> map = Map.of("张三", 1, "李四", 2);

Java 10 (2018)

1.局部变量类型推断

  • 特性: 使用 var 关键字,编译器根据右侧的值自动推断变量类型。

  • 流程:

    var list = new ArrayList<String>();
    
    • 代码中 list 的类型会被推断为 ArrayList<String>,不再需要显式声明。

2.G1 垃圾回收器改进

  • 特性: 提升了 G1 垃圾回收器的性能,优化了大堆内存的处理能力。
  • 流程:
    • 通过改进 G1 的内部算法和性能调优,减少了垃圾回收的暂停时间,提升了整体性能。

Java 11 (2018)

1. 新的字符串方法

  • 特性: 新增了 isBlanklinesstrip 方法。

    • isBlank: 检查字符串是否为空白(仅包含空格、制表符等)。
    • lines: 将字符串按行分割为流(Stream)。
    • strip: 去除字符串前后的空白字符(比 trim 更强大,支持 Unicode 空白字符)。
  • 流程:

    String str = " Hello World ";
    System.out.println(str.isBlank());  // 输出 false,因为字符串不为空白
    System.out.println(str.strip());    // 输出 "Hello World",去除了前后空格String multiLineStr = "Line1\nLine2\nLine3";
    multiLineStr.lines().forEach(System.out::println); // 输出每一行
    

2. 垃圾回收器改进

  • 特性: 引入了 ZGC (Z Garbage Collector),一个低延迟的垃圾回收器。

    • ZGC 设计用于处理大内存堆,提供低延迟的垃圾回收,适合需要高响应时间的应用。
    • 支持非常大的堆(数 TB),停顿时间通常在 10ms 以内。
  • 流程:

    • 启用 ZGC:

      java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar yourApp.jar
      
    • 这个命令行参数启用了 ZGC,以显著降低应用的垃圾回收停顿时间。

3. 单文件程序执行

  • 特性: 直接运行单个 Java 源文件。

    • 这简化了开发和测试过程,无需先编译成字节码文件,适合快速原型和简单测试。
  • 流程:

    • 创建一个简单的 Java 文件 HelloWorld.java:

      public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
      }
      
    • 使用以下命令直接运行这个文件:

      java HelloWorld.java
      
    • 这会在后台编译并执行 Java 文件,简化了运行单个源文件的过程。

Java 12 (2019)

1.Switch 表达式 (预览特性)

  • 特性: 将 switch 语句增强为可以作为表达式,并支持新的语法。

  • 流程:

    int numLetters = switch (day) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY -> 7;default -> throw new IllegalStateException("Unexpected value: " + day);
    };
    
    • switch 表达式可以返回值,并且用箭头 (->) 语法来代替传统的 case 标签。

2.G1 垃圾回收器改进

  • 特性: 改进了 G1 垃圾回收器的吞吐量和暂停时间。
  • 流程:
    • 通过改进 G1 的并行和并发操作,减少了垃圾回收的时间,增加了吞吐量。

Java 13 (2019)

1.文本块 (预览特性)

  • 特性: 使用三重引号定义多行字符串。

  • 流程:

    String text = """{"name": "Alice","age": 25}""";
    
    • 提高了多行字符串的可读性和编写效率,特别是在处理 JSON 和 XML 时。

2.Switch 表达式 (第二次预览)

  • 特性: 对 Java 12 中的 Switch 表达式进行了进一步改进。
  • 流程:
    • 通过改进语法和功能,增强了对 Switch 表达式的支持和稳定性。

Java 14 (2020)

1. Switch 表达式

  • 特性: Switch 表达式正式引入。

    • Switch 表达式在 Java 中得到了正式支持,使得 switch 语句可以作为一种表达式返回值,从而简化代码结构和提高可读性。
    • 新的 Switch 表达式不仅支持传统的语法,还增加了更灵活和简洁的语法形式。
  • 流程:

    • 之前作为预览特性的 Switch 表达式现在作为正式特性提供了稳定的功能和语法支持。

    • 新的 Switch 表达式允许在 switch 块中使用 -> 箭头符号来代替 casebreak 关键字,使代码更加简洁明了。例如:

      int number = 3;
      String result = switch (number) {case 1 -> "one";case 2 -> "two";case 3 -> "three";default -> "unknown";
      };
      
    • 在这个示例中,Switch 表达式根据 number 的值返回相应的字符串,并赋值给 result 变量。

    • Switch 表达式还支持使用 yield 关键字返回值,使得复杂情况处理更加灵活:

      int day = 2;
      String dayType = switch (day) {case 1, 2, 3, 4, 5 -> "Weekday";case 6, 7 -> "Weekend";default -> {yield "Invalid day";}
      };
      
    • 在这个示例中,yield 关键字用于在默认情况下返回一个值。

    • 新的 Switch 表达式不仅可以提高代码的可读性和可维护性,还减少了冗余代码和错误的可能性。

2.instanceof 模式匹配 (预览特性)

  • 特性: 简化了 instanceof 操作符的使用。

  • 流程:

    if (obj instanceof String s) {System.out.println(s.toLowerCase());
    }
    
    • instanceof 现在可以直接在条件判断中进行类型转换和使用。

3.Records (预览特性)

  • 特性: 提供了一种简洁的方式定义数据类。

  • 流程:

    public record Person(String name, int age) {}
    
    • record 关键字定义了不可变的数据类,自动生成构造函数、equalshashCodetoString 方法。

Java 15 (2020)

1. 文本块

  • 特性: 文本块正式引入。

    • 文本块(Text Blocks)允许在代码中更方便地书写多行字符串,提高了代码的可读性和可维护性。
    • 使用三个双引号 """ 包围文本块,可以避免传统字符串中复杂的转义字符,同时保留原始格式。
  • 流程:

    • 之前作为预览特性的文本块现已成为正式功能,提供了稳定的多行字符串处理。

    • 文本块的主要优点包括减少了对转义字符的需求、保留了文本的原始格式以及改进了代码的可读性和可维护性。

    • 示例代码展示了如何使用文本块:

      String json = """{"name": "John","age": 30,"city": "New York"}""";
      
    • 在这个示例中,文本块使得书写多行字符串(如 JSON 格式数据)更加简洁和直观,避免了传统字符串中换行符和引号的混乱。

    • 文本块还支持内置的格式修剪功能,通过去除每行前面的公共空白字符,使文本块的内容在代码中更整齐。使用 stripIndent() 方法,可以轻松移除多余的缩进:

      String html = """<html><body><p>Hello, world</p></body></html>""".stripIndent();
      

2.Sealed Classes (预览特性)

  • 特性: 允许开发者控制哪些类可以扩展或实现它们。

  • 流程:

    public abstract sealed class Shapepermits Circle, Square, Rectangle {}
    
    • sealed 类限制了可以扩展或实现的类,增强了类型系统的安全性和控制。

Java 16 (2021)

1.Records

  • 特性: Records 正式引入。
  • 流程:
    • 之前的预览特性正式成为 Java 的一部分,提供稳定的数据类定义。

2.instanceof 模式匹配

  • 特性: instanceof 模式匹配正式引入。
  • 流程:
    • instanceof 操作符支持简化的类型检查和转换。

3.Sealed Classes (第二次预览)

  • 特性: Sealed Classes 进行进一步改进。
  • 流程:
    • 对 Sealed Classes 进行了改进,提供更灵活的类型系统支持。

Java 17 (2021)

1. Sealed Classes

  • 特性: Sealed Classes 正式引入。

    • Sealed Classes 允许在定义类时限制其他类对它的扩展,从而增强了类型系统的表达能力和安全性。
    • 通过控制子类的数量和类型,可以提高代码的可维护性和安全性,防止不必要的或意外的扩展。
  • 流程:

    • 在声明一个类时使用 sealed 关键字,并在 permits 子句中指定允许扩展该类的子类。例如:

      public sealed class Shape permits Circle, Square {// ...
      }public final class Circle extends Shape {// ...
      }public final class Square extends Shape {// ...
      }
      
    • 这种方式确保了 Shape 类只能被 CircleSquare 这两个类扩展,其他任何尝试扩展 Shape 的类都将导致编译错误。

2. 新的 LTS 版本

  • 特性: Java 17 是一个长期支持(LTS)版本。

    • Java 17 提供了更长时间的支持和维护,适用于长期使用的生产环境。这使得企业和开发者可以更安心地使用 Java 17 进行开发,而不用频繁升级到新版本。
  • 流程:

    • LTS 版本的发布周期通常为每三年一次,这意味着在这期间,LTS 版本将会得到官方的定期更新和安全补丁。
    • 企业可以在这段时间内依赖 Java 17 提供的稳定性和安全性,而不用担心频繁的版本变更带来的兼容性和维护问题。
    • 举例来说,使用 Java 17 进行项目开发,可以确保在接下来的数年内持续得到官方支持和更新,从而降低了长期的维护成本。

Java 18 (2022)

1.简化的 UTF-8 编码

  • 特性: 默认字符编码变更为 UTF-8。
  • 流程:
    • 所有的 Java 应用程序默认使用 UTF-8 编码,简化了国际化应用的开发和处理。

2.Vector API (第二次孵化)

  • 特性: 进一步改进了 Vector API,使得向量计算更加高效。
  • 流程:
    • 提供了对向量计算的支持,优化了数据处理和计算效率。

Java 19 (2022)

1.虚拟线程 (预览特性)

  • 特性: 提供了轻量级的线程实现,提升了并发处理能力。

  • 流程:

    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {executor.submit(() -> System.out.println("Hello from a virtual thread!"));
    }
    
    • 虚拟线程提供了比传统线程更轻量级的线程模型,提升了并发性能。

2.外部函数和内存 API (孵化)

  • 特性: 引入了与本地代码交互的新API。
  • 流程:
    • 新的 API 简化了 JNI 的使用,提升了与本地代码交互的效率和安全性。

Java 20 (2023)

1.模式匹配 (继续预览)

  • 特性: 进一步改进了模式匹配特性。
  • 流程:
    • 模式匹配功能进行了改进,增强了对复杂数据结构的支持。

2.字符串模板 (孵化)

  • 特性: 简化了动态字符串的生成。

  • 流程:

    String name = "Alice";
    String greeting = STR."Hello, {name}!";
    
    • 字符串模板提供了简洁的方式生成动态字符串,提升了代码的可读性和安全性。

Java 21 (2023)

1. 虚拟线程 (正式)

  • 特性: 虚拟线程在 Java 22 中正式引入。这是一种新的线程模型,旨在简化高并发编程。
  • 原理: 虚拟线程是与传统操作系统线程(平台线程)不同的一种线程模型。它们由 Java 虚拟机(JVM)管理,而不是由操作系统直接管理。虚拟线程是轻量级的,创建和管理的开销比平台线程要小很多。通过将虚拟线程映射到少量的操作系统线程上,Java 可以在单个线程中处理大量的虚拟线程,这有助于提高系统的并发处理能力。
  • 改进:
    • 性能提升: 虚拟线程可以显著减少线程切换和上下文切换的开销,使得高并发应用程序的性能得到提升。
    • 简化编程模型: 使用虚拟线程可以简化代码编写,特别是在处理大量并发任务时,可以减少复杂的线程管理代码。
    • 提升可伸缩性: 虚拟线程的轻量级特性允许应用程序处理更多的并发任务,而不会像传统线程那样消耗大量系统资源。

2. 字符串模板 (预览)

  • 特性: 字符串模板作为预览特性继续优化,提供了动态字符串处理的新功能。
  • 原理: 字符串模板是 Java 中用于生成和处理字符串的强大工具。它允许开发者通过插入变量和表达式来动态生成字符串。模板语法简洁,支持在字符串中嵌入复杂的表达式。
  • 改进:
    • 功能优化: 在预览阶段,字符串模板的功能进行了多次优化,改进了模板语法和功能,使其更加强大和灵活。
    • 增强的动态字符串处理能力: 通过字符串模板,开发者可以更方便地构造动态内容,减少了手动拼接字符串的复杂性,提高了代码的可读性和维护性。
    • 性能优化: 字符串模板的实现得到了优化,生成字符串的性能得到了提升,使得在需要大量动态字符串处理的场景中更加高效。

3. 模式匹配

  • 特性: 模式匹配在 Java 22 中得到了进一步完善,增强了对复杂数据结构的处理能力。
  • 原理: 模式匹配是一种语言特性,用于简化对对象类型和数据结构的检查和解构。它允许开发者通过模式匹配语法在一个表达式中进行类型检查和解构,而不需要编写复杂的条件语句和类型转换代码。
  • 改进:
    • 增强数据结构处理能力: Java 22 中的模式匹配扩展了对复杂数据结构(如记录和密集数据结构)的支持,使得在处理这些数据结构时更加简洁和高效。
    • 提高代码简洁性和可读性: 模式匹配使得类型检查和数据解构的代码更加简洁和易于理解,减少了样板代码的数量。
    • 改进模式匹配语法: 新版本中对模式匹配语法进行了进一步的优化和完善,使得开发者能够更直观地表达匹配逻辑,提高代码的表达力和可维护性。

Java 22 (2024)

1. 增强的垃圾回收器

ZGC (Z Garbage Collector)
  • 原理: ZGC 是一个低延迟垃圾回收器,旨在最小化垃圾回收的停顿时间。它使用并行和并发的回收策略,通过将堆分为多个区域并使用并发标记和清理过程来减少停顿时间。
  • 改进: 在 Java 22 中,ZGC 的改进可能包括优化标记和回收阶段,减少内存碎片,并提高并发处理能力,从而进一步减少应用程序的停顿时间。
G1 垃圾回收器
  • 原理: G1 是一个目标停顿时间的垃圾回收器,它将堆分为多个区域,优先回收垃圾最多的区域。它通过并行和并发回收阶段来优化停顿时间。
  • 改进: 在 Java 22 中,G1 的优化可能包括改进区域选择算法、提升并发标记和整理阶段的性能,从而减少停顿时间并提高整体性能。

2. 持续改进的外部函数和内存 API

  • 原理: 外部函数和内存 API 允许 Java 程序直接与本地代码(如 C/C++)进行交互,以及管理内存(如分配和释放)。它们提供了一种比 JNI 更高效、更安全的方式来访问本地代码和内存。
  • 改进: 在 Java 22 中,外部函数和内存 API 的改进可能包括提高访问本地代码和内存的效率,减少内存泄漏的风险,简化 API 的使用,使得与本地代码的交互更加安全和高效。

3. 新的编译器优化

  • 原理: 编译器优化包括多种技术,如优化代码生成、内联函数、循环优化等,旨在提高生成代码的执行效率。优化的目标是减少运行时开销,提高程序的整体性能。
  • 改进: 在 Java 22 中,新的编译器优化技术可能包括改进代码生成策略、提升内联优化的效果、减少冗余计算、以及更好地利用现代 CPU 特性(如 SIMD 指令集)。这些优化有助于提高 Java 程序的执行速度和响应能力。

总结

​ 从Java 8到Java 22,Java引入了众多新特性和改进,极大地提升了开发效率和性能。Lambda表达式、Stream API、模块系统、虚拟线程、字符串模板等特性,使Java在现代开发中依然保持着强大的竞争力。希望本文能帮助开发者更好地理解和利用这些新特性,在实际项目中充分发挥它们的优势。

附录

Java新特性的引入过程通常遵循一个逐步成熟的路径,从最初的概念提出到最终成为稳定的标准特性。以下是对这些概念的详细解释及其在Java发展中的作用:

  1. 预览特性
    • 定义: 预览特性是在Java开发周期中首次以实验形式推出的特性。这些特性可能尚未完全成熟,存在缺陷或不确定行为,需要通过社区的反馈来完善设计。
    • 目的: 收集开发者和用户的反馈,帮助开发团队调整和改进特性,确保其符合需求和期望。
    • 示例: Java 14中的Switch表达式,最初以预览特性形式推出,随后在后续版本中成为正式特性。
  2. 继续预览
    • 定义: 当一个预览特性在当前版本中继续保留预览状态,表明该特性需要更多时间来收集反馈和进行改进。
    • 目的: 给予更多时间来确保特性的稳定性和实用性,避免匆忙将其标准化可能带来的问题。
    • 示例: Java 20中模式匹配的继续预览,说明该特性仍在进行优化和调整。
  3. 孵化
    • 定义: 孵化特性是处于早期开发阶段的新功能,可能存在不稳定性或不完整性,其主要目标是获取社区的反馈和测试。
    • 目的: 评估特性的可行性和实用性,决定是否应进一步开发或放弃。
    • 示例: Java 19中外部函数和内存API的孵化,表明这些功能正在探索中,未来可能有重大变化。
  4. 第二次孵化
    • 定义: 特性在经历了第一次孵化后,再次进入孵化阶段,意味着需要进一步测试和改进,以确保其质量和实用性。
    • 目的: 完善特性,解决前一阶段中发现的问题,增加其成熟度。
    • 示例: Java 18中Vector API的第二次孵化,显示了对特性的深入开发和改进。
  5. 正式
    • 定义: 正式特性是经过充分测试和社区反馈后,达到稳定状态的特性,被正式纳入Java标准中。
    • 目的: 提供稳定可靠的特性供开发者在生产环境中使用,保证代码的稳定性和兼容性。
    • 示例: Java 21中虚拟线程的正式引入,标志着该特性经过多个版本的预览和孵化后,已成为稳定的标准特性。

相关文章:

Java 8 到 Java 22 新特性详解

Java 8 到 Java 22 新特性详解 Java自发布以来一直在不断演进&#xff0c;添加新特性以提升开发效率和性能。本文将介绍Java 8到Java 22的主要新特性&#xff0c;帮助开发者了解各版本的新功能和改进。 Java 8 (2014) 1. Lambda 表达式 Lambda 表达式允许使用简洁的语法定义…...

华为OD机试题-提取字符串中最长数学表达式

题目描述 https://blog.csdn.net/weixin_51055612/article/details/139841128 题目描述 提取字符串中的最长合法简单数学表达式&#xff0c;字符串长度最长的&#xff0c;并计算表达式的值。如果没有&#xff0c;则返回0。 简单数学表达式只能包含以下内容&#xff1a;0-9数字&…...

专家指南:如何为您的电路选择理想的压敏电阻或热敏电阻

保护和维持电路功能需要两种设备&#xff1a;压敏电阻和热敏电阻。这两个电气元件有时会因后缀相似而混淆&#xff0c;但它们具有不同且重要的用途。 由于这种混淆&#xff0c;我们需要准确地了解这些组件是什么&#xff0c;这就是本文将要讨论的内容——应用程序、作用、优点…...

基于主流SpringBoot进行JavaWeb开发的学习路线

目录 一、学习路线 &#xff08;1&#xff09;第一部分&#xff08;Web前端开发的技术栈&#xff09; &#xff08;2&#xff09;第二部分&#xff08;Web后端开发&#xff09; 二、学习之后必备的技能 三、学习Web开发的基础与未来的收获 学完这一类知识目标&#xff1a;…...

医疗机器人中的具身智能进展——自主超声策略模型的任务编码和局部探索

医疗机器人一直是具身智能的研究热点。医学图像、医疗触诊、血压血氧、心率脉搏和生物电信号等多模态生物医学信息&#xff0c;不断丰富着医疗机器人的感知范畴。 自主超声 “自主超声”属于具身智能医疗机器人领域中话题度较高的研究方向。作为临床检查的重要手段之一&#…...

探索人工智能在电子商务平台与游戏发行商竞争中几种应用方式

过去 12 年来&#xff0c;电脑和视频游戏的发行策略发生了巨大变化。数字游戏的销量首次超过实体游戏的销量 在20132020 年的封锁进一步加速了这一趋势。例如&#xff0c;在意大利&#xff0c;封锁的第一周导致数字游戏下载量 暴涨174.9%. 展望未来&#xff0c;市场有望继续增…...

【Altium】AD-网络版一个用户非人为异常占用多个License的解决方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 当出现一个用户同时占用多个授权&#xff0c;又无法单独释放一个授权的情况下&#xff0c;该如何解决。 2、 问题场景 一个用户获取网络版授权后&#xff0c;AD会自动重复获取授权&#xff0c;直到该license下所有授…...

*算法训练(leetcode)第二十五天 | 134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列

刷题记录 134. 加油站135. 分发糖果860. 柠檬水找零406. 根据身高重建队列 134. 加油站 leetcode题目地址 记录全局剩余油量和当前剩余油量&#xff0c;当前剩余小于0时&#xff0c;其实位置是当前位置的后一个位置。若全局剩余油量为负&#xff0c;则说明整体油量不足以走完…...

乐鑫ESPC3 ESP8685 WiFi蓝牙模块透传程序设置教程,抛开繁琐AT指令,简单Web页面配置,即可实现透传

完整文档请下载规格书 TTL-WiFi 透传产品 使用手册 一. 产品概述 二. 接口定义 三. 软件透传WEB配置使用说明 3.1 STATUS配置界面 3.2 MODULE配置界面 n Serial&#xff08;串口配置&#xff09; n WiFi&#xff08;WiFi配置&#xff09; n Networks&#xff08;网络…...

怎么样才能为公司申请OV证书?

OV证书&#xff0c;全称为组织验证型SSL证书&#xff08;Organization Validation SSL Certificate&#xff09;&#xff0c;是一种高级别的SSL/TLS证书&#xff0c;用于加密网站通信并验证网站所属组织的合法身份。相比于基本的域名验证型证书&#xff08;DV证书&#xff09;&…...

Python的`queue`模块

队列&#xff08;Queue&#xff09; 在Python的queue模块中&#xff0c;Queue类是一个线程安全的队列实现&#xff0c;用于在多线程编程中安全地交换信息。它遵循先入先出&#xff08;FIFO&#xff09;的原则。Queue类提供了几种主要的方法&#xff1a; put(item): 将一个项目…...

牛客周赛 Round 50

A题&#xff1a;小红的最小最大 思路&#xff1a; 大水题 code&#xff1a; inline void solve() {int a, b, c; cin >> a >> b >> c;if (min(a, b) c > max(a, b)) cout << "YES\n";else cout << "NO\n";return; }…...

后端之路——登录校验

前言&#xff1a;Servlet 【登录校验】这个功能技术的基础是【会话技术】&#xff0c;那么在讲【会话技术】的时候必然要谈到【Cookie】和【Session】这两个东西&#xff0c;那么在这之前必须要先讲一下一个很重要但是很多人都会忽略的一个知识点&#xff1a;【Servlet】 什么是…...

无线网卡怎么连接台式电脑?让上网更便捷!

随着无线网络的普及&#xff0c;越来越多的台式电脑用户希望通过无线网卡连接到互联网。无线网卡为台式电脑提供了无线连接的便利性&#xff0c;避免了有线网络的束缚。本文将详细介绍无线网卡怎么连接台式电脑的四种方法&#xff0c;包括使用USB无线网卡、内置无线网卡以及使用…...

【45 Pandas+Pyecharts | 去哪儿海南旅游攻略数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 日期处理&#xff0c;提取年份、月份2.4 经费处理2.5 天数处理 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 出发日期_…...

Vue3项目给ElementPlus设置中文的两个方案

介绍 在Vue3项目将ElementPlus切换为中文 1、在App.vue的文件中修改 <template><el-config-provider :locale"zhCn"><router-view></router-view></el-config-provider> </template><script lang"ts" setup>im…...

C#开发单实例应用程序并响应后续进程启动参数

C#默认的WinForm模板是不支持设置单实例的&#xff0c;也没有隔壁大哥VB.NET那样有个“生成单个实例应用程序”的勾选选项&#xff08;VB某些时候要比C#更方便&#xff09;&#xff0c;实现单实例可以有多种方法&#xff1a; 检测同名进程&#xff1a;Process.GetProcessesByNa…...

STM32智能机器人导航系统教程

目录 引言环境准备智能机器人导航系统基础代码实现&#xff1a;实现智能机器人导航系统 4.1 数据采集模块 4.2 数据处理与导航算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;机器人导航应用与优化问题解决方案与优化收尾与总结 1. 引言 智能机器…...

Android 15 适配之16K Page Size :为什么它会是最坑的一个适配点

首先什么是 Page Size &#xff1f;一般意义上&#xff0c;页面(Page)指的就是 Linux 虚拟内存管理中使用的最小数据单位&#xff0c;页面大小(Page Size)就是虚拟地址空间中的页面大小&#xff0c; Linux 中进程的虚拟地址空间是由固定大小的页面组成。 Page Size 对于虚拟内…...

下载linux的吐槽

本来这几天放假了&#xff0c;想下一个linux玩一玩 教程&#xff08;我就是根据这个教程进行下载的&#xff0c;但是呢在进行修改BIOS 模式的 地方遇见了困难&#xff0c;也许是电脑修过的原因&#xff0c;我狂按F12 以及 FnF12都没有BIOS设置&#xff0c;只有一个让我选择用w…...

【HTML入门】第四课 - 换行、分割横线和html的注释

这一小节&#xff0c;我们继续说HTML的入门知识&#xff0c;包括换行、横线分割以及注释&#xff08;html的注释&#xff09;。 目录 1 换行 2 分割横线 3 html注释 1 换行 html中分为块元素和行内元素。这一小节呢&#xff0c;先不说这些元素们&#xff0c;我们先说一下换…...

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务15:数据生产

任务描述 电信数据生产是一个完整且严密的体系&#xff0c;这样可以保证数据的鲁棒性。在本项目的数据生产模块中&#xff0c;我们来模拟生产一些电信数据。同时&#xff0c;我们必须清楚电信数据的格式和数据结构&#xff0c;这样才能在后续的数据产生、存储、分析和展示环节…...

Kotlin中的数据类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…...

提高交易决策质量,Anzo Capital昂首资本只需两个交易策略

要想提高交易决策质量&#xff0c;其实很简单&#xff0c;Anzo Capital昂首资本只需两个交易策略&#xff0c;结合价格行为和VSA(成交量与价格分析)就可以达成我们的目的。首先&#xff0c;理解这两个概念&#xff1a; 1. 价格行为&#xff1a;价格行为是市场价格变动的方式&a…...

Ubuntu TensorRT安装

什么是TensorRT 一般的深度学习项目&#xff0c;训练时为了加快速度&#xff0c;会使用多 GPU 分布式训练。但在部署推理时&#xff0c;为了降低成本&#xff0c;往往使用单个 GPU 机器甚至嵌入式平台&#xff08;比如 NVIDIA Jetson&#xff09;进行部署&#xff0c;部署端也…...

spring mvc学习

第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架&#xff0c; 是Spring Framework生态中的一个独立模块&#xff0c;它基于 Spring 实现了Web MVC&#xff08;数据、业务与展现&#xff09;设计模式的请求驱动类型的轻量级Web框架&am…...

第4集《修习止观坐禅法要》

请打开讲义第七面&#xff0c;四、悟道。 我们前面讲到智者大师出家以后&#xff0c;他除了持戒以外&#xff0c;一方面拜忏&#xff0c;一方面就是打坐&#xff0c;来调伏他过去的烦恼跟罪业&#xff0c;以为他未来圆顿止观的一个基础&#xff0c;这以下讲到他开悟的情况&…...

IPython 日志的开关:精通 %logoff 命令的实用指南

IPython 日志的开关&#xff1a;精通 %logoff 命令的实用指南 在 IPython 的强大功能中&#xff0c;日志记录是一个不可或缺的工具&#xff0c;它帮助用户记录会话历史&#xff0c;以便日后分析和重现。%logoff 命令作为日志记录功能的补充&#xff0c;允许用户在需要时停止日…...

Redis 分布式集群方案 Cluster

引言 相比于Codis&#xff0c;Redis Cluster是Redis官方提供的解决方案。相比于Codis的不同&#xff0c;他是去中心化的&#xff0c;如图所示&#xff0c;该集群有三个Redis节点组成&#xff0c;每个节点负责整个集群的一部分数据&#xff0c;每个节点负责的数据多少可能不一样…...

Redis的两种持久化方案

Redis 提供了多种持久化机制来保证数据在发生意外情况下&#xff08;如断电或服务器崩溃&#xff09;不丢失。以下是几种主要的 Redis 持久化方案及其特点&#xff1a; 1. RDB (Redis Database Backup) RDB 是 Redis 创建的数据库快照&#xff0c;它可以将数据集快照以二进制…...