掘友等级
获得徽章 6
最近恢复骑车了,为了让自己有动力,主打一个真是。一个点赞我骑20公里(相当于一天),相当于一天骑一个点赞。
不设有效期,主打一个坚持。
天天想辞职,月月拿满勤
特大喜讯:汪汪队数量破千!
汪汪队汪数(优弧计入)= 原汪汪队数量(包含头像重置) + 近两天加入数量 - 近两天叛变数量
那些被重置但不活跃的汪汪们,你们不会被组织抛弃的!
加入汪汪队,你的每条沸点至少将得到我的点赞!
加入方式:juejin.cn
头像没了我怀疑是管理员搞得鬼, 而且我有证据
#每天一个知识点# substring(x):这个表示截掉前x个,得到后边的新字符串
substring(x,y):第一个参数是开始的下标,第二个参数是截取字符串最终的下标 (截取2个位置之间的字符串)
含头不含尾:包含开始的下标数值,不含最终下标的数值
#每天一个知识点# SpringBoot中AOP的通知及通知分类
通知是切面的一部分,它是在特定切点处执行的具体操作。切面由切点和通知组成,切点用于定义在哪些连接点上应用通知的规则,而通知定义了在这些连接点上执行的具体操作。在方法上添加相应的注解就表示相应的通知:
前置通知(@Before):在目标方法执行之前执行的通知。可以在该通知中进行一些准备工作或参数验证。
后置通知(@After):在目标方法执行之后执行的通知。可以在该通知中进行一些清理工作或记录日志。
返回通知(@AfterReturning):在目标方法成功执行并返回结果后执行的通知。可以在该通知中对方法的返回值进行处理或执行其他操作。
异常通知(@AfterThrowing):在目标方法抛出异常后执行的通知。可以在该通知中处理异常或执行相应的异常处理逻辑。
环绕通知(@Around):在目标方法执行之前和之后都执行的通知。它可以完全控制目标方法的执行过程,包括是否执行目标方法以及如何处理返回值和异常。
#每天一个知识点# sql中having 和 where 区别
having是对一个表的数据进行分组之后,对组信息进行相应条件筛选
having筛选时,只能根据select子句中可出现的字段(数据)来进行条件设定
having子句与where子句一样,都是用于条件判断
where是判断数据从磁盘读入内存的时候
having是判断分组统计之前的所有条件
having子句中可以使用字段别名,而where不能使用
having能够使用统计函数,而where不能使用
#每天一个知识点# PO、VO、DAO、BO、DTO、POJO
PO (Persistent Object): 持久化对象,用于表示数据库中的数据记录,通常与数据库表的结构相对应,以便进行 CRUD (创建、读取、更新、删除) 操作。
VO (Value Object): 值对象,用于表示业务逻辑中的数据对象,通常用于在层之间传输数据。
DAO (Data Access Object): 数据访问对象,用于封装数据访问逻辑,隐藏底层数据存储细节,提供一组操作数据的方法。
BO (Business Object): 业务对象,用于封装业务逻辑,通常反映业务流程或业务实体。BO 可以使用 DAO 和 DTO 进行数据操作和传输。
DTO (Data Transfer Object): 数据传输对象,用于在系统层之间传输数据,通常包含多个字段,可以用于批量传输数据。
POJO (Plain Old Java Object): 简单的 Java 对象,是一个特定类型的类,没有任何限制或附加条件,可以用于表示各种数据。
需要注意的是,这些缩写词的具体定义可能因项目而异,因此在具体项目中应该根据团队约定和实际需求来使用。领域模型命名规约。
#每天一个知识点# sql语句之case when的用法
应用场景:
当需要从数据源上直接判断数据显示带不动含义的时候,就可以在SQL语句中使用case when 函数。
语法如下:
Case具有两种格式。简单Case函数和Case搜索函数。
简单Case函数格式:
CASE 列名
WHEN 条件值1 THEN 选项1
WHEN 条件值2 THEN 选项2
……
ELSE 默认值
END
(注释:列名,这里是sex,如果放在case后,则显示在屏幕上的列名即为列名sex)
Case搜索函数:
CASE
WHEN 条件1 THEN 选项1
WHEN 条件2 THEN 选项2
……
ELSE 默认值
END
(注释:列名,这里是sex,如果放在when后,若是不为整个CASE WHEN语句写个别名的话,则显示在屏幕上的列名即为整个CASE WHEN语句)
#每天一个知识点# ifnull()和nvl()函数
一,mysql 数据库的情况下使用ifnull()函数;
1.使用场景:
用于判断第一个表达式是否为null,如果为null则返回第二个参数的值,如果不为null则返回第一个参数的值;
2.语法格式:
IFNULL(expr1,expr2)
二,oracle数据库的情况下使用nvl()函数;
1.使用场景:
用于判断某个值是否为空值,若不为空值则输出第一个参数,若为空值,则返回第二个参数自己定义的值;
2.语法格式:
NVL(expr1,expr2);
#每天一个知识点# 事务特性分为四个:原子性(Atomicity)、隔离性(Isolation)、一致性(Consistency)、持续性(Durability)简称ACID。
原子性 (atomicity):强调事务的不可分割.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰。
一致性(Consistency):事务执行的前后数据的完整性保持一致。当事务执行成功后就说数据库处于一致性状态。如果在执行过程中发生错误,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这是数据库就处于不一致状态。
持久性(durability):事务一旦结束,数据就持久到数据库。
#每天一个知识点# 3种图片格式
JPEG(JPG)
JPEG图片支持的颜色比较多,图片可以压缩,但是不支持透明
一般使用JPEG来保存照片等颜色丰富的图片
GIF
GIF支持的颜色少,只支持简单的透明,支持动态图
图片颜色单一或者是动态图时可以使用gif
PNG
PNG支持的颜色多,并且支持复杂的透明
可以用来显示颜色复杂的透明的图片
#每天一个知识点# i++ 如何保证线程安全?
保证 i++ 线程安全的手段是加锁,可以通过 synchronized 或 Lock 加锁来保证 i++ 的线程安全。
#每天一个知识点# 堆排序
思路:
首先初始化一个大顶堆,每个大顶堆的根节点是最大值;
不断把根节点的值与数组最后一个值交换,然后长度减 1 再次进行大顶堆的整理操作;
时间复杂度:O(nlogn),每次整理的时间复杂度是 logn,要进行 n 次
空间复杂度:O(1)
#每天一个知识点# 归并排序
思路:
分隔:先将数组不断分割,直到分割到区间 [left, right] 内只有一个值
合并:将分隔后的数组不断向上合并,利用临时数组 temp[] 存储 原来 nums 数组 [left,right] 区间的值,然后分别从 temp 数组中 [left, mid] 和 [mid + 1, right] 区间分别取出最小的值,放入 nums 数组对应的位置即可;
代码的主要难点是 nums 数组 和 temp 数组的下标对应关系
时间复杂度:O(nlogn)
空间复杂度:O(n + logn) => O(n):临时的数组和递归时压入栈的数据占用的空间
#每天一个知识点# 三向切分快速排序
适用于有重复内容的排序
思路:
分成三个区间,小于 pivot(左区间),等于 pivot(中区间),大于 pivot(右区间);
左区间的 lt 指针永远指向该区间的最右的位置,右区间的指针永远指向该区间的最左的位置;
对于中区间,不断移动游标 i 的位置即可;
时间复杂度:O(nlogn)
空间复杂度:O(logn)
#每天一个知识点# 快速排序
思路:
对于单次的排序 partition() ,定义一个标志 part ,凡是小于该值的都放左边,大于该值的都放右边,最后把该值放到中间,并返回中间的下标 partition ,这里实现的关键是:存在一个指针 j 始终指向左边区间的最靠右的值,若 j + 1,则去到了右区间;
将数组以 partition 为中点,将数组分成两份,每一份继续进行 partition();
时间复杂度:O(nlogn)
空间复杂度:O(logn)
#每天一个知识点# 选择排序
思路:对于区间 [j, nums.length] (i <= j <= nums.length),每次在这个区间中选择最小的值,插入到 nums[i] 中,即每次选择一个最小的值插入到 nums[i] 中;
时间复杂度:O(n2)
空间复杂度:O(1)
/**
* 插入排序
*
* @param nums 数组
*/
public void insertSort(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int idx = 0;
int min = Integer.MAX_VALUE;
for (int j = i; j < nums.length; j++) {
if (nums[j] < min) {
min = nums[j];
idx = j;
}
}
swap(nums, i, idx);
}
}
下一页