20240718
一、单元测试@test没有绿色的启动箭头
在写单元测试的时候,可以通过Alt+insert生成并且可以选择版本:
一定要注意下面的版本,选错了就会报错,无法运行。
在SpringBoot 2.2的版本之前Junit4:org.junit.Test
SpringBoot 2.2之后使用的是 Junit5:org.junit.jupiter.api.Test
加上@SpringBootTest和public
二、JsonUtil.toBean
JSONUtil.toBean()方法用于将JSON格式的数据转换为Java对象。这个方法通常属于一些JSON处理库(例如Hutool库中的JSONUtil),它提供了一种便捷的方式,将JSON字符串中的数据映射到Java对象的相应属性上。这样,开发者可以以面向对象的方式处理JSON数据,而无需手动解析JSON字符串。
使用JSONUtil.toBean()方法的基本语法是:JSONUtil.toBean(jsonString, ClassName.class)。其中,jsonString是你要转换的JSON字符串,而ClassName.class是你希望将JSON转换成的Java类的Class对象。该方法会自动匹配JSON键与Java对象属性名,然后进行赋值,从而实现数据的转换。
例如,如果你有一个JSON字符串表示一个用户信息,你可以使用JSONUtil.toBean()方法将其转换为一个User对象,其中User是一个Java类,其属性与JSON字符串中的键相匹配。这样,你就可以在代码中以面向对象的方式操作这个用户信息,而不是直接操作JSON字符串。
此外,jsonutil.tobean方法的应用场景非常广泛,尤其适用于Web接口开发中服务器返回的数据处理,以及从数据库中读取JSON格式数据时的转换需求。由于Java和JSON的数据格式可能有所不同,因此在进行转换时,可能需要通过使用注解、配置文件等方式来映射Java对象与JSON字符串之间的对应关系。这种方法通过反射实现,即根据JSON字符串的key-value对的key值来通过反射获取Java对象中对应的属性并赋值,从而将JSON字符串转化为Java对象。
总的来说,JSONUtil.toBean()方法是一种非常实用的Java工具类方法,可以大幅度提升开发效率,特别是在Web开发等领域,使用jsonutil.tobean方法可以轻松地完成数据格式转换、数据传输和数据处理等任务
之后可以多去看看,总结用一下,包括BeanUtil
三、对于线程池的浅显了解:
1.就以黑马的redis中的这句代码来解释吧:
private static final ExecutorService CACHE_BUILDER_EXECUTOR = Executors.newFixedThreadPool(10);//获得十个线程
这段代码是在Java中使用Executor框架来创建一个固定大小为10的线程池。让我来解释一下每个部分的含义:
private: 这是Java中的访问修饰符,表示该成员变量只能在当前类中访问。
static: 这个关键字表示该成员变量属于类本身,而不是类的实例。这意味着你可以通过类名直接访问它,而不需要先创建类的实例。
final: 这个关键字表示一旦赋值之后,该成员变量的值不能再被修改。在这里,CACHE_BUILDER_EXECUTOR被赋予了一个固定的线程池实例。
ExecutorService: 这是一个接口,用于管理和执行线程池中的任务。
CACHE_BUILDER_EXECUTOR: 这是变量的名称,用于引用这个特定的ExecutorService实例。
Executors.newFixedThreadPool(10): 这是一个静态工厂方法,用于创建一个固定大小的线程池。在这里,参数10表示线程池的大小,即最多可以同时执行10个线程。
综上所述,这段代码的作用是创建了一个固定大小为10的线程池,命名为CACHE_BUILDER_EXECUTOR,可以用于并发执行多个任务,提高程序的效率和性能。
2. 什么是线程池
线程池(Thread Pool)是一种管理和重用线程的机制,用于优化多线程应用程序的性能和资源消耗。它包含若干个预先创建的线程,这些线程可以被程序反复利用来执行多个任务,而不需要每次执行任务时都创建新线程。线程池的主要目的是减少线程创建和销毁的开销,以及有效地管理并发任务的执行。
在使用线程池时,通常会指定最大线程数和一些调度策略,如何处理任务队列等参数。常见的线程池类型包括:
FixedThreadPool:固定大小的线程池,一旦创建就无法更改线程数量。
CachedThreadPool:根据需要创建新线程的线程池,如果线程池中的线程空闲时间超过设定时间,则回收该线程。
ScheduledThreadPool:用于定时执行或周期性执行任务的线程池。
使用线程池的好处包括:
提高程序响应速度:减少了线程创建和销毁的时间,任务可以更快速地执行。
资源管理:控制线程的数量,防止系统因过多线程而耗尽资源。
提高可管理性:能够监控和统计线程池的运行状况,便于调优和故障排除。
总之,线程池在多线程编程中扮演着重要角色,有效地提高了程序的并发性能和稳定性。
四、isBlank和isNotBlank
1. isBlank
isBlank 方法通常用于判断字符串是否为空或者只包含空格字符(包括制表符、换行符等)。具体来说:
如果字符串为 null,返回 true。
如果字符串长度为0,返回 true。
如果字符串中除去空格后长度为0,也返回 true。
否则返回 false。
示例:
String str1 = "";
String str2 = " ";
String str3 = "\t\n";
StringUtils.isBlank(str1); // true
StringUtils.isBlank(str2); // true
StringUtils.isBlank(str3); // true
StringUtils.isBlank(null); // true
StringUtils.isBlank(" abc "); // false
2. isBlank
isNotBlank 方法则与 isBlank 相反,用于判断字符串是否不为空且不仅包含空格字符:
如果字符串不为 null 且长度大于0,并且去除空格后长度大于0,返回 true。
否则返回 false。
示例:
String str1 = "";
String str2 = " ";
String str3 = "\t\n";
StringUtils.isNotBlank(str1); // false
StringUtils.isNotBlank(str2); // false
StringUtils.isNotBlank(str3); // false
StringUtils.isNotBlank(null); // false
StringUtils.isNotBlank(" abc "); // true
3. 使用建议
使用 isBlank 当你需要确保字符串在去除首尾空格后是否为空时。
使用 isNotBlank 当你需要确保字符串既不为 null 也不仅包含空格字符时。
这两个方法能够帮助你进行字符串的空值或空格检查,通常在输入验证或数据处理时非常有用。
五、LocalDateTimeTemporal 接口
1. 引入
(expireTime.isAfter(LocalDateTime.now())) {//意思是,过期时间(expireTime.).是不是在当前(LocalDateTime.now())时间之后(.isAfter)对于这个的使用
2. 使用
在实际应用中,这种检查常用于验证是否过期,例如验证会话令牌、临时凭证或其他时间敏感的数据。
示例使用:
LocalDateTime expireTime = LocalDateTime.of(2024, 7, 18, 15, 0); // 假设过期时间是2024年7月18日下午3点
boolean notExpired = expireTime.isAfter(LocalDateTime.now());
if (notExpired) {
// 如果未过期,执行相关逻辑
System.out.println("未过期");
} else {
// 如果已过期,执行其他逻辑
System.out.println("已过期");
}
3.LocalDateTime.of
LocalDateTime.of() 方法是 Java 8 中 LocalDateTime 类的一个静态工厂方法,用于创建一个指定日期和时间的 LocalDateTime 对象。它可以通过传入年、月、日、时、分等参数来设置日期时间。
具体来说,LocalDateTime.of() 方法的签名通常如下:
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)
参数含义如下:
year:年份,例如2024。
month:月份,从1到12。
dayOfMonth:月份中的日期,例如18号。
hour:小时数,24小时制。
minute:分钟数。
除了这些参数之外,LocalDateTime.of() 方法还可以根据需要传入其他参数,例如秒数和纳秒数,以精确设置日期时间。
比较较重要的用法
示例用法:
LocalDateTime dateTime = LocalDateTime.of(2024, 7, 18, 15, 0);
System.out.println(dateTime); // 输出:2024-07-18T15:00
这样就可以创建一个具体的日期时间对象,用于各种日期时间操作和比较,例如上面提到的过期时间判断。
4. Temporal 接口提供了其他一些用来比较日期的条件判断方法
isBefore(Temporal temporal):判断当前日期时间是否在提供的日期时间之前。
isAfter(Temporal temporal):判断当前日期时间是否在提供的日期时间之后。
isEqual(Temporal other):判断当前日期时间是否与提供的日期时间相同。
isAfter(TemporalAccessor temporal):判断当前日期时间是否在提供的日期时间之后。
isBefore(TemporalAccessor temporal):判断当前日期时间是否在提供的日期时间之前。
isEqual(TemporalAccessor temporal):判断当前日期时间是否与提供的日期时间相同。
这些方法可以被 LocalDate、LocalTime、LocalDateTime 和 ZonedDateTime 等日期时间类使用。下面是这些方法的示例使用:
LocalDateTime now = LocalDateTime.now(); // 获取当前的日期时间
LocalDateTime expireTime = LocalDateTime.of(2024, 7, 18, 15, 0); // 过期时间
if (now.isBefore(expireTime)) { // 判断当前时间是否在过期时间之前
System.out.println("过期时间未到");
} else {
System.out.println("过期时间已到");
}
if (now.isEqual(new LocalDateTime(2024, 7, 18, 15, 0)) { // 比较日期时间是否相等
System.out.println("今天是过期日期和时间");
} else {
System.out.println("今天的日期和时间不是过期日期和时间");
}