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

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的一部分,它引入了许多新的特性和改进。这些新特性包括:

    1. 类型模式匹配:引入了新的模式匹配语法,使得开发者能够更方便地对不同的模式进行匹配和处理。

    2. 垃圾收集器:引入了一种新的垃圾收集器,名为ZGC(Z Garbage Collector),它提供了更低延迟和更高吞吐量的垃圾收集。

    3. 向量API:引入了一种新的向量API,允许开发者使用向量化数据处理指令来加速并行计算。

    4. Sealed类:引入了Sealed类的概念,它限制了某些类的继承和实现,从而提供更强的封装和安全性。

    5. Pattern Matching for switch:扩展了switch语句的功能,使其更灵活和易用。

    6. 预览功能:引入了一些预览功能,包括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);
}
  • 这种方式定义具有几个问题:
    1. 双引号需要进行转义;
    2. 为了字符串的可读性需要通过+号连接;
    3. 如果需要将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&#xff08;JDK&#xff09;的一个版本&#xff0c;它是Java编程语言的一种实现。JDK 17于2021年9月14日发布&#xff0c;并作为Java …...

杨中科 ASP.NET DI综合案例

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

蓝桥杯嵌入式第12届真题(完成) STM32G431

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

C#系列-多线程(4)

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

VS如何调试C运行时库

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

软件工程师,超过35岁怎么办

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

通过 Prometheus 编写 TiDB 巡检脚本(脚本已开源,内附链接)

作者丨 caiyfc 来自神州数码钛合金战队 神州数码钛合金战队是一支致力于为企业提供分布式数据库 TiDB 整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景&#xff0c;全部拥有 TiDB 高级资格证书&#xff0c;并活跃于 TiDB 开源社区&#xff0c;是官方认证合作伙…...

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】交友软件上照片的遮罩是如何做的

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

【Java EE初阶十二】网络编程TCP/IP协议(一)

1. 网络编程 通过网络&#xff0c;让两个主机之间能够进行通信->就这样的通信来完成一定的功能&#xff0c;进行网络编程的时候&#xff0c;需要操作系统给咱们提供一组API&#xff0c;通过这些API来完成编程&#xff1b;API可以认为是应用层和传输层之间交互的路径&#xf…...

element-ui解决上传文件时需要携带请求数据的问题

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

【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024

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

Docker容器运行

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

【计算机网络】网络层之IP协议

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

2024/2/17 图论 最短路入门 dijkstra 1

目录 算法思路 Dijkstra求最短路 AcWing 849. Dijkstra求最短路 I - AcWing 850. Dijkstra求最短路 II - AcWing题库 最短路 最短路 - HDU 2544 - Virtual Judge (vjudge.net) 【模板】单源最短路径&#xff08;弱化版&#xff09; P3371 【模板】单源最短路径&#xf…...

交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)

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

最适合初学者的Python入门详细攻略,一文讲清,赶紧收藏!

前言 目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广泛&#xff0c;工资也挺高&#xff0c;未来发展也极好。 Python究竟应该怎么学呢&#xff0c;我自己最初也是从零基础开始学习Python的&#xff0c;给大家分享Python的学习思路和方法。一味的买…...

幻兽帕鲁新手游戏攻略分享

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

代码随想录算法训练营DAY19 | 二叉树 (6)

一、LeetCode 654 最大二叉树 题目链接&#xff1a;654.最大二叉树https://leetcode.cn/problems/maximum-binary-tree/ 思路&#xff1a;坚持左开右闭原则&#xff0c;递归划分数组元素生成左右子树。 class Solution {public TreeNode constructMaximumBinaryTree(int[] num…...

【C++】实现Date类的各种运算符重载

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

【Linux】程序地址空间 -- 详解 Linux 2.6 内核进程调度队列 -- 了解

