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

深入了解 Java 中的时间信息定义、转换、比较和操作

1. 简介

在过去的传统Java日期处理中,经常面临着一些问题。比如,java.util.Datejava.util.Calendar在表示日期和时间时存在着一些奇怪的行为,如月份从0开始计数、对日期进行格式化的方式繁琐不直观等。这些问题给开发带来了一定的困扰。

随着Java 8的发布,引入了全新的时间API —— java.time包,这个新的API提供了更加直观和易用的方式来处理日期和时间。它以更加语义化的方式来表示日期、时间和时间间隔,并提供了丰富的操作方法和函数,使得我们在处理日期和时间时更加方便和高效。

2. 常用时间信息定义方法

2.1.java.util.Date类的使用

在早期的 Java 中,使用java.util.Date类来表示日期和时间是很常见的。

import java.util.Date;public class DateExample {public static void main(String[] args) {Date date = new Date();System.out.println("当前日期和时间: " + date);}
}

然而,这个类在设计上存在一些问题,导致了它的使用变得麻烦和容易出错。

问题之一是java.util.Date类在表示月份时从0开始计数,这与我们通常的理解不符。例如,如果我们想表示1月份,我们需要传入0作为月份的参数,这容易引起误解和错误。

另一个问题是java.util.Date类中的很多方法已经被废弃不建议使用。例如,获取年份需要使用getYear()方法,但它返回的是相对于1900年的偏移值。此外,Date类还不是线程安全的,这意味着在多线程环境下使用时需要额外的同步措施。

下面是一个示例代码,展示了如何创建和操作java.util.Date类对象:

