- 博客(43)
- 资源 (1)
- 收藏
- 关注
原创 Hutool工具包的常用工具类的使用介绍
Hutool是一个小而全的Java工具类库,上述只是列举了部分,涉及到其他的使用方法可以参考官方api文档进行查询。
2024-12-20 10:47:28
1466
原创 深入理解 CompletableFuture —— Java 异步编程的工具
CompletableFuture是Java8引入的一个类,位于 java.util.concurrent 包下。它是一个可以表示异步计算结果的对象。CompletableFuture 不仅可以用于异步编程,还可以进行组合、链式调用等复杂操作。相比传统的线程池或回调方式,它提供了一种更加灵活和可读性更强的方式来处理异步操作。执行异步任务:可以通过它启动异步计算,并在计算完成后得到结果。组合多个异步任务:通过链式调用,你可以将多个异步任务串联起来。
2024-12-18 15:34:23
1388
原创 Java的堆如何分代的?
正常情况下,对象在新生代进行分配,当Eden区内存耗尽,无法分配新的对象时候,会触发YoungGC进行垃圾回收,没有被回收的对象搬运到Survivor区,这个过程叫做晋升。1、很多对象都是创建在Eden区,Eden区内存用完的时候,会触发GC,非活对象会被标记死亡,活着的对象移动到Survivor区。1、躲过15次GC,每次垃圾回收的时候,没有被回收掉的对象年龄就会+1,累计到15次(jdk1.8默认),就会进入到老年代。新生代和老年代,新生代存放新创建的对象,老年代存放长期存在的对象。
2024-03-06 23:51:40
599
2
原创 设计模式的7大基本原则
一个类只负责一种职责,如果一个类有两个不同的职责, 如果职责1的需求发生变更而需要改变时,可能会造成职责2的执行错误。要求程序要依赖于抽象接口,而不是具体的实现,该原则通过引入抽象接口和抽象类来将高层模块和低层模块解耦。对于拓展是开放的,对于修改是关闭的。任何父类出现的地方,都可以用它的字类来替代,而不会导致系统出错,强调正确使用继承关系。客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。接口应该小而专注,不应该包含其他多余的方法,不要使用一个大的总接口。
2024-01-10 14:43:54
705
原创 什么是设计模式?有什么好处?
设计模式可以降低对象之间的交互的耦合性,让系统更容易拓展和维护,增加代码可读性。通过抽象层和接口,将变化的部分抽离出来,从而不影响其他业务,增加代码的可拓展性。设计模式是在软件开发过程中经常遇到的问题的通用解决方案。
2024-01-10 12:57:26
414
原创 如何使用自定义注解
RetentionPolicy.CLASS:停留在class文件,但是会被jvm丢弃(默认)ElementType.TYPE:类、接口(包括注解类型)或者是enum声明。ElementType.LOCAL_VARIABLE:局部变量声明。ElementType.PARAMETER:参数声明(废弃)ElementType.CONSTRUCTOR:构造器声明。ElementType.METHOD:方法声明。ElementType.PACKAGE:包声明。
2024-01-10 12:23:28
561
原创 策略模式解决if-else问题
这种模式支持开闭原则,在不修改现有代码的前提下,动态的添加、删除、替换算法。策略模式是一种行为设计模式,它允许在运行时根据不同的情况来选择不同的策略。:它是一个接口,具体的策略实现类去实现这个接口,就可以提供不同的实现方式。2、提高代码可读性:不同的业务处理在不同的策略实现类中,易于理解和维护。1、易于拓展:不需要修改原有代码,方便的增加、删除算法。可以根据需要来修改策略,或者定义一个工厂类。以Strategy接口实现某具体算法。3、避免大量的if-else语句。
2024-01-10 11:55:24
1050
原创 线程池线程数设置多少为合适?
5、可根据公式先设置一个数值,然后再根据实际的业务场景来调整。N是CPU的总和数。CPU密集型:线程池大小设置为N+1。IO密集型:线程池大小设置为2N+1。4、一次业务的整体耗时。2、服务器的配置情况。
2024-01-02 23:52:38
1558
原创 binlog、redolog、undolog的区别
在事务进行的全过程中,Mysql会将事务做了什么改动存储到redolog中,当系统发生异常情况时,Mysql会通过redolog中的记录来进行恢复操作,将事务所做的操作持久化到磁盘上。用于事务回滚或者是服务崩溃时回滚事务所做的操作,当一个事务执行完成之后,Mysql会将事务修改前的数据记录到undolog中,如果事务需要回滚,则会从undolog中找到对应的记录用来撤销事务所做的修改。主要用于对于数据库的数据备份,容灾恢复,数据复制等操作。undolog主要是保证事务的原子性和一致性,主要用于事务回滚。
2024-01-02 22:52:39
659
原创 MySQL聚簇索引和非聚簇索引的区别
对于聚簇索引来说,他的非叶子节点上存储的是存储数据的值,而它的叶子节点上存储的是这条记录的整行数据。2、对于非聚簇索引,它的非叶子节点存储的都是索引值,它的叶子节点上存储的是主键的值所以,非聚簇索引的查询,需要进行一次回表,就是先查到主键ID,在去查询需要的字段。,它是将表数据按照主键的顺序存储在磁盘上的一种方式,这种索引方式保证了行的物理存储顺序和主键的逻辑顺序相同,所以查找聚簇索引的速度非常快。1、对于聚簇索引,它的非叶子节点存储的是索引值,它的叶子节点存储的是整行记录。
2023-12-29 23:58:40
776
原创 什么是RabbitMQ死信队列?如何实现?
当消息变成“死信”之后,如果配置了死信队列,那么它将会被发送到死信交换机,死信交换机将死信发送到一个队列上,这个队列就是死信队列。2、消息过期:RabbitMQ中消息可以设置过期时间,如果在规定时间内没有被消费,它可以被认为是死信并被发送到死信队列。4、消息无法路由:当消息不能被路由到任何队列时,例:没有绑定关系或者是路由键,消息可以被发送到死信队列。3、死信队列和死信交换机进行绑定:将死信队列和死信交换机进行绑定,以便消息发送到死信队列上。1、创建死信队列:用来存储死信消息的队列。
2023-12-28 22:56:10
1020
原创 MySQL事务中的隔离级别有哪些?
不可重复读,是一个事务范围内的两次查询返回了不同的数据。事务在做范围查询时,有其他事务对这个范围的数据做了新增或者删除操作,导致范围内查询的结果条数不一致。读到了其他事务未提交的数据,比如A事务在操作数据,但是未提交,B事务处理的时候使用到了这条数据,因为事务A还未提交,所以事务B读到的数据就是脏数据。由于读已提交的隔离级别会产生不可重复读的现象,所以更高一级别的隔离级别可以解决不可重复读的问题,没办法彻底解决幻读。最低的隔离级别,A事务可以读取到B事务未提交的数据,会存在幻读、脏读、不可重复读的问题。
2023-12-28 14:00:59
554
原创 Mysql主从复制的实现过程
半异步复制是全同步复制和异步复制之间的一种复制方式,主库执行完事务之后,不会立马给客户端返回,也不会等所有从库都进行复制完成,而是等其中一个从库完成数据复制之后,再反馈给客户端。2、从服务器的I/O线程会尝试和主服务器建立连接,主服务器中有一个binlog dump线程,专门和从服务器的I/O线程交互。5、当dump线程检测到binlog发生变化时,会从指定位置开始读取内容,然后会被从服务器的I/O线程拉取过去。全同步复制中,当主库执行完一个事务之后,会等待所有的从库完成数据复制之后,才会给客户端反馈。
2023-12-28 00:28:27
610
原创 Redis和Memcached有什么区别?
2、持久化方式不同:redis支持rdb和aof方式持久化,可以将数据持久化到磁盘上,Memcached不支持持久化。1、数据结构不同:redis支持多种数据结构,Memcached只支持简单的键值对。3、Memcached是将数据全部存储到内存中,断电之后就会挂掉。Redis适应于数据结构复杂、需要更高级功能和数据持久化的场景。Redis和Memcached都是常见的缓存服务器。Memcached适应于简单的键值存储场景。
2023-12-26 23:32:33
918
1
原创 缓存穿透、击穿、雪崩
访问一个缓存和数据库都不存在的key,此时会直接打到数据库上,并且查询不到数据,没办法根据查询结果写入缓存,所以下一次请求过来还是直接访问到数据库,并且缓存也起不到作用了,每次请求都会走到数据库,流量大的话数据库可能就会挂掉。某一个热点key,在缓存过期的一瞬间,同时有大量的请求进来,由于缓存过期了,所以这些请求都会走到数据库,造成瞬时数据库的请求量增大,导致数据库挂掉。使用锁的时候,添加锁时,要按照请求key的维度来加锁,如果使用“固定的key”加锁,会导致不同的key之间也会互相阻塞。
2023-12-26 17:19:06
491
原创 什么是线程池
4、CallerRunsPolicy:当有新任务提交后,如果线程池没被关闭且没有能力执行,则把这个任务交于提交任务的线程执行,也就是谁提交任务,谁就负责执行任务。2、newCachedThreadPool():创建一个可缓存的线程池,调用execute将重用以前构造的线程,如果没有可用的线程则创建一个新得线程并添加到线程池中,终止并从缓存中移除那些超过60s没有被使用得线程。线程池就是提前创建好一批线程,保存到线程池中,当有任务需要执行的时候,从线程池中选一个线程来执行任务。线程池、连接池、对象池。
2023-12-26 00:32:22
407
原创 创建多线程有几种方式?
Future是一个接口,代表一个异步执行的结果,接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get方法得到结果,get方法会阻塞到有结果,可以通过cancel方法取消。Runnable和Callable都可以创建多线程,但是Runnable需要重写run方法,Callable需要实现call方法。Runnable的run方法无返回值,Callable的call方法有Object类型的返回值。2、实现Runnable接口实现多线程。1、继承Thread类重写run方法。
2023-12-25 23:55:59
537
原创 线程的几种状态?状态之间流转
WAITING是线程等待状态,调用wait方法,线程进入WAITING状态,当线程执行sleep方法时,线程进入TIMED_WAIT状态。就绪:线程创建后,调用了start()方法,等待线程调度并且分配cpu使用权。4、等待状态(WAITING):进入该状态的线程需要等待其他线程做出动作(通知)5、超时等待(TIMED_WAIT):该状态和等待状态不同,指定时间到了自动返回。运行中:就绪状态中的线程获取到了cpu时间片,开始执行代码。1、初始状态(new):新创建了一个线程,还没调用start()方法。
2023-12-25 23:27:32
368
原创 基于AOP实现接口请求的入参和返回日志打印
鉴于日常开发过程中,很多排查问题的情况下,需要二次操作业务流程进行入参的获取,实际操作起来增加排查问题的处理时间,为了提高效率,可以通过Aop实现接口入参以及返回的日志打印,方便快速解决问题。
2023-03-29 14:34:58
604
原创 CountDownLatch一个或者多个线程去等待其他线程完成操作统一返回
一个或者多个线程去等待其他线程完成操作统一返回;java开启多个线程,等待所有线程都执行完毕之后接口统一返回
2022-06-20 22:21:51
940
1
原创 JAVA通过EasyPoi根据模板导出word文档
1、引入依赖备注:如果没有jar包冲突,可以忽略jar排重(<exclusions>标签内内容) <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.3.0</version>
2022-03-24 12:06:00
1721
1
原创 使用MybatisPlus对List集合进行分页
public class PageListUtils { /** * 分页函数 * @param currentPage 当前页数 * @param pageSize 每一页的数据条数 * @param list 要进行分页的数据列表 * @return 当前页要展示的数据 */ public Page getPages(Integer currentPage, Integer pageSize, List list) .
2022-03-23 14:55:40
2014
原创 List<bean> 转换成List<Map>
//将listmap转换成list实体类 List<OaAttachment>list=new ArrayList<OaAttachment>(); if(Func.isNotEmpty(attachments)){ for(Map<String,Object> map:attachments){ OaAttachment fileInfo=new OaAttachment(); .
2022-02-15 17:09:20
1796
1
原创 java执行linux命令
列举个例子,其他类推:1.java删除linux服务器某个目录下的文件夹Process process =null;//文件夹路径String path = "/var/www/uploadFileResource/temp";String[] cmd = new String[] { "/bin/sh", "-c", "rm -rf "+path };try { //执行命令 process = Runtime.getRuntime().exec(cmd); lo
2022-02-14 17:09:30
5504
原创 java下载附件到本地目录
需要注意的点:/** * 下载的是图片 本地路径则是 名称.png/jpg等等 * 下载的是文档或者是pdf 本地路径则是 名称.doc/xls/pdf * */★★★本地目录后面一定要跟着文件名称String path="E:\\image\\123.jpg"; public static void main(String[] args) throws Exception { String url = "https:
2021-10-11 15:42:42
571
原创 idea远程debug调试
使用原因:由于本地环境服务正常运行,部署到linux服务器之后,服务出现报错的情况,这个时候不好排查问题,只能在本地通过以打log的方式再次将服务部署到linux服务器,以查看日志的方式来排查错误点;此办法耗时耗力,事倍功半。那么我们就可以通过远程debug的方式来直接调试linux服务器上的代码首先在服务器上的服务启动指令中设置jvm参数: nohup java -Xdebug -Xrunjdwp:transport=dt_socket,address=5500,serv...
2021-09-09 10:13:23
926
1
原创 原生js生成标签云
/** 3d标签云* 功能:鼠标移入标签,当前标签静止放大* 说明:* */window.tagcloud = (function(win, doc) { // ns // 判断对象 function isObject (obj) { return Object.prototype.toString.call(obj) === '[object Object]'; } // 构造函数 function TagCloud (options.
2021-09-03 12:25:00
710
原创 java手机号正则校验工具类
public class RegexUtils { /** * 大陆号码或香港号码均可 */ public static boolean isPhoneLegal(String str)throws PatternSyntaxException { return isChinaPhoneLegal(str) || isHKPhoneLegal(str); } /** * 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任.
2021-08-28 13:03:34
741
2
原创 RabbitMq创建队列绑定交换机
声明交换机@Beanpublic TopicExchange exchange() { return new TopicExchange(exchange);}声明队列@Beanpublic Queue delayedQueue(){ return new Queue(queue);}@Beanpublic Queue delayedQueue1(){ return new Queue(queue1);}队列绑定交换机@Beanpublic
2021-08-25 11:32:56
5762
1
转载 最详细的centos7安装jdk
jdk、mysql :https://blog.youkuaiyun.com/qq_36178165/article/details/90645085膜拜大佬
2021-08-20 11:41:09
140
原创 mysql5.7及以下版本,删除因批量新增出现的数据重复问题,多条重复数据,只保留一条。
适用范围:mysql5.7及以下版本,mysql8.0+ 可以直接使用窗口函数其中crossRecordSyscode 是唯一编码,自行根据sql语句进行改造。DELETE FROM ${tableName} where id in( SELECT t2.id FROM( SELECT t.id FROM ( SELECT @num := IF(@crossRecordSyscode = crossRecord..
2021-08-20 11:37:17
233
原创 java websocket使用@Autowired注入为null得问题
SpringBoot项目集成websocket,建立连接之后发现自动注入为NullException。因为spring是单例而websocket是多对象(每建立一次连接就生成一个对象)所以在项目启动的时候,会初始化websocket,并且注入到spring容器中,这个时候注入的service是不为null的,但是spring是单例,所以只会注入一次,当再次建立websocket连接时,这个时候对象就为NullException了。解决方案:可以通过spring上下文获取获取bean获取上下文
2021-08-20 11:16:22
936
原创 java的BigDecimal大小比较方法
//a、b均不能为nullif(a.compareTo(b) == -1){ System.out.println("a小于b");} if(a.compareTo(b) == 1){ System.out.println("a大于b");} if(a.compareTo(b) > -1){ System.out.println("a大于等于b");} if(a.compareTo(b) < 1){ System.out.println("a.
2021-08-20 11:01:15
935
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人