一、程序地址空间回顾 在学习 C/C 时&#xff0c;我们知道内存会被分为几个区域&#xff1a;栈区、堆区、全局/静态区、代码区、字符常量区等。但这仅仅是在语言层面上的理解&#xff0c;是远远不够的。 如下空间布局图&#xff0c;请问这是物理内存吗&#xff1f; 不是&…...

10-通用类型、特质和生命周期

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

STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)

频率变小&#xff0c;周期变长 1&#xff0c;参考链接&#xff08;重要&#xff09; STM32CubeMX——定时器之定时功能&#xff08;学习使用timer定时器的设置&#xff09; STM32测量PWM信息&#xff08;学习使用设置pwm输入捕获&#xff09; 通用定时器中两个重要参数的设置心…...

蓝桥杯:C++队列、优先队列、链表

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

【C语言】长篇详解,字符系列篇1-----“混杂”的各种字符类型字符转换和strlen的模拟实现【图文详解】

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

2024年【高处安装、维护、拆除】考试总结及高处安装、维护、拆除考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除考试总结根据新高处安装、维护、拆除考试大纲要求&#xff0c;安全生产模拟考试一点通将高处安装、维护、拆除模拟考试试题进行汇编&#xff0c;组成一套高处安装、维护、拆除全真模拟考试试题&a…...

开源无处不在,发展创新下又有何弊端

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

LeetCode 0429.N 叉树的层序遍历:广度优先搜索(BFS)

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

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模型报告总结

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

GA 374-2019 电子防盗锁检测

电子防盗锁是指以电子方式识别&#xff0c;处理相关信息并控制执行机构实施启闭且达到规定安全级别的锁具。 GA 374-2019 电子防盗锁检测项目 测试项目 测试标准 外观 GA 374 外壳防护等级 GA 374 功能 GA 374 编码组合数 GA 374 主锁舌伸出长度 GA 374 主锁舌灵活…...

代码随想录day26 Java版

今天开始刷贪心算法&#xff0c;新手保护期中爽得一批 455.分发饼干 先把两个数组排序&#xff0c;采用先满足胃口小的孩子&#xff0c;饼干数组无条件向后扫描&#xff0c;能满足孩子后再向后扫描胃口数组 class Solution {public int findContentChildren(int[] g, int[] …...

英文论文(sci)解读复现【NO.21】一种基于空间坐标的轻量级目标检测器无人机航空图像的自注意

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…...

数据集合

目录 并集 union union all 区别 交集 intersect 差集 minus 错误操作 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 常用的数学集合有&#xff1a;交集、并集、差集、补集 每一次查询实际上都会返回数据集合&#xff0c;…...

php基础学习之作用域和静态变量

作用域 变量&#xff08;常量&#xff09;能够被访问的区域&#xff0c;变量可以在常规代码中定义&#xff0c;也可以在函数内部定义 变量的作用域 在 PHP 中作用域严格来说分为两种&#xff0c;但是 PHP内部还定义一些在严格意义之外的一种&#xff0c;所以总共算三种—— 局部…...

SP1:基于Plonky3构建的zkVM

1. 引言 SP1为SuccictLab开源的&#xff0c;基于Plonky3构建的zkVM。 开源代码见&#xff1a; https://github.com/succinctlabs/sp1&#xff08;Rust&#xff09; 当前暂未实现onchain-verifier&#xff0c;但会采用标准的STARK->SNARK verifier。 SP1 zkVM基于的指令…...

Python爬虫之文件存储#5

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 文件存储形式多种多样&#xff0c;比如可以保存成 TXT 纯文本形式&#xff0c;也可以保存为 JSON 格式、CSV 格式等&#xff0c;本节就来了解一下文本文件的存储方式。 TXT 文本存储 将数据保存到 TXT 文本的操作非常简单&am…...

Spring Boot 笔记 012 创建接口_添加文章分类

1.1.1 实体类添加校验 package com.geji.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称NotEmptypriva…...

Spring-面试题