import java.util.Date;public class DateExample {public static void main(String[] args) {// 创建一个当前时间的 Date 对象Date currentDate = new Date();// 获取年份(需要加上1900)int year = currentDate.getYear() + 1900;// 获取月份(需要加上1)int month = currentDate.getMonth() + 1;// 获取日期int day = currentDate.getDate();// 打印日期信息System.out.println("Current Date: " + year + "-" + month + "-" + day);}
}

2.2.java.util.Calendar 类的使用

为了弥补java.util.Date类的不足,Java引入了java.util.Calendar类来处理日期和时间。Calendar类提供了一系列的方法,用于获取和修改年、月、日、时、分、秒等字段。

然而,Calendar类的使用也存在一些问题。首先,它是一个抽象类,不能直接实例化,需要通过Calendar.getInstance()方法获取其实例。其次,月份还是从0开始计数,导致与人们的理解不一致。此外,Calendar类也不是线程安全的,需要额外的同步措施。

下面是一个示例代码,展示了如何使用java.util.Calendar类来获取和修改日期信息:

import java.util.Calendar;
import java.util.Date;public class CalendarExample {public static void main(String[] args) {// 获取当前日期和时间的 Calendar 对象Calendar calendar = Calendar.getInstance();// 获取年份int year = calendar.get(Calendar.YEAR);// 获取月份(需要加上1)int month = calendar.get(Calendar.MONTH) + 1;// 获取日期int day = calendar.get(Calendar.DAY_OF_MONTH);// 打印日期信息System.out.println("Current Date: " + year + "-" + month + "-" + day);// 获取小时int hour = calendar.get(Calendar.HOUR_OF_DAY);// 获取分钟int minute = calendar.get(Calendar.MINUTE);// 获取秒int second = calendar.get(Calendar.SECOND);// 打印时间信息System.out.println("Current Time: " + hour + "-" + minute + "-" + second);// 修改月份为下个月calendar.add(Calendar.MONTH, 1);// 获取修改后的日期信息int updatedMonth = calendar.get(Calendar.MONTH) + 1;int updatedDay = calendar.get(Calendar.DAY_OF_MONTH);// 打印修改后的日期信息System.out.println("Updated Date: " + year + "-" + updatedMonth + "-" + updatedDay);}
}

2.3.新的时间 API(java.time 包)的介绍

为了解决java.util.Datejava.util.Calendar的问题,Java 8引入了新的时间 API java.time包。这个新的API为处理日期和时间提供了更直观和易用的方式。

java.time包中的核心类包括:

  • LocalDate:用于表示日期,不包含具体时间和时区信息;
  • LocalTime:用于表示时间,不包含日期和时区信息;
  • LocalDateTime:用于表示日期和时间,不包含时区信息;
  • ZonedDateTime:用于表示带有时区的日期和时间。

下面是一个示例代码,展示了如何使用新的时间 API 来创建和操作日期和时间:

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;public class DateTimeExamples {public static void main(String[] args) {// 使用新的时间 API 创建日期对象LocalDate date = LocalDate.now();System.out.println("当前日期: " + date); // 使用新的时间 API 创建时间对象LocalTime time = LocalTime.now();System.out.println("当前时间: " + time); // 使用新的时间 API 创建日期和时间对象LocalDateTime dateTime = LocalDateTime.now();System.out.println("当前日期和时间: " + dateTime); // 使用新的时间 API 创建带时区的日期和时间对象ZonedDateTime zonedDateTime = ZonedDateTime.now();System.out.println("当前带时区的日期和时间: " + zonedDateTime);// 使用 java.sql.Date 表示日期Date sqlDate = Date.valueOf(date);System.out.println("java.sql.Date: " + sqlDate);// 使用 java.sql.Time 表示时间Time sqlTime = Time.valueOf(time);System.out.println("java.sql.Time: " + sqlTime); // 使用 java.sql.Timestamp 表示时间戳(包含日期和时间)Timestamp timestamp = Timestamp.valueOf(dateTime);System.out.println("java.sql.Timestamp: " + timestamp); // 自定义时间LocalDateTime dateTime1 = LocalDateTime.of(2023, 10, 12, 8, 0, 0);System.out.println(" 自定义LocalDateTime时间: " + dateTime1); }
}

通过新的时间 API,我们可以直接创建表示日期、时间、日期和时间以及时区的对象,并进行各种操作,如日期比较、日期加减等。这使得我们在处理日期和时间时更加直观和便利。

2.3.1.取时间

import java.time.LocalDateTime;
import java.time.Month;public class InfoExamples {public static void main(String[] args)  {// 当前时间LocalDateTime now = LocalDateTime.now();// 取年份int year = now.getYear();System.out.println("年份year = " + year);// 取月份名Month month = now.getMonth();System.out.println("月份名month = " + month);// 取月份int monthValue = now.getMonthValue();System.out.println("月份monthValue = " + monthValue);// 取日期int dayOfMonth = now.getDayOfMonth();System.out.println("dayOfMonth = " + dayOfMonth);// 取 24小时制小时int hour = now.getHour();System.out.println("hour = " + hour);// 取分钟int minute = now.getMinute();System.out.println("minute = " + minute);// 取秒int second = now.getSecond();System.out.println("second = " + second);}
}

3. 时间戳的概念与使用

3.1.时间戳

时间戳是一种表示从某个特定时间起至今所经过的时间的方式。它通常以整数或浮点数的形式表示,并在不同的编程语言和数据库中具有不同的实现方式。时间戳被广泛用于记录事件的先后顺序、进行时间的比较和排序、计算时间间隔等操作。

在Java中,时间戳通常使用 java.util.Datejava.time.Instant 类型来表示。以下是关于时间戳概念和使用的一些重点说明:

3.1.1.java.util.Date 的时间戳

java.util.Date 类中的 getTime() 方法可以获取自1970年1月1日00:00:00 UTC(协调世界时)以来的毫秒数形式的时间戳。这个时间戳可以作为一个长整型数值进行存储或传递。下面是一个示例代码:

import java.util.Date;public class TimestampExample {public static void main(String[] args) {Date now = new Date();long timestamp = now.getTime();System.out.println("时间戳: " + timestamp);}
}

3.1.2.java.time.Instant 的时间戳

在新的时间 API(java.time 包)中,java.time.Instant 类提供了更加简洁和易用的方式来表示时间戳。我们可以使用 Instant.now() 方法获取当前时间的时间戳,并使用 toEpochMilli() 方法将其转换为毫秒数形式的时间戳。以下是一个示例代码:

import java.time.Instant;public class InstantExample {public static void main(String[] args) {Instant now = Instant.now();long timestamp = now.toEpochMilli();System.out.println("时间戳: " + timestamp);}
}

3.1.3.当前时间戳转时间类型

时间戳的使用方式:
时间戳可以用于各种操作,如时间的比较、排序、存储或传输。在进行时间比较时,可以简单地通过比较两个时间戳的数值来确定它们的先后顺序。时间戳的另一个重要用途是计算时间间隔,可以通过相减两个时间戳的数值来获取它们之间的毫秒数差值。

需要注意的是,时间戳通常是以格林尼治标准时间(GMT)或协调世界时(UTC)为基准的,因此在使用时间戳时应注意时区的转换和处理。

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;public class TimestampExample {public static void main(String[] args)  {// 获取当前时间的时间戳long timestamp = System.currentTimeMillis();System.out.println("当前时间戳:" + timestamp);// 将时间戳转换为日期对象Date date = new Date(timestamp);System.out.println("时间戳转换为日期对象:" + date);// 将时间戳转换为本地日期时间对象Instant instant = Instant.ofEpochMilli(timestamp);LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());System.out.println("时间戳转换为本地日期时间对象:" + localDateTime);// 将Java 8时间类型转换为时间戳LocalDateTime localDateTime3 = LocalDateTime.now();long timestamp2 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();System.out.println("Java 8时间类型转换为时间戳:" + timestamp2);}
}

3.2.java.sql.Timestamp

java.sql.Timestamp是Java中用于表示SQL数据库中的日期和时间信息的类。它是java.util.Date的子类,并扩展了它的功能以支持更高精度的时间信息,尤其是对于代表纳秒级别精度的时间戳。

以下是一些关于java.sql.Timestamp的重要说明:

3.2.1.创建java.sql.Timestamp对象

您可以使用多种方式创建java.sql.Timestamp对象。其中最常用的方式是通过使用java.sql.Timestamp(long time)构造函数,该构造函数接受一个代表自1970年1月1日00:00:00 UTC以来的毫秒数的参数。

以下是一个示例代码,展示了如何创建一个java.sql.Timestamp对象:

import java.sql.Timestamp;public class TimestampExample {public static void main(String[] args) {long timestampInMillis = System.currentTimeMillis();Timestamp timestamp = new Timestamp(timestampInMillis);System.out.println("时间戳: " + timestamp);}
}

3.2.2.与数据库的交互

java.sql.Timestamp常被用于与数据库进行日期和时间类型的交互。当从数据库中查询到一个日期或时间字段时,可以使用java.sql.ResultSet对象的getTimestamp(int columnIndex)getTimestamp(String columnLabel)方法获取一个java.sql.Timestamp对象。

以下是一个示例代码,展示了如何从数据库中获取一个日期时间字段的时间戳:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;public class DatabaseExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, username, password);PreparedStatement stmt = conn.prepareStatement("SELECT datetime_column FROM mytable");ResultSet rs = stmt.executeQuery()) {if (rs.next()) {Timestamp timestamp = rs.getTimestamp("datetime_column");System.out.println("时间戳: " + timestamp);}} catch (SQLException e) {e.printStackTrace();}}
}

注意,上述代码仅是一个简化示例,实际情况下需要根据具体的数据库和表结构进行相应的操作。

java.sql.Timestamp类还提供了许多其他方法,以便灵活地处理日期和时间信息,如获取特定部分的日期或时间(年、月、日、小时等),格式化输出等。您可以参考Java官方文档以获取更详细的信息。

4.相互转换

4.1. String 类型与时间类型的相互转换

这一部分我们详细说明了如何将String类型与不同时间类型进行相互转换

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;public class StringConvertExample {public static void main(String[] args) {// 将字符串日期转换为java.util.DateString dateString = "2023-10-12";SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date date = dateFormat.parse(dateString);System.out.println("字符串转换为java.util.Date:" + date);// 将字符串日期转换为Java 8 时间类型String dateFormattedString = "2023-10-12";DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate localDate = LocalDate.parse(dateFormattedString, formatter);System.out.println("字符串转换为Java 8 时间类型:" + localDate);}
}

4.2.时间格式化

使用java.time.format.DateTimeFormatter进行格式化,使用java.time.format.FormatStyle进行简化格式化,以及使用java.time.format.DateTimeFormatterBuilder进行自定义格式化。

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.util.Date;public class FormatExample {public static void main(String[] args)  {// 将java.util.Date转换为字符串日期Date date = new Date();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");String format = dateFormat.format(date);System.out.println("java.util.Date转换为字符串:" + format);// 使用java.time.format.DateTimeFormatter进行格式化LocalDateTime dateTime = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formattedDateTime = dateTime.format(formatter);System.out.println("格式化后的时间:" + formattedDateTime);// 使用java.time.format.FormatStyle进行格式化LocalDateTime dateTime2 = LocalDateTime.now();DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);String formattedDateTime2 = dateTime.format(formatter);System.out.println("格式化后的时间:" + formattedDateTime2);// 使用java.time.format.DateTimeFormatterBuilder进行自定义格式化LocalDateTime dateTime3 = LocalDateTime.now();DateTimeFormatter formatter3 = new DateTimeFormatterBuilder().appendPattern("yyyy年MM月dd日 HH时mm分ss秒").toFormatter();String formattedDateTime3 = dateTime3.format(formatter3);System.out.println("格式化后的时间:" + formattedDateTime3);}
}

4.3. 不同时间类型的相互转换

java.util.Date, Java 8时间类型相互转换

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;public class DateConvertExample {public static void main(String[] args)  {// 将java.util.Date转换为Java 8时间类型Date date = new Date();Instant instant = date.toInstant();LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());System.out.println("java.util.Date转换为Java 8时间类型:" + localDateTime);// 将Java 8时间类型转换为java.util.DateLocalDateTime localDateTime2 = LocalDateTime.now();Instant instant2 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();Date date2 = Date.from(instant);System.out.println("Java 8时间类型转换为java.util.Date:" + date2);}
}

5.Java8操作方法

5.1.时间比较和操作

时间的比较和操作,包括比较两个时间的先后顺序、计算时间差以及对时间进行增减操作。

import java.time.Duration;
import java.time.LocalDateTime;public class DateActionExample {public static void main(String[] args)  {// 比较两个时间的先后顺序LocalDateTime dateTime1 = LocalDateTime.of(2023, 10, 12, 8, 0, 0);LocalDateTime dateTime2 = LocalDateTime.of(2023, 10, 12, 10, 0, 0);boolean isAfter = dateTime1.isAfter(dateTime2);System.out.println("dateTime1是否在dateTime2之后:" + isAfter);boolean isBefore = dateTime1.isBefore(dateTime2);System.out.println("dateTime1是否在dateTime2之前:" + isBefore);boolean isEqual = dateTime1.isEqual(dateTime2);System.out.println("dateTime1是否与dateTime2相等:" + isEqual);// 计算时间差LocalDateTime oldDateTime = LocalDateTime.of(2023, 10, 12, 8, 0, 0);LocalDateTime newDateTime = LocalDateTime.of(2023, 10, 12, 10, 0, 0);Duration duration = Duration.between(oldDateTime, newDateTime);long hours = duration.toHours();System.out.println("时间差(小时):" + hours);// 对时间进行增减操作LocalDateTime dateTime = LocalDateTime.of(2023, 10, 12, 8, 0, 0);LocalDateTime addedDateTime = dateTime.plusHours(2);System.out.println("增加2小时后的时间:" + addedDateTime);LocalDateTime subtractedDateTime = dateTime.minusHours(2);System.out.println("减少2小时后的时间:" + subtractedDateTime);LocalDateTime withDateTime = dateTime.withHour(2);System.out.println("设置成2点 = " + withDateTime);}
}

相关文章:

深入了解 Java 中的时间信息定义、转换、比较和操作

1. 简介 在过去的传统Java日期处理中,经常面临着一些问题。比如,java.util.Date和java.util.Calendar在表示日期和时间时存在着一些奇怪的行为,如月份从0开始计数、对日期进行格式化的方式繁琐不直观等。这些问题给开发带来了一定的困扰。 …...

2023年中国智能矿山发展历程及趋势分析:智能矿山健康有序发展[图]

智能矿山系统对矿山生产提质增效的效果已经开始显现:对不合规、有风险的行动进行及时预警,减少安全事故发生概率,避免因停产整顿产生的巨额亏损;精细化管理整个生产流程,避免过往传统粗放的流程导致的浪费,…...

acwing算法基础之基础算法--整数离散化算法

目录 1 知识点2 模板 1 知识点 整个范围很大,但存在的数据点很少。比如从 − 1 0 9 -10^9 −109到 1 0 9 10^9 109,但总共只有 1 0 6 10^6 106个数。 可以采用离散化的思想来做,即将离散的大数值映射成连续的小数值(一般是 1 , …...

基于SSM框架的安全教育平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

Kafka生产者使用案例

1.生产者发送消息的过程 首先介绍一下 Kafka 生产者发送消息的过程: 1)Kafka 会将发送消息包装为 ProducerRecord 对象, ProducerRecord 对象包含了目标主题和要发送的内容,同时还可以指定键和分区。在发送 ProducerRecord 对象前&#xff0c…...

EasyX图形库实现贪吃蛇游戏

⭐大家好&#xff0c;我是Dark Falme Masker,学习了动画制作及键盘交互之后&#xff0c;我们就可以开动利用图形库写一个简单的贪吃蛇小游戏&#xff0c;增加学习乐趣。 ⭐专栏&#xff1a;EasyX部分小游戏实现详细讲解 最终效果如下 首先包含头文件 #include<stdio.h> #…...

利用 Amazon CodeWhisperer 激发孩子的编程兴趣

我是一个程序员&#xff0c;也是一个父亲。工作之余我会经常和儿子聊他们小学信息技术课学习的 Scratch 和 Kitten 这两款图形化的少儿编程工具。 我儿子有一次指着书房里显示器上显示的 Visual Studio Code 问我&#xff0c;“为什么我们上课用的开发界面&#xff0c;和爸爸你…...

2023年中国分子筛稀土催化材料竞争格局及行业市场规模分析[图]

稀土催化材料能够起到提高催化剂热稳定性、催化剂活性、催化剂储氧能力&#xff0c;以及减少贵金属活性组分用量等作用&#xff0c;广泛应用于石油化工、汽车尾气净化、工业废气和人居环境净化、燃料电池等领域。 2015-2023年中国稀土催化材料规模及预测 资料来源&#xff1a;…...

vue3插件——vue-web-screen-shot——实现页面截图功能

最近在看前同事发我的vue3框架时&#xff0c;发现他们有个功能是要实现页面截图功能。 vue3插件——vue-web-screen-shot——实现页面截图功能 效果图如下&#xff1a;1.操作步骤1.1在项目中添加vvue-web-screen-shot组件1.2在项目入口文件导入组件——main.ts1.3在需要使用的页…...

简单总结Centos7安装Tomcat10.0版本

文章目录 前言JDK8安装部署Tomcat 前言 注意jdk与tomcat的兼容问题&#xff0c;其他的只要正确操作一般问题不大 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomca…...

ffmpeg中AVCodecContext和AVCodec的关系分析

怎么理解AVCodecContext和AVCodec的关系 AVCodecContext和AVCodec是FFmpeg库中两个相关的结构体&#xff0c;它们在音视频编解码中扮演着不同的角色。 AVCodecContext&#xff1a;是编解码器上下文结构体&#xff0c;用于存储音视频编解码器的参数和状态信息。它包含了进行音视…...

2023年中国门把手产量、销量及市场规模分析[图]

门把手行业是指专门从事门把手的设计、制造、销售和安装等相关业务的行业。门把手是门窗装饰硬件的一种&#xff0c;用于开启和关闭门窗&#xff0c;同时也具有装饰和美化门窗的作用。 门把手行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着消…...

HTML 核心技术点基础详细解析以及综合小案例

核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本&#xff1a;链接 标记&#xff1a;标签&#xff0c;带尖括号的文本 标签结构 标签要成…...

BAT学习——批处理脚本(也称为BAT文件)常用语法元素与命令

批处理脚本&#xff08;也称为BAT文件&#xff09;使用Windows的批处理语言编写&#xff0c;它具有一些常用的语法元素和命令。以下是一些BAT编程的常用语法元素和命令&#xff1a; 命令行命令&#xff1a; 批处理脚本通常包含一系列Windows命令&#xff0c;例如echo&#xff0…...

AMD AFMF不但能用在游戏,也适用于视频

近期AMD发布了AMD Software Adrenalin Edition预览版驱动程序&#xff0c;增加了对平滑移动帧&#xff08;AMD Fluid Motion Frames&#xff0c;AFMF&#xff09;功能的支持&#xff0c;也就是AMD的“帧生成”技术&#xff0c;与DLSS 3类似&#xff0c;作为FidelityFX Super Re…...

CSS 常用样式浮动属性

一、概述 CSS 中&#xff0c;浮动属性的作用是让元素向左或向右浮动&#xff0c;使其他元素围绕它排布&#xff0c;常用的浮动属性有以下几种&#xff1a; float: left; 使元素向左浮动&#xff0c;其他元素从右侧包围它。 float: right; 使元素向右浮动&#xff0c;其他元素…...

Linux引导故障排除:从问题到解决方案的详细指南

1 BIOS初始化 通电->对硬件检测->初始化硬件时钟 2 磁盘引导及其修复 2.1 磁盘引导故障 磁盘主引导记录&#xff08;MBR&#xff09;是在0磁道1扇区位置&#xff0c;446字节。 MBR作用&#xff1a;记录grub2引导文件的位置 2.2 修复 步骤&#xff1a;1、光盘进…...

【vim 学习系列文章 6 -- vim 如何从上次退出的位置打开文件】

文章目录 1.1 vim 如何从上次退出的位置打开文件1.2 autogroup 命令学习1.2.1 augroup 基本语法 1.3 vim call 命令详细介绍 1.1 vim 如何从上次退出的位置打开文件 假设我打开了文件 test.c&#xff0c;然后我向下滚动到第 50 行&#xff0c;然后我做了一些修改并关闭了文件。…...

怎样学习C#上位机编程?

怎样学习C#上位机编程&#xff1f; 00001. 掌握C#编程和.NET框架基础。 00002. 学WinForm应用开发&#xff0c;了解控件使用和事件编程。 00003. 熟悉基本数据结构和算法&#xff0c;如链表、栈、队列。 00004. 理解串口通信协议和方法&#xff0c;用于与硬件交互。 00005…...

【算法-动态规划】两个字符串的删除操作-力扣 583

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

【06】基础知识:typescript中的泛型

一、泛型的定义 在软件开发中&#xff0c;我们不仅要创建一致的定义良好的API&#xff0c;同时也要考虑可重用性。 组件不仅能支持当前数据类型&#xff0c;同时也能支持未来的数据类型&#xff0c;这在创建大型系统时提供了十分灵活的功能。 在像 C# 和 Java 这样的语言中&…...

flutter 绘制原理探究

文章目录 Widget1、简介2、源码分析Element1、简介2、源码分析RenderObjectWidget 渲染过程总结思考Flutter 的核心设计思想便是“一切皆 Widget”,Widget 是 Flutter 功能的抽象描述,是视图的配置信息,同样也是数据的映射,是 Flutter 开发框架中最基本的概念。 在 Flutter…...

[Java]SPI扩展功能

一、什么是SPI Java SPI&#xff08;Service Provider Interface&#xff09;是Java官方提供的一种服务发现机制。 它允许在运行时动态地加载实现特定接口的类&#xff0c;而不需要在代码中显式地指定该类&#xff0c;从而实现解耦和灵活性。 二、实现原理 基于 Java 类加载…...

机器人命令表设计

演算命令 CLEAR 将数据 1 上被指定的编号以后的变数的内容&#xff0c;以及数据 2 上仅被指定的个数都清除至 0。 INC 在被指定的变数内容上加上 1。 DEC 在被指定的变数内容上减掉 1。 SET 在数据 1 上设定数据 2。 ADD 将数据 1 和数据 2 相加&#xff0c;得出的结果保存在数…...

STM32--WDG看门狗

文章目录 WDG简介IWDGIWDG的超时计算WWDGWWDG超时和窗口值设定独立看门狗工程WWDG工程 WDG简介 WDG看门狗&#xff08;Watchdog Timer&#xff09;是一种常见的硬件设备&#xff0c;在STM32F10系列中&#xff0c;有两种看门狗&#xff0c;分别是独立看门狗和窗口看门狗&#x…...

(※)力扣刷题-字符串-实现 strStr()(KMP算法)

28 实现 strStr() 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串&#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在&#xff0c;则返回 -1。 示例 1: 输入: haystack “hello”, needle “ll” 输出: 2 示例…...

Redis 集群 Redis 事务 Redis 流水线 Redis 发布订阅 Redis Lua脚本操作

Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅 Redis 集群linux安装redis主从配置查看当前实例主从信息 Redis Sentinelsentinel Redis Cluster Redis 事务Redis 流水线Redis 发布订阅Redis Lua脚本操作 Redis 集群 linux安装redis 下载安装包&#…...

【算法与数据结构】--常见数据结构--栈和队列

一、栈 栈&#xff08;Stack&#xff09; 是一种基本的数据结构&#xff0c;具有后进先出&#xff08;LIFO&#xff09;的特性&#xff0c;类似于现实生活中的一叠盘子。栈用于存储一组元素&#xff0c;但只允许在栈顶进行插入&#xff08;入栈&#xff09;和删除&#xff08;…...

Linux shell编程学习笔记11:关系运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算。前面几节我们研究了 Linux shell编程 中的 字符串运算 和 算术运算&#xff0c;今天我们来研究 Linux shell编程中的的关系运算。 一、关系运算符功能说明 运算符说明…...

JS标准库

学习一门编程语言不仅是掌握其语法。同等重要的是学习其标准库&#xff0c;从而熟练掌握语言本身提供的所有工具。 1 定型数组 js常规数组与C和Java等较低级语言的数组类型还是有很大区别。ES6新增了定型数组&#xff0c;与这些语言的低级数组非常接近。 定型数组严格来说并…...

Android 12.0 hal层添加自定义hal模块功能实现

1. 前言 在12.0的系统rom定制化开发中,在 对hal模块进行开发时,需要通过添加自定义的hal模块来实现某些功能时,就需要添加hal模块的相关功能,接下来就来实现一个案例来供参考 接下来就来具体实现这个功能 2.hal层添加自定义hal模块功能实现的核心类 hardware\interfaces…...

如何理解vue声明式渲染

Vue.js中的声明式渲染是一种用来描述用户界面的方式&#xff0c;它强调“声明”应该如何渲染页面&#xff0c;而不需要关心底层的DOM操作。这与传统的命令式渲染方式&#xff0c;即手动控制DOM元素的创建、更新和销毁&#xff0c;形成了鲜明的对比。 理解Vue的声明式渲染的关键…...

【已解决】Vue全局引入scss 个别页面不生效 / 不自动引入全局样式

项目里配置了全局样式的引入&#xff0c;今天新建了 demo 页面去修改 element 的样式&#xff0c;发现全局的样式没有引入进来。 问题原因 在此页面 没有任何样式导致的 项目在编译的时候&#xff0c;会把 .vue 文件的样式抽离到单独的 css 文件中。 当该页面没有css代码的时…...

MySQL之双主双从读写分离

一个主机 Master1 用于处理所有写请求&#xff0c;它的从机 Slave1 和另一台主机 Master2 还有它的从 机 Slave2 负责所有读请求。当 Master1 主机宕机后&#xff0c; Master2 主机负责写请求&#xff0c; Master1 、 Master2 互为备机。架构图如下 : 准备 我们…...

使用eBPF加速阿里云服务网格ASM

背景 随着云原生应用架构的快速发展&#xff0c;微服务架构已经成为了构建现代应用的主要方式之一。而在微服务架构中&#xff0c;服务间的通信变得至关重要。为了实现弹性和可伸缩性&#xff0c;许多组织开始采用服务网格技术来管理服务之间的通信。 Istio作为目前最受欢迎的…...

大型数据集处理之道:深入了解Hadoop及MapReduce原理

在大数据时代&#xff0c;处理海量数据是一项巨大挑战。而Hadoop作为一个开源的分布式计算框架&#xff0c;以其强大的处理能力和可靠性而备受推崇。本文将介绍Hadoop及MapReduce原理&#xff0c;帮助您全面了解大型数据集处理的核心技术。 Hadoop简介 Hadoop是一个基于Google…...

LCR 095. 最长公共子序列(C语言+动态规划)

1. 题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…...

程序员不写注释:探讨与反思

一、为什么程序员不写注释 当程序员选择不写注释时&#xff0c;通常有一系列常见原因&#xff0c;这些原因可以影响他们的决策和行为。同时&#xff0c;这个决策可能会带来多方面的影响和后果。以下是详细阐述为什么程序员不写注释的常见原因以及这种决策可能导致的影响和后果…...

《论文阅读:Dataset Condensation with Distribution Matching》

点进去这篇文章的开源地址&#xff0c;才发现这篇文章和DC DSA居然是一个作者&#xff0c;数据浓缩写了三篇论文&#xff0c;第一篇梯度匹配&#xff0c;第二篇数据增强后梯度匹配&#xff0c;第三篇匹配数据分布。DC是匹配浓缩数据和原始数据训练一次后的梯度差&#xff0c;DS…...

免费chatGPT工具

发现很多人还是找不到好用的chatGPT工具&#xff0c;这里分享一个邮箱注册即可免费试用。 PromptsZone - 一体化人工智能平台使用 PromptsZone 与 ChatGPT、Claude、AI21 Labs、Google Bard 聊天&#xff0c;并使用 DALL-E、Stable Diffusion 和 Google Imagegen 创建图像&…...

数据分析基础:数据可视化+数据分析报告

数据分析是指通过对大量数据进行收集、整理、处理和分析&#xff0c;以发现其中的模式、趋势和关联&#xff0c;并从中提取有价值的信息和知识。 数据可视化和数据分析报告是数据分析过程中非常重要的两个环节&#xff0c;它们帮助将数据转化为易于理解和传达的形式&#xff0…...

settings.xml的文件配置大全

settings.xml 文件中最常配置的还是这几个标签 localRepository和mirrors settings.xml文件官方文档地址 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"ht…...

极简c++(7)类的继承

为什么要用继承 子类不必复制父类的任何属性&#xff0c;已经继承下来了&#xff1b;易于维护与编写&#xff1b; 类的继承与派生 访问控制规则 一般只使用Public&#xff01; 构造函数的继承与析构函数的继承 构造函数不被继承&#xff01; 在创建子类对象的时候&…...

DOSBox和MASM汇编开发环境搭建

DOSBox和MASM汇编开发环境搭建 1 安装DOSBox2 安装MASM3 编译测试代码4 运行测试代码5 调试测试代码 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 安装DOSBox 下载DOSBox和MASM&#xff1a;https://download.csdn.net/download/u011832525/884180…...

047:mapboxGL本地上传shp文件,在map上解析显示图形

第047个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传shp文件,利用shapefile读取shp数据,并在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共117行)加载shapefile.js方式…...

Windows下DataGrip连接Hive

DataGrip连接Hive 1. 启动Hadoop2. 启动hiveserver2服务3. 启动元数据服务4. 启动DG 1. 启动Hadoop 在控制台中输入start-all.cmd后&#xff0c;弹出下图4个终端&#xff08;注意终端的名字&#xff09;2. 启动hiveserver2服务 单独开一个窗口启动hiveserver2服务&#xff0c;…...

Xshell7和Xftp7超详细下载教程(包括安装及连接服务器附安装包)

1.下载 1.官网地址&#xff1a; XSHELL - NetSarang Website 选择学校免费版下载 2.将XSHELL和XFTP全都下载下来 2.安装 安装过程就是选择默认选项&#xff0c;然后无脑下一步 3.连接服务器 1.打开Xshell7&#xff0c;然后新建会话 2.填写相关信息 出现Connection establi…...

ASP.net数据从Controller传递到视图

最常见的方式是使用模型或 ViewBag。 使用模型传递数据&#xff1a; 在控制器中&#xff0c;创建一个模型对象&#xff0c;并将数据赋值给模型的属性。然后将模型传递给 View 方法。 public class HomeController : Controller {public IActionResult Index(){// 创建模型对…...

c++ 友元函数 友元类

1. 友元函数 1.1 简介 友元函数是在类的声明中声明的非成员函数&#xff0c;它被授予访问类的私有成员的权限。这意味着友元函数可以访问类的私有成员变量和私有成员函数&#xff0c;即使它们不是类的成员。 一个类中&#xff0c;可以将其他类或者函数声明为该类的友元&#…...

Spring推断构造器源码分析

Spring中bean虽然可以通过多种方式&#xff08;Supplier接口、FactoryMethod、构造器&#xff09;创建bean的实例对象&#xff0c;但是使用最多的还是通过构造器创建对象实例&#xff0c;也是我们最熟悉的创建对象的方式。如果有多个构造器时&#xff0c;那Spring是如何推断使用…...