
Java
文章平均质量分 89
加班不秃顶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
聊聊Maven的依赖传递、依赖管理、依赖作用域?
作用域为compile的依赖,在编译、测试和运行时都是可用的,并且会参与项目的打包过程,该依赖会传递给依赖该模块的其他模块。作用域为provided的依赖,在编译和测试时是可用的,在运行时是不可用的,不会参与项目的打包过程,也不会传递给其他模块。作用域为runtime的依赖,在测试和运行时是可用的,在编译时是不可用的,会参与项目的打包过程,也会传递给依赖该模块的。每个项目,一般都会继承自一个父项目,在实际的工作中,这个父项目一般都是公司架构组提供的带有公司特色的一个基础项目,原创 2025-06-20 17:10:35 · 214 阅读 · 0 评论 -
如何使用Java获取货币符号?
最近做了一个支付相关的需求,要求在收银台页面显示商品的价格时带上货币符号¥,类似下图中的格式:最初我是用的下面这样的代码:本机测试,正常返回¥,如下图所示:但部署到服务器后,发现服务器返回的是CNY,而不是预期的¥。于是将上面的代码改成了下面这样:本机测试,返回¥,部署到服务器后,也返回¥。为什么在本机返回¥,而在服务器返回CNY呢?带着这个疑问,看了下方法的源码,发现其内部有获取默认区域设置的逻辑:因为我本机是简体中文环境,所以获取到的默认区域设置是zh_CN:这个和传入的是一致的:因此原创 2025-06-20 17:09:20 · 179 阅读 · 0 评论 -
为什么要谨慎使用Arrays.asList、ArrayList的subList?
方法可以在一些简单的场合使用,比如快速声明一个集合,判断某个值是否在允许的范围内:但声明后不要再调用add等方法修改集合,否则会报异常。ArrayList的subList方法,返回的是原集合的一个子集合(视图),非结构性修改任意一个集合的元素的值,都会彼此影响,结构性修改原集合时,会报异常,结构性修改子集合时,会影响原集合,所以使用时要注意,避免程序错误或者异常。原创 2025-06-20 17:01:41 · 193 阅读 · 0 评论 -
使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值
使用Java Stream操作集合非常便利,但还是容易踩一些坑,比如文中提到的异常和异常,所以使用时要多多注意,能不踩坑就不踩坑,就算踩坑,也别多次踩同一个坑。原创 2025-06-20 17:00:30 · 605 阅读 · 0 评论 -
Redis深入浅出【九】Redis的事务机制
Redis的事务提供了一种将多个命令打包,然后一次性、有序地执行的机制,它的原理是多个命令会被入队到事务队列中,然后按先进先出(FIFO)的顺序执行,并且事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。原创 2025-06-20 16:57:38 · 361 阅读 · 0 评论 -
Redis深入浅出【八】发布与订阅
Redis的事务提供了一种将多个命令打包,然后一次性、有序地执行的机制,它的原理是多个命令会被入队到事务队列中,然后按先进先出(FIFO)的顺序执行,并且事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。原创 2025-06-19 21:37:02 · 983 阅读 · 0 评论 -
深入浅出Redis【七】发布与订阅
SUBSCRIBEPSUBSCRIBE这7个命令的核心都是基于存储在服务器状态的字典和链表实现的。原创 2025-06-19 21:36:00 · 815 阅读 · 0 评论 -
深入浅出Redis【六】设置/移除键的过期时间
是Time To Live的缩写,用来查看某个key的剩余生存时间,单位为秒。类似,也是用来查看某个key的剩余生存时间,但单位为毫秒。类似,也是用来给指定的key设置过期时间,但单位为毫秒。命令用来给指定的key设置过期时间,但指定的是某个时间点。如果key不存在或者key没有设置过期时间,返回0。类似,用来给指定的key设置过期时间,但指定的是点。命令用来给指定的key设置过期时间,单位为秒。如果key没有设置过期时间,返回-1。如果key没有设置过期时间,返回-1。命令用来移除指定key的过期时间。原创 2025-06-19 21:34:29 · 368 阅读 · 0 评论 -
深入浅出Redis【五】Redis的过期键删除策略?
对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费,因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢?原创 2025-06-18 21:12:04 · 993 阅读 · 0 评论 -
深入浅出Redis【四】Redis的复制机制(主从复制)
还有个原因就是,虽然Redis的性能很好,但单台毕竟还是有瓶颈的,使用主从复制可以实现读写分离,提高Redis的高可用性,即主服务器用来执行写命令,多个从服务器用来执行读命令,类似于数据库的读写分离。,当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。举个具体的例子,从服务器B一直在复制着主服务器A,刚开始都是正常的,主服务器A执行的写命令也都通过命令。原创 2025-06-18 21:11:02 · 850 阅读 · 0 评论 -
深入浅出Redis【三】Redis的持久化机制(RDB、AOF)
为了解决AO文件体积越来越大的问题,Redis提供了AOF文件重写功能,即Redis服务器会创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库数据相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小很多。由上述实现方式可知,RDB持久化记录的是结果,AOF持久化记录的是过程,所以AOF持久化生成的AOF文件会有体积越来越大的问题,Redis提供了AOF重写功能来减小AOF文件体积。原创 2025-06-18 21:09:58 · 815 阅读 · 0 评论 -
深入浅出Redis【二】Redis的5种数据结构及其常用命令
注意事项:Redis可以存储键(key)值(value)对的映射,其中键(key)一直是String,而值可以是上面提到的5种数据结构中的一种。原创 2025-06-18 21:08:39 · 962 阅读 · 0 评论 -
深入浅出Redis【一】Redis简介及环境安装
什么是Redis呢?Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。它支持诸如字符串、散列、列表、集合、有序集合等数据结构。--Redis官网Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的高性能的key-value数据库。-- 百度百科Redis是一款依据BSD开源协议发行的高性能key-value存储系统,通常被称为数据结构服务器。-- 其它网友。原创 2025-06-18 21:07:41 · 985 阅读 · 0 评论 -
面试官:聊一下你对MySQL索引实现原理?
在数据库中,如果索引太多,应用程序的性能可能会受到影响,如果索引太少,又会对查询性能产生影响。所以,我们要追求两者的一个平衡点,足够多的索引带来查询性能提高,又不因为索引过多导致修改数据等操作时负载过高。InnoDB支持3种常见索引,我们接下来要详细讲解的就是 B+ 树索引,哈希索引,全文索引。原创 2025-06-17 20:35:23 · 747 阅读 · 0 评论 -
面试官:你了解CAS吗?有什么问题吗?如何解决?
CAS全称,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现多线程之间的变量同步。内部的AQS和原子类内部都使用了CAS。需要读写的内存值V。进行比较的值A。要写入的新值B。只有当V的值等于A时,才会使用原子方式用新值B来更新V的值,否则会继续重试直到成功更新值。在Java中,CAS操作主要通过java.util.concurrent.atomic包中的类来实现。例如,AtomicInteger、AtomicBoolean、AtomicReference等。原创 2025-06-17 20:31:46 · 796 阅读 · 0 评论 -
线程池中execute和submit的区别?
else if (workerCountOf(recheck) == 0) // 当线程池中的workerCount为0时,此时workQueue中还有待执行的任务,则新增一个addWorker,消费workqueue中的任务。corePoolSize : maximumPoolSize)) // 工作线程数>=线程池容量 || 工作线程数>=(核心线程数||最大线程数)// 线程池不接受新的任务且不会处理阻塞队列中的任务,并且会中断正在执行的任务。// 线程池不接受新任务,但会处理阻塞队列中的任务。原创 2025-06-17 20:29:44 · 528 阅读 · 0 评论 -
Java面试官:Synchronized是怎么实现的?
可重入锁是一种特殊的互斥锁,它允许同一个线程在持有锁的情况下再次获取该锁。也就是说,同一个线程可以多次获取同一个可重入锁,而不会发生死锁。在 Java 中,synchronized关键字就是一种可重入锁。当一个线程使用synchronized修饰的方法或代码块时,它会获得该对象的锁。如果该线程在持有锁的情况下再次调用同一个对象的synchronized方法或代码块,那么它会再次获得该对象的锁,而不会等待其他线程释放锁。可重入锁的好处是可以避免死锁的发生。原创 2025-06-17 20:26:58 · 947 阅读 · 0 评论 -
【Spring Boot】Spring Boot Debug调试?
在使用spring-boot:run进行启动的时候,如果设置的断点进不去,要进行以下的设置。原创 2025-06-16 20:53:11 · 137 阅读 · 0 评论 -
【SpringBoot】Spring Boot实现热部署?
以下配置用于自定义配置热部署,可以不设置。# 热部署开关,false即不启用热部署# 指定热部署的目录# 指定目录不更新。原创 2025-06-16 20:50:48 · 364 阅读 · 0 评论 -
【Spring Boot】Spring Boot 集成 Mybatis 实现双数据源?
这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源实现数据库的读写分离。原创 2025-06-16 20:46:21 · 240 阅读 · 0 评论 -
Java面试:@Resource 和 @Autowired 的区别?
目前在项目中一般使用 @Resource,因@Resource是Java标准中的注解,更契合些。我们在IDEA中使用@Autowired注解时,IDEA会在@Autowired下打个波浪线,给你说是不推荐的。跟 @Resource 和 @Autowired 功能相似的注解。原创 2025-06-16 20:43:13 · 833 阅读 · 0 评论 -
Java面试:@Transactional 什么情况下会失效?
注解在 Spring 中用于声明式事务管理,但在某些场景下会失效。后调用。通过 AopContext 获取代理:((MyService) AopContext.currentProxy()).b()(需开启 @EnableAspectJAutoProxy(exposeProxy = true))。我更喜欢把逻辑写到另一个类中,然后再进行调用。默认只捕获 RuntimeException和 Error。若抛出 IOException等,事务不会回滚。若异常被 catch后未重新抛出,事务失效。原创 2025-06-16 19:30:41 · 895 阅读 · 0 评论 -
对象一定分配在堆中吗?聊聊TLAB和逃逸分析技术!
逃逸分析(Escape Analysis),是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。一个对象在方法中被定义后,对象如果只在方法内部使用,则认为没有发生逃逸;(没有发生逃逸的对象,会在栈上分配)当一个对象在方法中被定义后,它被外部方法所引用,则认为发生了逃逸。如何快速的判断是否发生了逃逸分析?看new的对象实体是否有可能在方法外被调用。原创 2025-06-12 21:17:59 · 827 阅读 · 0 评论 -
聊聊jvm的内存结构, 以及各种结构的作用!
定义:Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境)【下载】Java面试题、Java八股文、Java涨薪场景题(PDF文档)线程私有的,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址。定义:每个线程在创建的时候都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次 Java 方法调用,是线程私有的,生命周期和线程一致。原创 2025-06-12 21:16:32 · 843 阅读 · 0 评论 -
【Redis】认识Redis集群!
Redis单实例的架构,从最开始的一主N从,到读写分离,再到Sentinel哨兵机制,单实例的Redis缓存足以应对大多数的使用场景,也能实现主从故障迁移。但是,在某些场景下,单实例存Redis缓存会存在的几个问题:写并发:Redis单实例读写分离可以解决读操作的负载均衡,但对于写操作,仍然是全部落在了master节点上面,在海量数据高并发场景,一个节点写数据容易出现瓶颈,造成master节点的压力上升。原创 2025-06-12 21:11:47 · 1001 阅读 · 0 评论 -
【Redis】Redis探秘Sentinel(哨兵模式)!
Redis的高可用机制有持久化、复制、哨兵和集群。持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。复制:复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。哨兵实现了主从复制中故障的自动化恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限制。原创 2025-06-12 21:10:09 · 969 阅读 · 0 评论 -
【Redis】一文聊清楚Redis主从复制原理
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点,而对于redis来说,一主两从是比较常见的搭配。主节点(Master)同时对外提供读和写操作从节点(Slave)通过replicate同步的方式,从主节点复制数据,保持自身数据与主节点一致从节点只能对外提供读操作当然,对于读多写少类的操作,为了提升整体读请求的处理能力,可以采用一主多从的方式。原创 2025-06-12 21:03:56 · 940 阅读 · 0 评论 -
【Redis】Redis中常见的延迟问题 !
使用复杂度高的命令,执行命令时就会耗时存储大key:如果一个key写入的数据非常大,Redis在分配内存、删除大key时都会耗时,并且持久化AOF的写回策略是always时会影响Redis性能集中过期:Redis的主动过期的定时任务,是在Redis主线程中执行的,最差的情况下会有25ms的阻塞实例内存达到上限时,淘汰策略的逻辑都是在访问Redis时,真正命令执行之前执行的,也就是它会影响真正需要执行的命令。原创 2025-06-04 11:30:00 · 801 阅读 · 0 评论 -
【Redis】Redis中的分布式锁(步步为营)!
分布式锁指的是,所有服务中的所有线程都去获取同一把锁,但只有一个线程可以成功的获得锁,其他没有获得锁的线程必须全部等待,直到持有锁的线程释放锁。分布式锁是可以跨越多个实例,多个进程的锁互斥性:任意时刻,只能有一个客户端持有锁锁超时释放:持有锁超时,可以释放,防止死锁可重入性:一个线程获取了锁之后,可以再次对其请求加锁高可用、高性能:加锁和解锁开销要尽可能低,同时保证高可用安全性:锁只能被持有该锁的服务(或应用)释放。容错性:在持有锁的服务崩溃时,锁仍能得到释放,避免死锁。原创 2025-06-04 10:30:00 · 833 阅读 · 0 评论 -
【Redis】Redis究竟为什么这么快?
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,然后程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。在redis的多线程模式下,获取、解析命令,以及输出结果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是命令的执行,也就是内存操作,依然是单线程运行的。原创 2025-06-04 09:30:00 · 680 阅读 · 0 评论 -
【Redis】万字长文带你深入Redis底层数据结构!
Redis 的键值对中的 key 就是字符串对象,而 value 就是指Redis的数据类型,可以是String,也可以是List、Hash、Set、 Zset 的数据类型。其实是Redis 底层使用了一个保存所有键值对,哈希表的最大好处就是 O(1) 的时间复杂度快速查找到键值对。哈希表其实就是一个数组,数组中的元素叫做哈希桶。cstruct redisServer { //... redisDb *db; //... int dbnum; //默认16个}typedef str原创 2025-06-04 07:30:00 · 1828 阅读 · 0 评论 -
【Redis】Redis中常见的数据类型及其应用场景!
适用于二值状态统计的场景。原创 2025-06-03 13:24:14 · 550 阅读 · 0 评论 -
一文带你了解什么是servlet!
Servlet是在服务器端运行的Java程序,可以接收客户端请求并做出响应,是基于 Java 技术的 web 组件,该组件由容器托管,用于生成动态内容。他是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。servlet说实在点就是个接口,浏览器发送请求给Tomcat(服务器),若是这个请求正好对应了servlet实现类的请求路径,Tomcat就会使用它来响应浏览器,这也就是request(请求)、response(响应)了。java。原创 2025-06-03 13:21:20 · 466 阅读 · 0 评论 -
《深入理解Mybatis原理》Mybatis中的缓存实现原理!
每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据库,而我们在极短的时间内做了完全相同的查询,那么它们的结果极有可能完全相同,由于查询一次数据库的代价很大,这有可能造成很大的资源浪费。原创 2025-06-03 13:20:15 · 720 阅读 · 0 评论 -
《深入理解Mybatis原理》MyBatis事务管理机制 !
对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等。使用MANAGED的事务管理机制。原创 2025-06-03 13:19:07 · 953 阅读 · 0 评论 -
《深入理解Mybatis原理》MyBatis数据源与连接池详解!
创建一个java.sql.Connection对象的代价是如此巨大,是因为创建一个Connection对象的过程,在底层就相当于和数据库建立的通信连接,在建立通信连接的过程,消耗了这么多的时间,而往往我们建立连接后(即创建Connection对象后),就执行一个简单的SQL语句,然后就要抛弃掉,这是一个非常大的资源浪费!这是要使用代理模式,为真正的Connection对象创建一个代理对象,代理对象所有的方法都是调用相应的真正Connection对象的方法实现。这个数据源的实现会每次请求时打开和关闭连接。原创 2025-06-02 21:46:30 · 1040 阅读 · 0 评论 -
《深入理解Mybatis原理》Mybatis插件机制&分页机制原理!
在实现里大量使用了MetaObject这个对象,因此有必要先介绍下它。MetaObject是Mybatis提供的一个的工具类,通过它包装一个对象后可以获取或设置该对象的原本不可访问的属性(比如那些私有属性)。MetaObject forObject(Object object,ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) 用于包装对象;原创 2025-06-02 21:45:34 · 936 阅读 · 0 评论 -
《深入理解Mybatis原理》MyBatis动态SQL原理!
SqlSessionFactoryBean实现了Spring的InitializingBean接口,InitializingBean接口的afterPropertiesSet方法中会调用buildSqlSessionFactory方法 该方法内部会使用XMLConfigBuilder解析属性configLocation中配置的路径,还会使用XMLMapperBuilder属性解析mapperLocations属性中的各个xml文件。文本节点跟之前一样处理,if节点使用IfHandler处理。原创 2025-06-02 21:44:21 · 879 阅读 · 0 评论 -
《深入理解Mybatis原理》MyBatis的sqlSession执行流程!
由于数据库会话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。这里面最重要的一句其实就是最后一句代码,它的作用是用合适的TypeHandler完成参数的设置。在mybatis中,通过MapperProxy动态代理咱们的dao, 也就是说, 当咱们执行自己写的dao里面的方法的时候,其实是对应的mapperProxy在代理。原创 2025-05-30 17:04:14 · 840 阅读 · 0 评论 -
深入理解Mybatis原理》MyBatis配置解析过程!
假如我们系统的开发环境和正式环境所用的数据库不一样(这是肯定的), 那么可以设置两个environment, 两个id分别对应开发环境(dev)和正式环境(final),那么通过配置environments的default属性就能选择对应的environment了, 例如,我将environments的deault属性的值配置为dev, 那么就会选择dev的environment。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。原创 2025-05-30 16:54:08 · 768 阅读 · 0 评论