一、Spring 1、Spring的优势 通过IOC、AOP简化java开发 IOC减低业务对象替换的复杂性,降低耦合AOP允许将一些通用的事务、日志进行集中处理,从而提高更好的复用性Spring生态圈低嵌入式涉及,代码污染小高度开放性,用的人多2、Spring的核心 IOC控制反转: Spring容器为我们创…...

Flink理论—容错之状态

Flink理论—容错之状态 在 Flink 的框架中&#xff0c;进行有状态的计算是 Flink 最重要的特性之一。所谓的状态&#xff0c;其实指的是 Flink 程序的中间计算结果。Flink 支持了不同类型的状态&#xff0c;并且针对状态的持久化还提供了专门的机制和状态管理器。 Flink 使用…...

【数据结构】链表OJ面试题5《链表的深度拷贝》(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 给定一个链表&#xff0c;返回链表开始入环的第一个结点。 如果链表无环&#xff0c;则返回 NULLhttp://t.cs…...

智慧校园规划建设方案

校园信息化建设呈现智能化、应用多样化发展趋势&#xff0c;多种技术和应用交叉渗透至校园生活的各个方面&#xff0c;全面的智慧校园时代已经到来。 对智慧校园的四大应用领域分析 智慧的教学 信息共享交互&#xff1a;建立信息发布、共享、传播与交互的公共平台 教学流程…...

003 - Hugo, 创建文章

003 - Hugo, 创建文章创建文章单个md文件md文件图片总结 文章内容Front Matter文章目录数学公式的显示KaTeXMathJax 图片 003 - Hugo, 创建文章 创建文章 单个md文件 创建文章的方式&#xff1a; 手动创建&#xff1a;在post目录下&#xff0c;手动创建md文件。命令创建&am…...

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-GPIO

目录 一、GPIO 概述二、GPIO模块相关API三、实例四、GPIO HDF驱动开发4.1、LED驱动程序(待续...)4.2、LED驱动配置(待续...) 坚持就有收获 轻量系统设备通常需要进行外设控制&#xff0c;例如温湿度数据的采集、灯开关的控制&#xff0c;因此在完成内核开发后&#xff0c;需要进…...

《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)

文章目录 7.1 网络基础和 Java 中的网络 - 揭开神秘的面纱7.1.1 基础知识7.1.2 重点案例&#xff1a;实现一个简单的聊天程序7.1.3 拓展案例 1&#xff1a;使用 UDP 进行消息广播7.1.4 拓展案例 2&#xff1a;建立一个简单的 Web 服务器 7.2 创建客户端和服务器 - 构建沟通的桥…...

用keras对电影评论进行情感分析

文章目录 下载IMDb数据读取IMDb数据建立分词器将评论数据转化为数字列表让转换后的数字长度相同加入嵌入层建立多层感知机模型加入平坦层加入隐藏层加入输出层查看模型摘要 训练模型评估模型准确率进行预测查看测试数据预测结果完整函数用RNN模型进行IMDb情感分析用LSTM模型进行…...

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即…...

110 C++ decltype含义,decltype 主要用途

一&#xff0c;decltype 含义和举例 decltype有啥返回啥&#xff0c;auto则不一样&#xff0c;auto可能会舍弃一些东西。 decltype 是 C11提出的说明符。主要作用是&#xff1a;返回操作数的数据类型。 decltype 是用来推导类型&#xff0c;decltype对于一个给定的 变量名或…...

PYTHON 120道题目详解(85-87)

85.Python中如何使用enumerate()函数获取序列的索引和值&#xff1f; enumerate()函数是Python的内置函数&#xff0c;它可以将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在for循环当中。 以下是一个…...

【Linux】Linux编译器-gcc/g++ Linux项目自动化构建工具-make/Makefile

目录 Linux编译器-gcc/g使用 1.背景知识 Linux中头文件的目录在 Linux 库 条件编译的典型应用 2.gcc如何完成 动态库 vs 静态库 debug && release Linux项目自动化构建工具-make/Makefile 背景 用法 特殊符号 Linux编译器-gcc/g使用 1.背景知识 预处理&am…...