Java程序猿搬砖笔记(十五)

在Java中将类作为参数传递(泛型)

1
2
3
4
5
6
7
示例代码如下:
// 示例方法
public <T> void downloadErrorData(Class<T> className){
List<T> downloadList = new ArrayList<>();
}
// 调用示例
importService.downloadErrorData(PropositionExpertImportVo.class);

IDEA快捷键:查看该方法调用了哪些方法、被哪些方法调用

快捷键:ctrl+alt+h

查看该方法被哪些方法调用(即调用链)
在这里插入图片描述

查看该方法调用了哪些方法
在这里插入图片描述

IDEA快捷键:快速从controller跳转到serviceImpl

在这里插入图片描述
快捷键:CTRL+T

IDEA快捷键:实现接口的方法

进入到实现类中,按 ALT+SHIFT+P

IDEA 快捷键:快速包裹代码

实现快速生成if-else、for、try-catch-finally语句。
快捷键:CTRL+ALT+T

IDEA插件EasyYapi安装

参考链接参考链接

IDEA生成接口文档插件Doc View

  • 支持文档预览、文档修改
  • 支持批量导出MarkDown文件到本地
  • 支持上传文档到YAPI、Show Doc、语雀平台
  • 支持Swagger和普通注释,支持多种字段必填配置

在这里插入图片描述
官网

RunApi介绍

介绍和下载地址Github

Java方法传参机制(Java只有值传递)

实参和形参

1、实参:用于传递给方法的参数,必须有确定的值。
2、形参:用于定义方法、接收实参,不需要确定的值。

值传递和引用传递

1、值传递:方法接收的是实参值创建的一个副本,对形参的修改不会影响到实参。
2、引用传递:方法接收的值是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。

总结

  • Java只有值传递、Java只有值传递、Java只有值传递。
  • Java实参传递给方法实际上是传递了一个副本。基本数据拷贝值,引用类型数据拷贝引用。
  • Java实参和形参相当于遥控器,对象相当于电视机。遥控器可以改变电视机的内容,但是不能改变原来的遥控器。

参考链接
参考链接

Java只能值传递实际案例分析

示例代码如下:

1
2
3
SaveRedisDto saveRedisDto = new SaveRedisDto();
List<ImportErrorVo> errorList = new ArrayList<>();
saveRedisDto.setErrorList(errorList);

saveRedisDto.setErrorList会创建一个errorList的引用副本传递,这个引用副本一直指向最开始的对象。
后续如果改变errorList的引用指向,并不会影响saveRedisDto的getErroList的指向。

Java 阻塞队列BlockingQueue提供的四种方法

抛异常 特定值 阻塞 超时
插入 add(o) offer(o) put(o) offer(o, timeout, timeunit)
移除 remove(o) poll(o)-jdk8不存在了 take(o) poll(timeout, timeunit)
检查 contains(o)

Java 7批量关闭流工具类

1
2
3
4
5
6
7
8
9
10
11
public static void close(AutoCloseable... t) {
for (AutoCloseable closeable : t) {
if (closeable != null) {
try {
closeable.close();
} catch (Exception e) {
log.error("批量关闭流异常:",e);
}
}
}
}

适用于:不在try里面创建的流,也就是说需要手动关闭的
参考链接

Spring @Configuration注解

  • @ComponentScan就相当于spring配置文件中的context:component-scan,主要作用就是去扫描指定包下使用注解的类,然后将使用注解的类注入到spring容器中。
  • @Configuration注解的类就相当于spring配置文件,可以在该类中配置使用@bean注解将类注入容器中,相当于xml文件中的标签。 启动spring项目时只需要指定被@configuration标识的配置类就行,而不需要去加载繁琐的xml了。

YAPI安装

官网-部署文档
Github-源代码

MySQL所有数据库varchar字段长度不能超过65535

在这里插入图片描述

MySQL SUBSTRING_INDEX函数

把字符串截取后,返回指定字符串。
如果字符串中没有分割符,会返回整个字符串。
示例:

1
2
3
4
5
6
7
8
9
10
-- 返回 ZGGX-MT-SH
select SUBSTRING_INDEX('ZGGX-MT-SH-20230013','-',3);
-- 返回 20230013
select SUBSTRING_INDEX('ZGGX-MT-SH-20230013','-',-1);


-- 返回整个字符串 ZGGXMTSH20230013
select SUBSTRING_INDEX('ZGGXMTSH20230013','-',3);
-- 返回整个字符串 ZGGXMTSH2023-0013
select SUBSTRING_INDEX('ZGGXMTSH2023-0013','-',3);

MySQL 字符串截取函数

left: 从字符串左边开始,截取几位

示例:

1
2
-- 返回  这是要
select left('这是要截取的内容', 3);

right:从字符串右边开始,截取几位

示例:

1
2
-- 返回的内容
select right('这是要截取的内容', 3);

substring:从字符串某个位置开始截取

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 从字符串的第 4 个字符位置开始取,只取 2 个字符。
-- 返回 截取
select substring('这是要截取的内容', 4, 2);

-- 从字符串的第 4个字符位置开始取,直到结束。
-- 返回 截取的内容
select substring('这是要截取的内容', 4);

-- 从字符串(倒数)的第 4个字符位置开始取,只取2个字符。
-- 返回 取的
select substring('这是要截取的内容', -4, 2);

-- 从字符串(倒数)的第 4个字符位置开始取,直到结束。
-- 返回 取的内容
select substring('这是要截取的内容', -4);

SQLite3数据库相关操作

参考链接

MySQL 查询结果为空(或者null)时,返回指定字符串

1
2
3
4
5
6
7
-- sql模板
SELECT IF(ifnull(字段名,'') = '', '返回的字符串', 字段名(或者指定字符)) AS 别名
FROM tableName;

-- 示例sql
SELECT IF(ifnull(introduce,'') = '', '1', '2') AS introduceEmpty
FROM t_achievement_application;

不同种类个税缴纳比例(税率标准+计算公式)

参考链接
公司上班适用于:
在这里插入图片描述
在这里插入图片描述
所以会出现前几个月税率3%,后几个月税率10%、20%的情况

Linux查看端口被哪个进程被占用的六个方法

参考链接
参考链接

Spring定时任务总结

  • 定时任务默认是单线程的。如果任务执行时间超过定时任务间隔时间,不管是同一个定时任务还是不同的定时任务,下一个任务都会被阻塞。
    待上一个执行完后,下一个定时任务不是立刻执行,而是需要等待(定时任务cron时间)才会执行。可以理解成是上一个任务执行完,才会开始计时
  • 【推荐该方式】实现SchedulingConfigurer接口后,定时任务会变成多线程执行。不同的定时任务之间互不影响,同一个定时任务(方法)依然会有被阻塞的机制。
    配置类代码如下:
1
2
3
4
5
6
7
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(8));
}
}
  • 如果定时任务交给线程池处理,则下一个任务也不会被阻塞。

参考链接