- 博客(14)
- 收藏
- 关注
原创 理解代码中的<T extends Comparable<? super T>>
摘要:这段Java泛型代码展示了经典的"PECS"原则应用。通过<T extends Comparable<? super T>>声明,首先用extends约束类型T必须实现Comparable接口,确保对象可比较。更精妙的是<? super T>下限限定,允许比较器类型为T或其父类,使方法更具灵活性。例如Integer既可用Comparable<Integer>比较,也可用父类Number的比较器。这种设计既保证了类型安全,又扩展了方法的
2025-07-08 11:53:25
521
原创 java SPI 理解
java// 服务接口SPI:SPI 定义了服务接口,这是一种规范,服务提供者需要按照这个接口来实现具体的服务。例如在 JDBC 中,接口规定了数据库驱动需要实现的方法,不同的数据库厂商(如 MySQL、Oracle)要实现这个接口来提供各自的数据库驱动服务。模板模式:模板模式定义了一个抽象类,其中包含了一个模板方法和一些抽象方法或具体方法。模板方法定义了算法的骨架,而抽象方法则由子类去实现具体的步骤。
2025-04-24 17:47:03
377
原创 JVM 的三色标记法
例如,假设对象E已经被标记为灰色(表示已经被访问过,但其引用的对象尚未全部访问),此时用户线程执行了objD.fieldE = null,断开了D对E的引用。但由于E已经被标记为灰色,它仍然会被当作存活对象继续遍历,最终E、F、G等对象都会被标记为黑色(表示存活),从而不会被回收。显然在可达性分析刚刚开始的阶段, 所有的对象都是白色的, 若在分析结束的阶段, 仍然是白色的对象, 即代表不可达。漏标问题是指原本应该被标记为存活的对象,却被错误地标记为垃圾对象,从而导致这些对象被错误地回收。
2025-04-16 11:40:45
920
原创 使用HandlerMethodArgumentResolver在 Controller 方法参数中 自动注入自定义对象
使用HandlerMethodArgumentResolver在 Controller 方法参数中 自动注入自定义对象。
2025-04-03 17:15:44
454
原创 判断一个数是不是质数
为什么从5开始检查质数时,只需要检查形如 i 和 i+2 的数,而这里的 i 是以6为周期的(即 i = 6k + 5)。这背后的原因与质数的分布规律有关,特别是与数字的模6运算有关。因此,从5开始检查质数是有意义的,因为小于5的数(除了2和3)都不是质数。只有 6k + 1 和 6k + 5(即6k - 1)可能是质数。这样,我们就可以覆盖所有可能的质数形式,而无需检查其他数。可以看到,除了2和3之外,所有质数都符合这种规律。
2025-03-18 14:10:53
387
原创 Java中的协变(Covariance)逆变(Contravariance)与抗变(Invariant)
协变,逆变,抗变等概念是从数学中来的,在编程语言Java/Kotlin/C#中主要在泛型中使用。其描述的是两个类型集合之间的继承关系。假设两个类,Animal 和 Dog, Dog是Animal的子类还有两个集合 List<Animal> 和 List<Dog>。现在问题来了,由于Dog是Animal的子类,那么List<Dog>就是List<Animal>的子类这句话在Java中对吗?答案是否定的。我们这里要说的协变,逆变,抗变就是描述上面两个类型集合的关系的。
2025-01-08 11:14:45
874
原创 如何系统的学习arthas?
这个就是很经典的监控问题了,从客户端看,接口很慢,从服务端看,接口又不慢,而且相差特别大,这个时候,最容易想到的可能是网络问题,但是双方都是在内网千兆网环境的,最不可能出现的问题恰恰是网络,那么怎么办?我想这是最容易想到的问题了吧,某个接口响应慢了,但是你就是不知道慢在哪,即便是高级点的还有全链路跟踪的系统系统,也不一定能够把耗时的东西彻底揪出来,因为全链路跟踪也只是外部调用的耗时能够统计到,内部逻辑(比如你来个sleep一天)是无法精确统计到的,至于为什么,这个问题我会出专题来讲述,这里就不多啰嗦了。
2024-09-02 14:02:17
1388
原创 springboot的@Async注解的默认线程池
相信刚刚使用springboot不久的后端开发经常会听到或者看到类似的言论:在使用@Async的时候,需要指定线程池,如果不指定的话,会使用SimpleAsyncTaskExecutor线程池。为每个任务启动一个新线程,异步执行它。支持通过"concurrencyLimit" bean 属性限制并发线程。默认情况下,并发线程数是无限的。此实现不重用线程!= null?每次执行任务的时候都默认创建线程池。
2024-01-22 15:04:58
4692
2
原创 java 线程池相关
线程池总共存在5种状态,定义在ThreadPoolExecutor类中,具体代码如下:线程池的5种状态具体如下:状态流转如下:具体线程的分配方式当一个任务被添加到线程池:图解线程池实现原理为什么要用ctl?线程池在执行任务时,需要多次判断线程池状态,来确实任务是否需要执行(以哪种方式执行)execute()——>addWorker()——>compareAndIncrementWorkerCount()
2023-04-27 17:39:37
141
原创 Java的日志系统
日志重要吗?大家排查问题,数据统计分析、故障定位都依赖日志,甚至有的公司直接用日志的输出,经过统计做业务系统的输入。所以日志实在太重要了,大家几乎每天都在用日志,那都知道用的是什么日志框架,以及实现的原理吗?大家平时用的日志框架是什么?log4j 和logback吗?和slf4j什么区别?
2023-04-26 18:04:55
850
原创 Java中的锁升级过程 -- 无锁、偏向锁、轻量级锁、重量级锁
网上太多关于JAVA 锁和锁升级的文章,最要命的是其实文章讲的内容还互相有出入,每篇文章下面都有疑问和争论。因此,这并不是一篇说明和科普,我也只是纯纯的记录。。。。。。。。。
2023-04-25 16:47:04
1505
5
原创 泛型和泛型擦除
泛型方法能使方法独立于类而产生变化,以下是一个基本的指导原则:无论何时,如果你能做到,你就该尽量使用泛型方法。也就是说,如果使用泛型方法将整个类泛型化,那么就应该使用泛型方法。另外对于一个static的方法而已,无法访问泛型类型的参数。所以如果static方法要使用泛型能力,就必须使其成为泛型方法。
2023-04-25 11:34:38
286
1
原创 从倒排索引到全文索引
MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引,InnoDB存储引擎并不支持全文索引技术,大多数的用户转向MyISAM存储引擎,虽然可以通过表的拆分,将进行全文索引的数据存储为MyIsam表,这样方式解决逻辑业务的需求,但是却丧失了INNODB存储引擎的事务性;ps:上述的分词是我随便分的,中文的分词是个很难搞的事情,比如『真好』就可以成『真』、『好』、『真好』,这样就会得到不同的结果,这也是我觉得中文的自然语言处理比英文麻烦的原因之一,毕竟,英文天生就是一个一个词汇组成。
2023-04-19 18:46:03
241
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人