JDK 17 新特性 (一)
既然 Springboot 3.0 强制使用 JDK 17 那就看看 JDK17 有哪些新特性吧
参考链接
介绍一下 新特性的历史渊源
-
JDK 17是Java Development Kit(JDK)的一个版本,它是Java编程语言的一种实现。JDK 17于2021年9月14日发布,并作为Java SE 17的一部分。在了解JDK 17的新特性之前,让我们先了解一下Java的发展历史。
-
Java最早由Sun Microsystems公司于1991年启动,目的是开发一种能够在不同操作系统上运行的编程语言。1995年,Sun Microsystems发布了Java的第一版,被称为Java 1.0。自那时以来,Java经历了多个版本的发展,每个版本都引入了新的特性和功能。
-
Java SE(Standard Edition)是Java的标准版本,用于开发桌面、服务器和嵌入式应用程序。不同的Java SE版本编号代表了不同的发展阶段和功能改进。
-
JDK 17是Java SE 17的一部分,它引入了许多新的特性和改进。这些新特性包括:
-
类型模式匹配:引入了新的模式匹配语法,使得开发者能够更方便地对不同的模式进行匹配和处理。
-
垃圾收集器:引入了一种新的垃圾收集器,名为ZGC(Z Garbage Collector),它提供了更低延迟和更高吞吐量的垃圾收集。
-
向量API:引入了一种新的向量API,允许开发者使用向量化数据处理指令来加速并行计算。
-
Sealed类:引入了Sealed类的概念,它限制了某些类的继承和实现,从而提供更强的封装和安全性。
-
Pattern Matching for switch:扩展了switch语句的功能,使其更灵活和易用。
-
预览功能:引入了一些预览功能,包括Pattern Matching for instanceof、Sealed类和Switch表达式的模式匹配等。
-
-
这些新特性使得Java编程更加方便、高效和安全。开发者可以利用这些新特性来提高代码的质量和性能,同时减少开发时间和调试困难。JDK 17的发布标志着Java的不断发展和改进,为开发者提供了更多有用的工具和功能,以应对不断变化的技术需求和挑战。JDK 17是Java Development Kit(JDK)的一个版本,它是Java编程语言的一种实现。JDK 17于2021年9月14日发布,并作为Java SE 17的一部分。在了解JDK 17的新特性之前,让我们先了解一下Java的发展历史。
学习前置
- 使用 IDEA 创建一个 maven 项目 方法 省略
- 网上一搜一大把 这里就不再说了
文本块 可以直接打印 json
- 在Java17之前的版本里,如果我们需要定义一个字符串,比如一个JSON数据,基本都是如下方式定义:
public void printJson() {String text = "{\n" +" \"username\": \"小黑说Java\",\n" +" \"password\": \"TR5#q659\",\n" +" \"mailbox\": \"db58@96sn.vip\"\n" +"}";System.out.println(text);
}
- 这种方式定义具有几个问题:
- 双引号需要进行转义;
- 为了字符串的可读性需要通过+号连接;
- 如果需要将JSON复制到代码中需要做大量的格式调整(当然这一点也可以通过其他工具解决);
- 通过Java 17中的文本块语法,类似的字符串处理则会方便很多;通过三个双引号可以定义一个文本块,并且结束的三个双引号不能和开始的在同一行。
- 上面例子中的JSON可以更方便,可读性更好的通过文本块定义。代码如下:
public void printJson() {String text = """{"username": "小黑说Java","password": "TR5#q659","mailbox": "db58@96sn.vip"}""";System.out.println(text);
}
- 这段代码的输出结果是
{"username": "小黑说Java","password": "TR5#q659","mailbox": "db58@96sn.vip"
}
- 全部代码如下:
package com.codervibe;public class Test {public static void switchTest(String id) {switch (id) {case "1", "2" -> System.out.println("崔霞");case "3", "4" -> System.out.println("梁熙涵");default -> System.out.println("唐文昊");}}public static void main(String[] args) {printJson();}
}
Swicth 语句 语法升级
- Java 17版本中switch表达式将允许switch有返回值,并且可以直接作为结果赋值给一个变量,等等一系列的变化。
- 下面有一个switch例子,依赖于给定的枚举值,执行case操作,故意省略break。
private static void switchTest(String id) {switch (id) {case "1":System.out.println("田雨泽");case "2":System.out.println("谢忠林");default:System.out.println("高芳");}
}
- 输出结果 我就不放出来了 都知道是什么(注意这里没有 break )
- 显然这不是期望的结果,因为我们需要在每个case里添加break防止所有的case都没执行。
- 所以
private static void switchTest(String id) {switch (id) {case "1":System.out.println("田雨泽");break;case "2":System.out.println("谢忠林");break;default:System.out.println("高芳");break;}
}
- 可以通过switch表达式来进行简化。将冒号(:)替换为箭头(->),并且switch表达式默认不会失败,所以不需要break。
public static void switchTest(String id) {String text = switch (id) {case "1", "2" -> "白汝鑫";case "3", "4" -> "邱凌晶";default -> "袁文轩";};}public static void main(String[] args) {switchTest("2");switchTest("");}
- 运行结果
崔霞
唐文昊
- switch表达式也可以返回一个值,比如上面的例子我们可以让switch返回一个字符串来表示我们要打印的文本。需要注意在switch语句的最后要加一个分号。
public static void switchTest2(String id) {String text = switch (id) {case "1", "2" -> "白汝鑫";case "3", "4" -> "邱凌晶";default -> "袁文轩";};System.out.println(text);}public static void main(String[] args) {switchTest2("2");switchTest2("");}
- 但是刚才 出现了一个意外
public static void switchTest2(String id) {String text = switch (id) {case "1", "2" -> System.out.println("崔霞");case "3", "4" -> System.out.println("梁熙涵");default -> System.out.println("唐文昊");};System.out.println(text);}
- 我在复制粘贴代码时 忘记修改 后面的语句了 IDEA 给我了一个这样的提示
switch 表达式中存在错误类型: void 无法转换为 java.lang.String
- 而
System.out.println("唐文昊");
的方法返回值 正是 void 于是有了以下代码
public static String backJson() {String text = """{"username": "小黑说Java","password": "TR5#q659","mailbox": "db58@96sn.vip"}""";return text;}public static void outsideSwitchTest(String id) {String text = switch (id) {default -> backJson();};System.out.println(text);}public static void main(String[] args) {outsideSwitchTest("");}
- 而运行结果正是
{"username": "小黑说Java","password": "TR5#q659","mailbox": "db58@96sn.vip"
}
- 也可以直接省略赋值动作直接打印。
public static void switchTest(String id) {System.out.println(switch (id) {case "1", "2" -> "赵雅涵";case "3", "4" -> "顾晨涵";default -> "黎润莎";});
}public static void main(String[] args) {switchTest("");
}
- 如果你想在case里想做不止一件事,比如在返回之前先进行一些计算或者打印操作,可以通过大括号来作为case块,最后的返回值使用关键字yield进行返回。
private static void withYield(Fruit fruit) {String text = switch (fruit) {case APPLE, PEAR -> {System.out.println("给的水果是: " + fruit);yield "普通水果";}case MANGO, AVOCADO -> "进口水果";default -> "未知水果";};System.out.println(text);
}
- 这是参考链接中的代码 但是 作为原创 又怎么可能 不改改呢
- 那么就 修改 亿点点 吧
private static class User {String username;String password;String sex;String age;String school_address;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getSchool_address() {return school_address;}public void setSchool_address(String school_address) {this.school_address = school_address;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", sex='" + sex + '\'' +", age='" + age + '\'' +", school_address='" + school_address + '\'' +'}';}}public static void switchTest(String id) {User user = switch (id) {case "1" -> {System.out.println("1");ArrayList<User> userArrayList = new ArrayList<>();userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());yield userArrayList.get(3);}default -> throw new IllegalStateException("Unexpected value: " + id);};System.out.println("user = " + user);System.out.println("user.toString() = " + user.toString());}public static void main(String[] args) {switchTest("1");}
- 回到 参考链接
- 当然也可以直接使用yield返回结果。
private static void oldStyleWithYield(Fruit fruit) {System.out.println(switch (fruit) {case APPLE, PEAR:yield "普通水果";case MANGO, AVOCADO:yield "进口水果";default:yield "未知水果";});
}
- 然后我又有了 亿点点 想法 那就再次 修改 亿点点
public static void switchTest(String id) {User user = switch (id) {case "1" -> {System.out.println("user");ArrayList<User> userArrayList = new ArrayList<>();userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());yield userArrayList.get(3);}default -> throw new IllegalStateException("Unexpected value: " + id);};System.out.println("user = " + user);System.out.println("user.toString() = " + user.toString());ArrayList<User> userArrayList =switch (id) {case "1" -> {ArrayList<User> users = new ArrayList<>();System.out.println("userArrayList");users.add(new User());users.add(new User());yield users;}default -> throw new IllegalStateException("Unexpected value: " + id);};System.out.println("userArrayList = " + userArrayList);}public static void main(String[] args) {switchTest("1");}
- 输出结果
user
user = User{username='null', password='null', sex='null', age='null', school_address='null'}
user.toString() = User{username='null', password='null', sex='null', age='null', school_address='null'}
userArrayList
userArrayList = [User{username='null', password='null', sex='null', age='null', school_address='null'}, User{username='null', password='null', sex='null', age='null', school_address='null'}]
- 最后 整个 代码
package com.codervibe;import java.util.ArrayList;
import java.util.List;public class Test {public static void printJson() {String text = """{"username": "小黑说Java","password": "TR5#q659","mailbox": "db58@96sn.vip"}""";System.out.println(text);}public static void switchTest2(String id) {String text = switch (id) {case "1", "2" -> "白汝鑫";case "3", "4" -> "邱凌晶";default -> "袁文轩";};System.out.println(text);}public static String backJson() {String text = """{"username": "小黑说Java","password": "TR5#q659","mailbox": "db58@96sn.vip"}""";return text;}public static void outsideSwitchTest(String id) {String text = switch (id) {default -> backJson();};System.out.println(text);}private static class User {String username;String password;String sex;String age;String school_address;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getSchool_address() {return school_address;}public void setSchool_address(String school_address) {this.school_address = school_address;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", sex='" + sex + '\'' +", age='" + age + '\'' +", school_address='" + school_address + '\'' +'}';}}public static void switchTest(String id) {User user = switch (id) {case "1" -> {System.out.println("user");ArrayList<User> userArrayList = new ArrayList<>();userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());userArrayList.add(new User());yield userArrayList.get(3);}default -> throw new IllegalStateException("Unexpected value: " + id);};System.out.println("user = " + user);System.out.println("user.toString() = " + user.toString());ArrayList<User> userArrayList =switch (id) {case "1" -> {ArrayList<User> users = new ArrayList<>();System.out.println("userArrayList");users.add(new User());users.add(new User());yield users;}default -> throw new IllegalStateException("Unexpected value: " + id);};System.out.println("userArrayList = " + userArrayList);}public static void main(String[] args) {switchTest("1");}}
为了方便后续的学习 在此 插入 使用 Maven 项目 中的 pom.xml 文件中 引入 lombok 以及 junit 测试
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.codervibe</groupId><artifactId>Newfeature</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.1</version></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope></dependency></dependencies></project>
Java 17 新特性 - record关键字
- record用于创建不可变的数据类。在这之前如果你需要创建一个存放数据的类,通常需要先创建一个Class,然后生成构造方法、getter、setter、hashCode、equals和toString等这些方法,或者使用Lombok来简化这些操作。
- 比如定义一个Person类:
// 这里使用lombok减少代码
@Data
@AllArgsConstructor
public class Person {private String name;private int age;private String address;
}
- 我们来通过Person类做一些测试,比如创建两个对象,对他们进行比较,打印这些操作。
public static void testPerson() {Person p1 = new Person("小黑说Java", 18, "北京市西城区");Person p2 = new Person("小白说Java", 28, "北京市东城区");System.out.println(p1);System.out.println(p2);System.out.println(p1.equals(p2));
}
- 假设有一些场景我们只需要对Person的name和age属性进行打印,在有record之后将会变得非常容易。
package com.codervibe;import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test;
public class testPerson {// 这里使用lombok减少代码@Data@AllArgsConstructorpublic static class Person {private String name;private int age;private String address;}@Testpublic void testPerson() {Person p1 = new Person("胡欣怡", 18, "贵州省遵义市习水县醒民镇");Person p2 = new Person("石子辰", 28, "河北省邢台市内丘县侯家庄乡");// 使用record定义record PersonRecord(String name,int age){}PersonRecord p1Record = new PersonRecord(p1.getName(), p1.getAge());PersonRecord p2Record = new PersonRecord(p2.getName(), p2.getAge());System.out.println(p1Record);System.out.println(p2Record);}
}
- 在改造 亿点点
@Testpublic void testPerson() {Person p1 = new Person("胡欣怡", 18, "贵州省遵义市习水县醒民镇");Person p2 = new Person("石子辰", 28, "河北省邢台市内丘县侯家庄乡");// 使用 record 定义record PersonRecord(String name,int age){}PersonRecord p1Record = new PersonRecord(p1.getName(), p1.getAge());PersonRecord p2Record = new PersonRecord(p2.getName(), p2.getAge());System.out.println(p1Record);System.out.println(p2Record);// 要怎么改下呢ArrayList<Person> personArrayList=new ArrayList<>();personArrayList.add(p1);personArrayList.add(p2);record personArrayList(String name,int age){}personArrayList personArrayList1 = new personArrayList(personArrayList.get(0).getAddress(),personArrayList.get(1).getAge());System.out.println("personArrayList1 = " + personArrayList1);}//结合之前的 特性 可以造出什么呢?这就要看你们的了
- record也可以单独定义作为一个文件定义,但是因为Record的使用非常紧凑,所以可以直接在需要使用的地方直接定义。
package com.codervibe;public record PersonRecord(String name,int age) {
}
- record同样也有构造方法,可以在构造方法中对数据进行一些验证操作。
public static void testPerson() {Person p1 = new Person("卢欣宜", 18, "福建省南平市建阳区黄坑镇");Person p2 = new Person("廖林", 28, "内蒙古自治区阿拉善盟额济纳旗东风街道");record PersonRecord(String name, int age) {// 构造方法PersonRecord {System.out.println("name " + name + " age " + age);if (name == null) {throw new IllegalArgumentException("姓名不能为空");}}}PersonRecord p1Record = new PersonRecord(p1.getName(), p1.getAge());PersonRecord p2Record = new PersonRecord(p2.getName(), p2.getAge());
}
- 输出结果为
name 卢欣宜 age 18
name 廖林 age 28
Java 17 新特性 - 密封类 sealed class
-
密封类可以让我们更好的控制哪些类可以对我定义的类进行扩展。密封类可能对于框架或中间件的开发者更有用。在这之前一个类要么是可以被extends的,要么是final的,只有这两种选项。
-
密封类可以控制有哪些类可以对超类进行继承,在Java 17之前如果我们需要控制哪些类可以继承,可以通过改变类的访问级别,比如去掉类的public,访问级别为默认。比如我们在com.heiz.java11包中定义了如下的三个类:
package com.heiz.java11;
public abstract class Furit {
}
public class Apple extends Furit {
}
public class Pear extends Furit {
}
- 那么我们可以在另一个包com.heiz123.java11中写如下的代码:
private static void test() {Apple apple = new Apple();Pear pear = new Pear();Fruit fruit = apple;class Avocado extends Fruit {};
}
- 既可以定义Apple,Pear,也可以将apple实例赋值给Fruit,并且可以对Fruit进行继承。
- 如果我们不想让Fruit在com.heiz.java11包以外被扩展,在Java11版本中只能改变访问权限,去掉class的public修饰符。这样虽然可以控制被被继承,但是也会导致Fruit fruit = apple;也编译失败;在Java 17中通过密封类可以解决这个问题。
package com.heiz.java17;public abstract sealed class Furit permits Apple,Pear {
}
public non-sealed class Apple extends Furit {
}
public final class Pear extends Furit {}
- 在定义Furit时通过关键字sealed声明为密封类,通过permits可以指定Apple,Pear类可以进行继承扩展。子类需要指明它是final,non-sealed或sealed的。父类不能控制子类是否可以被继承。
private static void test() {Apple apple = new Apple();Pear pear = new Pear();// 可以将apple赋值给FruitFruit fruit = apple;// 只能继承Apple,不能继承Furitclass Avocado extends Apple {};
}
相关文章:

JDK 17 新特性 (一)
既然 Springboot 3.0 强制使用 JDK 17 那就看看 JDK17 有哪些新特性吧 参考链接 介绍一下 新特性的历史渊源 JDK 17是Java Development Kit(JDK)的一个版本,它是Java编程语言的一种实现。JDK 17于2021年9月14日发布,并作为Java …...

杨中科 ASP.NET DI综合案例
综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…...

蓝桥杯嵌入式第12届真题(完成) STM32G431
蓝桥杯嵌入式第12届真题(完成) STM32G431 题目 程序 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**************************…...

C#系列-多线程(4)
在C#中,多线程编程主要涉及使用System.Threading命名空间下的类和接口来创建和管理线程。以下是一些C#多线程编程的基本用法和示例: 1. 使用Thread类创建线程 csharp代码 using System; using System.Threading; class Program { static void …...

VS如何调试C运行时库
C运行时库(简称crt)是C标准库等组件的基础, 其会在进入main函数之前运行一些代码, 包括但不限于初始化堆栈, 内存分配等操作 这些代码是可以随着VC工具集一起安装到我们本地的。看一下这个情况, 就是VS调试器没找到对应的crt源码的情况, 调用堆栈是空的。为了解决这个问…...

软件工程师,超过35岁怎么办
概述 随着科技行业的飞速发展,软件开发工程师的职业道路充满了各种机遇和挑战。对于已经在这个行业摸爬滚打了十多年的软件开发工程师来说,当他们步入35岁这个年纪时,可能会感到一些迷茫和焦虑。许多人担忧,在以创新、活力、快速迭…...

通过 Prometheus 编写 TiDB 巡检脚本(脚本已开源,内附链接)
作者丨 caiyfc 来自神州数码钛合金战队 神州数码钛合金战队是一支致力于为企业提供分布式数据库 TiDB 整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景,全部拥有 TiDB 高级资格证书,并活跃于 TiDB 开源社区,是官方认证合作伙…...

sql语句学习(一)--查询
【有道云笔记】基本sql语句2—查询基础 数据库表结构 DROP TABLE IF EXISTS class; CREATE TABLE class (id int(11) NOT NULL AUTO_INCREMENT,class_num varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 班级号,class_name varchar(255) CHARACTE…...

【HTML】交友软件上照片的遮罩是如何做的
笑谈 我不知道大家有没有在夜深人静的时候感受到孤苦难耐,🐶。于是就去下了一些交友软件来排遣寂寞。可惜的是,有些交友软件真不够意思,连一些漂亮小姐姐的图片都要进行遮罩,完全不考虑兄弟们的感受,😠。所…...

【Java EE初阶十二】网络编程TCP/IP协议(一)
1. 网络编程 通过网络,让两个主机之间能够进行通信->就这样的通信来完成一定的功能,进行网络编程的时候,需要操作系统给咱们提供一组API,通过这些API来完成编程;API可以认为是应用层和传输层之间交互的路径…...

element-ui解决上传文件时需要携带请求数据的问题
一、问题描述 在前端使用element-ui进行文件上传时,需要携带请求头信息,比如Token。 二、问题解决 1. 表单实现 action置空添加:http-request属性覆盖默认的上传行为,实现自定义上传文件。注意:src后的图片路径如果是个网络请求(外链)&…...

【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024
AI视野今日CS.NLP 自然语言处理论文速览 Thu, 18 Jan 2024 Totally 35 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deciphering Textual Authenticity: A Generalized Strategy through the Lens of Large Language Semantics …...

Docker容器运行
1、通过--name参数显示地为容器命名,例如:docker run --name “my_http_server” -d httpd 2、容器重命名可以使用docker rename。 3、两种进入容器的方法: 3.1、Docker attach 例如: 每间隔一秒打印”Hello World”。 Sudo docker run…...

【计算机网络】网络层之IP协议
文章目录 1.基本概念2.协议头格式3.网段划分4.特殊的IP地址5.IP地址的数量限制6.私有IP地址和公网IP地址7.路由 1.基本概念 IP地址是定位主机的,具有一个将数据报从A主机跨网络可靠的送到B主机的能力。 但是有能力就一定能做到吗,只能说有很大的概率。…...

2024/2/17 图论 最短路入门 dijkstra 1
目录 算法思路 Dijkstra求最短路 AcWing 849. Dijkstra求最短路 I - AcWing 850. Dijkstra求最短路 II - AcWing题库 最短路 最短路 - HDU 2544 - Virtual Judge (vjudge.net) 【模板】单源最短路径(弱化版) P3371 【模板】单源最短路径…...

交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)
交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计…...

最适合初学者的Python入门详细攻略,一文讲清,赶紧收藏!
前言 目前python可以说是一门非常火爆的编程语言,应用范围也非常的广泛,工资也挺高,未来发展也极好。 Python究竟应该怎么学呢,我自己最初也是从零基础开始学习Python的,给大家分享Python的学习思路和方法。一味的买…...

幻兽帕鲁新手游戏攻略分享
在幻兽帕鲁中,提高实力是玩家不断追求的目标。以下是一些提高实力的攻略: 1、升级和进化:通过战斗和完成任务,玩家可以获得经验值,提升自己的等级。随着等级的提升,玩家可以获得技能点,用于提升…...

代码随想录算法训练营DAY19 | 二叉树 (6)
一、LeetCode 654 最大二叉树 题目链接:654.最大二叉树https://leetcode.cn/problems/maximum-binary-tree/ 思路:坚持左开右闭原则,递归划分数组元素生成左右子树。 class Solution {public TreeNode constructMaximumBinaryTree(int[] num…...

【C++】实现Date类的各种运算符重载
上一篇文章只实现了operator操作符重载,由于运算符较多,该篇文章单独实现剩余所有的运算符重载。继续以Date类为例,实现运算符重载: 1.Date.h #pragma once#include <iostream> #include <assert.h>using namespace …...

【Linux】程序地址空间 -- 详解 Linux 2.6 内核进程调度队列 -- 了解
一、程序地址空间回顾 在学习 C/C 时,我们知道内存会被分为几个区域:栈区、堆区、全局/静态区、代码区、字符常量区等。但这仅仅是在语言层面上的理解,是远远不够的。 如下空间布局图,请问这是物理内存吗? 不是&…...

10-通用类型、特质和生命周期
上一篇: 09-错误处理 每种编程语言都有有效处理概念重复的工具。在 Rust 中,泛型就是这样一种工具:具体类型或其他属性的抽象替身。我们可以表达泛型的行为或它们与其他泛型的关系,而不需要知道在编译和运行代码时它们的位置。 函…...

STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)
频率变小,周期变长 1,参考链接(重要) STM32CubeMX——定时器之定时功能(学习使用timer定时器的设置) STM32测量PWM信息(学习使用设置pwm输入捕获) 通用定时器中两个重要参数的设置心…...

蓝桥杯:C++队列、优先队列、链表
C普通队列 算法竞赛中一般用静态数组来模拟队列,或者使用STL queue。使用C的STL queue时,由于不用自己管理队列,因此代码很简洁。队列的部分操作如下。 C优先队列 很多算法需要用到一种特殊的队列:优先队列。它的特点是最优数据…...

【C语言】长篇详解,字符系列篇1-----“混杂”的各种字符类型字符转换和strlen的模拟实现【图文详解】
欢迎来CILMY23的博客喔,本期系列为【C语言】长篇详解,字符系列篇1-----“混杂”的各种字符函数……,图文讲解各种字符函数,带大家更深刻理解C语言中各种字符函数的应用,感谢观看,支持的可以给个赞哇。 前言…...

2024年【高处安装、维护、拆除】考试总结及高处安装、维护、拆除考试技巧
题库来源:安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除考试总结根据新高处安装、维护、拆除考试大纲要求,安全生产模拟考试一点通将高处安装、维护、拆除模拟考试试题进行汇编,组成一套高处安装、维护、拆除全真模拟考试试题&a…...

开源无处不在,发展创新下又有何弊端
随着信息技术的快速发展,开源软件已经成为软件开发的趋势,并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点,使得越来越多的企业和个人选择使用开源软件,促进了软件行业的繁荣。然而,在使用开源软件的过…...

LeetCode 0429.N 叉树的层序遍历:广度优先搜索(BFS)
【LetMeFly】429.N 叉树的层序遍历:广度优先搜索(BFS) 力扣题目链接:https://leetcode.cn/problems/n-ary-tree-level-order-traversal/ 给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)…...

Practical User Research for Enterprise UX
2.1 Why It’s Hard to Get Support for Research in Enterprises 2.1.1 Time and Budget Instead of answering the question “What dowe gain if we do this research?”, ask instead “What do we stand to lose if we don’t do the research?” 2.1.2 Legacy Thinkin…...

文生视频:Sora模型报告总结
作为世界模拟器的视频生成模型 我们探索视频数据生成模型的大规模训练。具体来说,我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用对视频和图像潜在代码的时空补丁进行操作的变压器架构。我们最大的模型 Sora 能够生成一分钟…...