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

Java笔记20240726

Java

list的方法

原文链接:https://blog.csdn.net/BHSZZY/article/details/122860048
(1) list.stream().map().collect()方法,可以获取list中JavaBean的某个字段,转成一个新的list。
(2) list.stream().filter().map().collect()方法,可以对list中的JavaBean进行筛选,保留符合条件的JavaBean,然后将JavaBean中的某个字段,转成一个新的list。
(3) list.stream().collect()方法,可以把list转为map,可以指定list的中的JavaBean的某个字段或JavaBean本身为map的key或value。(或者根据情况自定义map的key与value)
(4) list.stream().filter().collect()方法,可以先筛选出list中符合条件的JavaBean,然后把list转为map,可以指定list的中的JavaBean的某个字段或JavaBean本身为map的key或value。(或者根据情况自定义map的key与value)

静态内部类与普通内部类的区别

原文链接:https://blog.csdn.net/jiahao1186/article/details/127240718
1)普通内部类不能脱离外部类被创建;静态内部类可以脱离外部类被创建。
2)普通内部类可访问外部类的静态和非静态成员变量和方法(包括私有属性),因其在外部类内部;静态内部类只能访问外部类的静态成员,不能访问外部类的非静态成员。
3)普通内部类拥有对外部类的引用;静态内部类没有对外部类的引用。
4)普通内部类不能定义static成员变量和方法。
5)类的内部,可定内部接口,并且可定义一个内部类实现这个内部接口。
6)内部类可以多嵌套。
7)可以在方法体内定义一个内部类,方法体内的内部类可以完成一个基于虚方法形式的回调操作
注:static修饰的内部类,是一种较为特殊的内部类,Java文档中描述static修饰的内部类:一旦内部类使用static修饰,那么此时这个内部类就升级为顶类。也就是说,除了写在一个类的内部以外,static内部类具备所有外部类的特性,同外部类没有分别。一般之定义和使用静态内部场景:该内部类仅外部类用到,以此减少类文件数量,方便代码维护和管理。

Java之StringUtils的常用方法

https://blog.csdn.net/weixin_42290280/article/details/82591161

一行代码网页变灰白

网页的body的style设置为filter:grayscale(1)

poi设置单元格格式

cell.setCellType(Cell.CELL_TYPE_STRING);

FileChooser使用

可以作为导入或导出的弹框
常用方法
// 设置窗口标题
fileChooser.setTitle(“选择需要的打开的文件”);
// 初始打开的位置
fileChooser.setInitialDirectory(new File(“.”));
//显示文件选择窗口并接收其返回值如果没有选择任何文件则返回NULL,有则返回一个File类型的值。showOpenDialog这个方法要设定一个FileChooser的所有者窗口,如果设置了FileChooser的所有者窗口,则在显示文件对话框时,FileChooser所有者中所有窗口的输入都会被阻塞。
File result =fileChooser.showOpenDialog(prStage);
// 导出 常用
FileChooser fc = new FileChooser();
fc.setTitle(title);
fc.setInitialFileName(title + “.xlsx”);
fc.getExtensionFilters().add(new FileChooser.ExtensionFilter(“XLS Files”, “.xlsx", “.xls”));
File file = fc.showSaveDialog(null);
OutputStream os = Files.newOutputStream(file.toPath());
// 导入 常用
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(“导入 年度平衡分析”);
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter(“Excel文件”, "
.xls”,“*.xlsx”));
File file = fileChooser.showOpenDialog(null);

Quartz中JobDetail的使用

JobDetail是用来描述作业(Job)实例的类,它包含了作业的详细信息和属性

使用步骤

  1. 创建Job类。首先创建一个实现了org.quartz.Job接口的作业类,该接口定义了作业类的执行逻辑
  2. 创建JobDetail实例。在 Quartz 中,每个作业都会被 JobDetail 对象实例化。你需要创建一个 JobDetail 对象来描述你的作业类及其它相关属性。通常在创建 JobDetail 时,你会指定作业类的名字、作业组名字、以及作业描述等信息。
  3. 将JobDetail与Trigger关联。最后,你需要将 JobDetailTrigger(触发器)关联起来,然后将它们一起加入到 Quartz 的调度器(Scheduler)中去执行。这通常通过 SchedulerscheduleJob 方法实现。

Java的线程问题

线程的生命周期及如何控制线程

Java中的线程有以下五种状态:新建状态、就绪状态、运行状态、阻塞状态和死亡状态。其中,新建状态指线程对象创建后处于的状态,就绪状态指线程调用start()方法后处于的状态,运行状态指线程正在运行的状态,阻塞状态指线程因为某种原因暂时停止运行的状态,死亡状态指线程执行完毕或者因为异常而结束的状态。

线程的控制可以通过以下方法实现:

  1. start()方法:用于启动一个线程,使线程从新建状态进入就绪状态。
  2. wait()方法:用于将线程从运行状态进入阻塞状态,直到被notify()或notifyAll()方法唤醒。
  3. join()方法:用于等待当前线程执行完毕后,才能继续执行其他线程。
  4. sleep()方法:用于将线程从运行状态进入阻塞状态,休眠一定时间后再重新进入就绪状态。
  5. interrupt()方法:用于中断线程的执行,即将线程从运行状态进入阻塞状态。
  6. stop()方法:用于强制结束线程的执行,不建议使用。

通过这些方法,我们可以对线程的执行状态进行灵活的控制,实现多线程编程的各种需求。

Java线程的wait方法和interrupt方法有什么区别

Java中的 wait方法和 interrupt 方法是用于线程同步和线程中断的两个方法,并且它们没有直接的联系。

它们之间的区别如下:

  1. wait方法:wait 方法是Object类中的方法,用于线程同步。它让线程进入等待状态,并且释放对象锁。当其他线程调用该对象的notify或 notifyAll方法时,等待状态的线程会被唤醒,然后再次试图获取该对象锁。

  2. interrupt方法:interrupt方法是Thread类中的方法,用于中断线程。当一个线程调用另一个线程的 interrupt方法时,被中断的线程会收到一个中断信号,然后可以相应地处理这个信号。注意,interrupt方法并不会直接停止线程,而是会设置中断标志位,线程可以在需要的时候主动检查中断标志位并作出相应的响应。

因此,wait方法和interrupt方法是用于不同场景的方法,没有直接的联系。需要根据具体的情况选择合适的方法。

用代码举例来说明上述两者的区别

下面是一个使用wait和interrupt的示例代码,展示了两者的用法和区别:

public class WaitAndInterruptDemo {public static void main(String[] args) throws InterruptedException {Object lock = new Object();Thread thread1 = new Thread(() -> {synchronized (lock) {System.out.println(Thread.currentThread().getName() + "开始等待");try {lock.wait(); // 等待唤醒信号} catch (InterruptedException e) {System.out.println(Thread.currentThread().getName() + "被中断");// 处理中断,例如清理资源等}}System.out.println(Thread.currentThread().getName() + "结束运行");}, "线程1");Thread thread2 = new Thread(() -> {synchronized (lock) {System.out.println(Thread.currentThread().getName() + "开始运行");try {Thread.sleep(1000); // 睡眠1秒} catch (InterruptedException e) {e.printStackTrace();}lock.notify(); // 发送唤醒信号}System.out.println(Thread.currentThread().getName() + "结束运行");}, "线程2");thread1.start();Thread.sleep(100); // 睡眠一段时间,确保线程1先运行thread2.start();Thread.sleep(500); // 睡眠一段时间,确保线程2已经发送了唤醒信号thread1.interrupt(); // 中断线程1thread1.join();thread2.join();}
}

在这个示例代码中,我们创建了两个线程,线程1通过wait方法进入等待状态,等待线程2发送唤醒信号。线程2通过synchronized块获取了锁,并且在获取锁之后使用notify方法发送唤醒信号。

具体的流程如下:

  1. 线程1开始运行,执行synchronized块并进入等待状态;
  2. 线程2开始运行,获取锁并且睡眠1秒钟,然后发送唤醒信号;
  3. 线程1被唤醒并且继续执行synchronized块;
  4. 线程1运行结束,线程2运行结束。 但是在这个示例中,我们中断了线程1,即在线程1运行的过程中,主线程发送了中断信号。此时线程1会收到中断信号,并且进入中断状态。在这个示例中,我们在catch块中对中断信号进行了处理,清理了资源并且输出了一条日志。 总的来说,wait

方法和interrupt方法用于不同的场景。wait方法用于线程同步,让线程进入等待状态,并且释放对象锁。interrupt方法用于中断线程,发送中断信号并且设置中断标志位。当线程收到中断信号时,需要进行相应的处理,例如清理资源、记录日志等。这两个方法在实际开发中经常会用到,需要掌握其用法和注意事项。

一个三到五年的Java软件工程师需要掌握什么技能以及掌握到什么程度?

作为一个三到五年的Java软件工程师,通常需要掌握以下技能:

  • Java编程语言:熟练掌握Java编程语言,包括面向对象编程、异常处理、泛型、并发编程等方面。
  • 数据库:熟练掌握关系型数据库,如MySQL、Oracle等,以及NoSQL数据库,如Redis、MongoDB等。
  • Web开发:掌握Web开发技术,如HTML、CSS、JavaScript、jQuery、Ajax等。
  • 框架:掌握常用的Java框架,如Spring、Hibernate、Struts等。
  • 工具:掌握常用的开发工具,如Eclipse、IntelliJ IDEA、Git、Maven、Gradle等。

在这些技能上,需要达到熟练掌握的程度,能够独立完成项目开发和维护。同时,还需要具备良好的编码习惯、团队协作能力以及持续学习的精神。

在java项目中使用mybatis框架和MySQL数据库时,字段类型的映射关系都是什么?

在Java项目中使用MyBatis框架和MySQL数据库时,字段类型的映射关系如下:

MySQL数据类型Java类型
TINYINTbyte/short/Boolean
SMALLINTshort
MEDIUMINTInteger
INT/INTEGERInteger
BIGINTLong
FLOATFloat
DOUBLEDouble
DECIMALBigDecimal
CHARString
VARCHARString
TEXTString
MEDIUMTEXTString
LONGTEXTString
DATEjava.util.Date/java.sql.Date
TIMEjava.util.Date/java.sql.Time
DATETIMEjava.util.Date/java.sql.Timestamp
TIMESTAMPjava.util.Date/java.sql.Timestamp
BLOBbyte[]/java.sql.Blob
MEDIUMBLOBbyte[]/java.sql.Blob
LONGBLOBbyte[]/java.sql.Blob

注意事项: 1. 对于MySQL的布尔类型TINYINT(1),可以映射为Java的Boolean类型或者byte/short类型,但是需要在MyBatis的配置文件中设置

jdbcType=BIT 

。 2. 对于MySQL的DECIMAL类型,可以映射为Java的BigDecimal类型,但是需要在MyBatis的配置文件中设置

jdbcType=DECIMAL 

。 3. 对于MySQL的DATE/TIME/DATETIME/TIMESTAMP类型,可以映射为Java的java.util.Date类型或者java.sql.Date/Time/Timestamp类型,但是需要在MyBatis的配置文件中设置

jdbcType=DATE/TIME/DATETIME/TIMESTAMP 

。 4. 对于MySQL的BLOB类型,可以映射为Java的byte[]类型或者java.sql.Blob类型,但是需要在MyBatis的配置文件中设置

jdbcType=BLOB 

。 在MyBatis的配置文件中,可以使用

<typeAliases> 

元素来配置Java类型和MySQL数据类型的映射关系。例如,我们可以在配置文件中添加如下配置:

<typeAliases><typeAlias type="java.util.Date" alias="Date"/><typeAlias type="java.math.BigDecimal" alias="BigDecimal"/>
</typeAliases>

这样,我们就可以在MyBatis的Mapper中直接使用Java类型来映射MySQL数据类型了。例如:

<resultMap id="userMap" type="User"><id column="id" property="id"/><result column="username" property="username"/><result column="password" property="password"/><result column="age" property="age" jdbcType="INTEGER"/><result column="salary" property="salary" jdbcType="DECIMAL"/><result column="birthday" property="birthday" jdbcType="DATE"/>
</resultMap>

在上面的示例中,我们使用Java的Integer类型来映射MySQL的INT类型,使用Java的BigDecimal类型来映射MySQL的DECIMAL类型,使用Java的java.util.Date类型来映射MySQL的DATE类型。在

<result> 

元素中,我们可以使用

jdbcType 

属性来指定MySQL数据类型,如果不指定,则MyBatis会根据Java类型自动推断

注解

注解是怎么定义并且起作用的

在Java中,注解(Annotation)是一种用于添加元数据信息的机制。它可以应用于类、接口、方法、字段等程序元素上,从而为这些元素添加额外的信息,以便被其他程序读取和处理。

注解的定义方式类似于接口的定义,使用@interface关键字进行声明,并可以包含多个成员变量。例如,下面是一个自定义注解@MyAnnotation的定义示例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {String value();int count() default 1;
}

通过@Retention和@Target注解,我们可以指定注解的生命周期和作用目标。在@MyAnnotation注解中,定义了两个成员变量value和count,并使用default关键字为count提供了默认值1。

使用注解时,需要将注解应用到相应的程序元素上。例如,要将@MyAnnotation注解应用到某个方法上,可以直接在该方法的声明前添加@MyAnnotation注解,并为其成员变量赋值。例如:

@MyAnnotation(value = "myMethod", count = 3)
public void myMethod() {// ...
}

在程序运行时,我们可以通过反射等机制读取并处理这个注解,例如:

Method method = MyClass.class.getMethod("myMethod");
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
String name = annotation.value();
int count = annotation.count();

通过上述代码,我们可以获取到@MyAnnotation注解中定义的value和count成员变量的值,并进行相应的处理。

总之,注解在Java中起到了非常重要的作用,它可以为程序元素添加额外的信息,以便其他程序读取和处理。通过合理使用注解,可以大大提高程序的可读性、可维护性和可扩展性。

元注解

@Target

在Java中,@Target是一种元注解(meta-annotation),用于标记其他注解可以应用的目标元素类型。它主要用于限定被注解的元素可以标记的范围。

具体来说,@Target注解可以指定以下元素类型作为目标:

  1. ElementType.ANNOTATION_TYPE:可以标记其他注解(被称为元注解)。
  2. ElementType.CONSTRUCTOR:可以标记构造函数。
  3. ElementType.FIELD:可以标记字段(成员变量)。
  4. ElementType.LOCAL_VARIABLE:可以标记局部变量。
  5. ElementType.METHOD:可以标记方法。
  6. ElementType.PACKAGE:可以标记包。
  7. ElementType.PARAMETER:可以标记方法的参数。
  8. ElementType.TYPE:可以标记类、接口、枚举和注解类型。

通过使用@Target注解,可以在定义自定义注解时明确指定注解可以应用的目标元素类型,从而限制注解的使用范围,增强程序的可读性和安全性。

@Retention

在Java中,@Retention是一种元注解(meta-annotation),用于指定被注解的元素的生命周期。它主要用于确定注解是否在编译时、运行时还是在类加载时保留。

具体来说,@Retention注解可以指定以下三种生命周期:

  1. RetentionPolicy.SOURCE:注解仅在源代码中保留,编译成字节码之后将被丢弃。这种注解对于编译器本身是可见的,但对运行时代码没有任何影响。
  2. RetentionPolicy.CLASS:注解在编译时被保留,并存储在生成的字节码文件中。然而,它不会被加载到JVM中,因此在运行时不可见。这是默认的保留策略,如果没有明确指定@Retention注解,默认为RetentionPolicy.CLASS。
  3. RetentionPolicy.RUNTIME:注解在编译时被保留,并存储在生成的字节码文件中。它也会被加载到JVM中,并在运行时对程序可见。这意味着可以通过反射等机制在运行时读取和处理注解。

通过使用@Retention注解,可以在定义自定义注解时明确指定注解的生命周期,从而控制注解的可见性和可操作性。根据需要,可以选择不同的保留策略来满足具体的业务需求。

JUC

什么是JUC

JUC是指Java Util Concurrent,即Java并发工具包,是jdk提供的一个用于支持并发编程的工具集合,包含了一些线程安全的集合类、原子类、线程池、同步器等组件

Executor 框架

Executor 框架是管理和执行线程的工具,提供了任务提交和任务执行分离的机制

核心接口和类:

根接口Executor定义了execute方法,用于执行传入的任务;

ExecutorService接口继承了Executor接口,扩展了执行任务的方法(submit),并提供了管理和控制任务执行的方法;

ThreadPoolExecutor类是实现了ExecutorService接口;

Executors工具类提供了创建各种类型ExecutorService实例的工厂方法

常用线程池
  • Executors.newFixedThreadPool(int nThreads):创建固定大小的线程池。
  • Executors.newCachedThreadPool():创建一个根据需要创建新线程的线程池,适合执行大量短期异步任务的场景。
  • Executors.newSingleThreadExecutor():创建一个单线程的线程池,任务按顺序执行。

锁机制

ReentrantLock

ReentrantLock是JUC提供的一种可重入的互斥锁,可以替代synchronized来实现更灵活的线程同步

特点:

  • 可重入性:允许线程重复获取已经持有的锁,而不会造成死锁
  • 公平性选择:可以选择构造公平锁或非公平锁
  • 条件变量:支持通过Condition接口是实现线程的等待和通知机制
http://www.xdnf.cn/news/1472419.html

相关文章:

  • 【Day 22】94.二叉树的中序遍历 104.二叉树的最大深度 226.翻转二叉树 101.对称二叉树
  • linux上nexus安装教程
  • 从“下山”到AI引擎:全面理解梯度下降(下)
  • 学习心得分享
  • 【OJ】C++ vector类OJ题
  • 使用国内镜像源解决 Electron 安装卡在 postinstall 的问题
  • 【Python - 类库 - BeautifulSoup】(01)“BeautifulSoup“使用示例
  • ESP-idf注册双服务器配置
  • SemiSAM+:在基础模型时代重新思考半监督医学图像分割|文献速递-深度学习人工智能医疗图像
  • 笔记:现代操作系统:原理与实现(2)
  • CLIP学习
  • 【C++】Vector完全指南:动态数组高效使用
  • Transformer核心—自注意力机制
  • 大批项目经理被迫上前线,酸爽
  • 图片在vue2中引用的方式和优缺点
  • 【数字孪生核心技术】什么是倾斜摄影?
  • 遇到 Git 提示大文件无法上传确实让人头疼
  • SVT-AV1编码器中实现WPP依赖管理核心调度
  • 门控MLP(Qwen3MLP)与稀疏混合专家(Qwen3MoeSparseMoeBlock)模块解析
  • 【开题答辩全过程】以 基于JSP的宠物医院管理系统设计为例,包含答辩的问题和答案
  • LTV-1008-TP1-G 电子元器件 LiteOn光宝 发光二极管 核心解析
  • 字符串(2)
  • 一文读懂 RAG 与 KAG:原理、工程落地与开源实战
  • scrypt 密钥派生算法(RFC7914)技术解析及源码示例
  • 流固耦合|08-1外部数据导入
  • 基于Django+Vue3+YOLO的智能气象检测系统
  • 【Python - 类库 - requests】(02)使用“requests“发起GET请求的详细教程
  • Markdown Editor开发文档(附下载地址)
  • AmbiSSL
  • 深度学习模型在边缘计算设备上的部署