- 博客(72)
- 收藏
- 关注
原创 别死脑筋,赶紧学起来!Java之Stream API 常用方法使用,让开发简单起来!
Java 的 Stream API 是 Java 8 引入的一个关键特性,提供了一种声明性的方式来处理数据集合(如集合、数组等)。通过 Stream API,你可以以简洁、高效的方式执行复杂的查询、过滤、转换和聚合操作。以下是对 Stream API 的详细解释和一些示例。
2024-10-28 16:01:55
775
原创 @AutoWired和 @Resource原理深度分析!
依赖注入是一种常见的设计模式,用于实现控制反转(Inversion of Control, IoC)。在传统的编程中,类通常负责管理自己的依赖,而在 DI中,这种责任被转移到了外部容器(如 Spring容器)上,通过 DI,可以提高代码的可测试性和可维护性,因为依赖关系是通过配置而不是硬编码的。@Autowired是 Spring框架提供的注解,用于自动装配 bean。它可以用在构造器、方法、字段或参数上,Spring容器会通过类型匹配(byType)来注入依赖。@Autowired@Autowired和。
2024-10-28 15:58:43
542
原创 Java EasyExcel 导出报内存溢出如何解决
基于流式写入,不会将所有数据加载到内存中,而是使用临时文件进行缓存,这样可以显著减少内存消耗,适合百万级别数据的导出。下面我们来看一个完整的实现示例。可以处理大数据量的Excel导出,因为。使用Apache POI的。
2024-10-28 15:57:13
375
原创 【经验】Redis 持久化机制 RDB 和 AOF 区别
关于 RDB与AOF 也会经常在面试时被问到,结合自己做过的应用场景来分析和回答,会更有说服力,这会表现出你是如何善用技术的优势来解决问题,这是实战经验中的宝贵经验。关注威哥爱编程,一起卷它个底朝天。
2024-10-28 15:56:20
1872
原创 算法Day9|栈基础;232-栈实现队列;225-队列实现栈;20-有效的括号;1047-删除相邻重复项
思路:在 push 数据的时候,只要数据放进输入栈就好,但在 pop 的时候,操作就复杂一些,输出栈如果为空,就把入栈的数据猼导入进来,再从输出栈弹出数据,如果输出栈不为空,则直接从输出栈弹出数据。对于队列和栈,它们的操作是受限的,队列只能在一端插入元素,另一端删除元素;思路:一个队列在模拟栈弹出元素的时候,只要将队列头部的元素(除了最后一个元素外)重新添加到队列尾部,此时再取弹出元素就算栈的顺序了。思路很简单,就是栈实现,每放入一个元素,就从栈中取出元素判断是否相等,如果相等就出栈,直到没有重复的元素。
2024-10-27 14:23:55
342
原创 算法Day8|151-翻转字符串里的单词
什么是字符串?字符串可以理解为是一个字符串数组,在打基础的时候,不要太迷恋库函数,例如substr、split、reverse之类的。在反转字符串中,双指针法在数组、链表、字符串中很常用。字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。双指针法是字符串处理的常客。
2024-10-27 14:22:27
224
原创 RPC研究: 同步调用和异步调用获取结果技术实现分析
SYNC: 比较不错,巧妙地使用了 wait、notifyAll、done变量、requestId等, 算得上好的封装!FUTURE:封装稍微粗糙,使用上不友好!CALLBACK:封装回调中规中矩,但和 FUTURE 一样,获取结果的用法,不友好ONEWAY: 仅发送请求,简单。个人推荐用 SYNC 比较好,FUTURE、CALLBACK 不是很推荐上层封装对于使用者和阅读者不友好!那么看一看其他的 RPC 框架,会不会好一些通过对几款 RPC 的分析。同步等待获取结果异步获取结果。
2024-10-27 14:21:17
807
原创 谈一谈 Netty 的内存管理 —— 且看 Netty 如何实现 Java 版的 Jemalloc(下)
到现在为止,关于 Netty 内存池的整个设计与实现笔者就为大家剖析完了,从整个内存池的设计过程来看,我们见到了许多 OS 内核的影子,Netty 也是参考了很多 OS 内存管理方面的设计。
2024-10-25 14:28:59
1037
原创 谈一谈 Netty 的内存管理 —— 且看 Netty 如何实现 Java 版的 Jemalloc(中)
4. PoolChunk 的设计与实现如上图所示,PoolChunk 在整个内存池的架构设计中是属于最基础的数据结构,负责管理 Page 级别的内存块,Netty 中一个 Page 大小为 8K ,一个 PoolChunk 的大小为 4M , 也就是说,一个 PoolChunk 管理着 512 个 Page 。java代码解读复制代码static final class DirectArena extends PoolArena<ByteBuffer> { @Ov
2024-10-25 14:25:22
1049
原创 谈一谈 Netty 的内存管理 —— 且看 Netty 如何实现 Java 版的 Jemalloc(上)
比如第一个内存规格组内最后一个规格为 64B , 那么第二个内存规格组的 log2Group 就应该是 6。也就是从基准 size —— 64B 开始扩充组内的规格。java代码解读复制代码。
2024-10-25 14:20:01
725
原创 Java泛型
Java泛型是JDK5中引入的一个新特性,其本质是参数化类型。什么是泛型泛型,即“参数化类型一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数。在调用普通方法时需要传入对应形参数据类型的变量(实参),若传入的实参与形参定义的数据类型不匹配,则会报错。在Java1.5 之前没有泛型,通常需要使用强制类型转换的方式将一种数据类型转换为另一种数据类型,这种转换要求开发者对实际参数的类型具有可预知性。
2024-10-24 14:06:27
568
原创 OkDownload 源码分析————DownloadChain 流程分析
因为内部要支持断点续传功能,所以需要对请求的头部信息进行加工,加上相关的头部信息,用来诊断指定的资源能否支持断点续传以及分块下载的能力。这里我们先不考虑中断的情况,按照正常的下载流程,需要一直到完成的流程来分析。这里我们先不考虑中断的情况,按照正常的下载流程,需要一直到完成的流程来分析。这里处理网络可用性判断,然后就执行实际的网络请求,将请求的返回给上层。的返回数据流中一段一段的读取内容,然后写入到对应文件的相应位置。方法的循环体内,所以最终的全部都下载完成后,最后回到。,所以这里继续调用下一个拦截器了。
2024-10-24 14:04:56
362
原创 OkDownload源码分析——DownloadCall类分析
从源码看到,其继承了,而继承Runnable接口。看一下的实现java代码解读复制代码finished();从的实现中可以看到run方法内真正触发流程的执行是execute接口,所以我们对类的流程分析,应该要从execute接口实现开始。
2024-10-24 14:04:26
526
原创 Spring Boot集成iText实现电子签章
基于《中华人民共和国电子签名法》等相关法规和技术规范,具有法律效力的电子签章一定是需要使用 CA 数字证书进行对文件签名,并把 CA 数字证书存放在签名后文件中。如果一份签名后的电子文件中无法查看到 CA 数字证书,仅存在一个公章图片,那么就不属于法律意义上的电子签名。电子签名法规定电子文件签署时一定要使用CA数字证书,并没有要求一定需要含有电子印章图片,理论上电子签章不需要到公安局进行备案。实际上,电子签章是在电子签名技术的基础上添加了印章图像外观,沿袭了人们所习惯的传统盖章可视效果。
2024-10-23 14:16:46
944
原创 Java Stream API:让集合操作更优雅的利器
Java 8引入的Stream API是一种处理集合数据的高级抽象,它允许以声明式的方式对集合进行操作,使得代码更加简洁和易读。Stream不是数据结构,它不会存储数据,而是对数据源(如集合、数组等)进行一系列的操作,并返回一个新的Stream或一个最终结果。Stream操作可以分为中间操作(Intermediate Operations)和终端操作(Terminal Operations)。中间操作会返回一个新的Stream,所以可以链式调用多个中间操作,如filtermap等;
2024-10-23 14:15:35
654
原创 技术成神之路:设计模式(二十一)外观模式
外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口,使得子系统更容易使用。外观模式通过引入一个外观类,来简化与复杂系统的交互。这个外观类对外提供一个简单接口,而系统内部的复杂性被封装在外观类后面。外观模式在简化复杂系统的使用和降低系统耦合度方面发挥了重要作用。通过提供一个高层接口,外观模式隐藏了复杂的实现细节,使得系统更加易于理解和使用。
2024-10-23 14:14:48
368
原创 SpringSecurity(一)基础知识
本文主要是介绍权限管理中认证与授权的概念、权限管理框架有哪些、简单介绍,不涉及原理详细讲解,通过一个入门案例来引入SpringBoot中怎么使用。本文和接下来的几篇文章不涉及原理详细讲解,都是在讲解怎么去使用它,然后会有一篇讲解认证与授权的源码文章,最后会有一个完整的用户认证与授权的代码编写。是一个提供身份验证、授权和防止常见攻击的框架。用户认证和用户授权是重要核心功能。官方文档:spring-security6.X中文官网spring-security5.X中文网址。
2024-10-22 13:58:20
746
原创 高可用开源库之 Hystrix-01-概览
是一个延迟和容错库,旨在隔离对远程系统、服务和第三方库的访问点,防止级联故障, 并在不可避免出现故障的复杂分布式系统中恢复能力。ps: 还有一个等效的开始类,HystrixObservableCommand 此处省去不谈。实时监控和配置更改。观察服务和财产变化立即生效,因为他们分散在一个舰队。并发性意识到请求缓存。通过请求崩溃自动批处理。快速失败和快速恢复。警惕,做出决定,影响改变,在几秒钟内看到结果。带断路器的线程和信号量隔离。
2024-10-22 13:56:49
148
原创 SpringBoot启动原理
通过registerBeanDefinitions【注册很多Bean的定义】这个命名不难猜出,这里要把很多的bean注册到spring容器中,我们在register方法前加一个断点,看看这个注册类的父包是什么。总结: @AutoConfigurationPackag 的作用就是将SpringBoot 主配置类所在的包及其下面的所有子包里面的所有组件扫描到 Spring 容器中。按照英文的字面意思:开启自动配置,也能联想到,有了这个注解我们之前需要配置的一大堆的xml配置文件,现在不需要配置了。
2024-10-22 13:56:15
882
原创 shenyu源码中的extension类分析
类通过 SPI 机制,实现了动态加载扩展点接口的实现类,并提供了缓存、单例、多例、顺序控制等功能。它在框架中用于解耦业务逻辑和具体实现,使得系统具有良好的可扩展性和维护性。此类的设计借鉴了 Apache Dubbo 中的,是实现插件化架构的关键组件之一。
2024-10-21 14:00:49
810
原创 Java循环操作哪个快?
写一次stream操作耗时较少,但是会导致开发人员无意之间多次使用stream流做类似操作(如从订单类中多次取不一致但是相似的一组对象),从而导致可读性变差,不利于后续拓展尽量使用普通for循环做遍历,迭代器循环做删除或者使用collection的remove、removeIf等API实现(如果只需要删除的话)使用普通for循环比stream流节省时间,因此在提高性能的角度看开发中尽量使用普通for循环。
2024-10-21 14:00:06
307
原创 多线程交替顺序打印ABC的多种方式
面试题:有 3 个独立的线程,一个只会输出 A,一个只会输出 B,一个只会输出 C,在三个线程启动的情况下,请用合理的方式让他们按顺序打印 ABC。
2024-10-21 13:59:29
156
原创 我眼中的ReentrantLock-插队
ReentrantLock是JDK提供给开发者的一个工具锁,基于AQS(AbstractQueuedSynchronizer)实现,可用于synchronized同功能替换。其内部提供公平和非公平两种实现方式(Synchronized只有非公平),未获取到锁的线程会加入队列(公平锁和非公平锁加入队列的方式不同),由AQS维护双向队列。
2024-10-18 14:40:00
537
原创 Java中的基本循环结构详解
Java的三种基本循环结构——for循环、while循环和do-while循环——各有其适用场景。for循环适用于已知循环次数的情况,while循环适用于循环次数不确定但需要满足某个条件的情况,而do-while循环则确保循环体至少执行一次。通过合理选择和使用这些循环结构,可以编写出高效、简洁的代码。
2024-10-18 14:38:18
862
原创 博客记录-day011
场景:是一个案例中使用到了注解,我们也可以自定义一个 Conditional 的实现类,之后把这个实现类配置到需要实例化的对象上面,通过 matches 匹配条件方法的实现,决定是否实例化。用途:这个场景的用途和是一样的,只不过我们可以更好的自定义控制。
2024-10-18 14:37:45
1050
原创 内存屏障的前世今生
结合读写屏障的功能,确保读写操作的完整顺序,清空 Store Buffer 并处理 Invalid Queue,确保多核环境中的数据一致性和可见性。:MESI 通过监控各个核心之间的数据状态(嗅探机制),保证每当一个核心修改了数据,其他核心的缓存会自动将该数据标记为无效,从而保证一致性。块或方法会确保进入块或者方法之前,其他线程对共享变量的修改对当前线程可见,这相当于在进入和退出时分别插入了内存屏障。,解决多核下缓存不一致的问题,最常见的缓存一致性方案。,确保之后的读操作读取到的是主内存中的最新值。
2024-10-17 14:17:31
906
原创 泛型实战1
使用基于类型推导的泛型类,泛型方法以使代码变得更加健壮。避免使用源生类型,对于未知类型的集合请使用通配符,以加强代码的约束性。合理使用有限制的通配符,提升你的 API 灵活性。
2024-10-17 14:16:43
401
原创 Kafka 为什么Kafka 为什么要抛弃 Zookeeper?要抛弃 Zookeeper?
本文,我们分析了为什么 Kafka 要移除 ZooKeeper,主要原因有两个:ZooKeeper不能满足 Kafka的发展以及 Kafka想创建自己的生态。在面临越来越复杂的数据流处理需求时,KRaft 模式为 Kafka 提供了一种更高效、简洁的架构方案。不论结局如何,Kafka 和 ZooKeeper曾经也度过了一段美好的蜜月期,祝福 Kafka 在 KRaft模式越来越强大,为使用者带来更好的体验。
2024-10-16 19:26:59
1066
原创 String类型
来创建字符串时,JVM会首先检查字符串常量池。如果池中存在相同值的字符串对象,返回池中对象的引用;如果没有,JVM会在池中创建一个新的字符串对象并返回其引用。关键字创建字符串时,JVM不会去检查字符串常量池,而是直接在堆内存中创建一个新的对象,即使常量池中已经有了相同的字符串对象。来一道思考题:很明确,代码输出的结果是:"111111222222",但是它工作原理是怎样的呢?等)看起来像是对原字符串进行了修改,但实际上它们返回的是新的。通过直接量创建,因此会放入字符串常量池中。来存储字符串的字符。
2024-10-16 16:17:56
289
原创 Java 源码阅读 - Iterable (可迭代对象)
Iterable是Collections - 集合的父类, 也是所有集合相关的数据结构的基础接口, 我在自己的项目中发现有大约 6000 多个三方包都实现了这个接口, 其中不乏有 Netty, Gurva 这类知名的第三方包, 因此读懂这个类对于理解 Java 的集合是非常有必要的。
2024-10-15 14:26:08
401
原创 老板爱瞎改权限怎么办:注解结合AOP打造复杂权限体系
组织权限通常指的是基于用户所属组织结构的权限。这种权限控制方式允许系统根据用户所在的部门、团队或公司层级来限制或授权访问。例如,一个公司的财务部门可能只能访问与财务相关的数据和功能,而不能访问人力资源或研发部门的数据。个人权限则是指分配给特定用户的权限,与用户所属的组织结构无关。这种权限控制方式允许系统为每个用户定制访问控制,以满足个性化的需求。例如,一个销售代表可能被授权访问客户数据,但仅限于他们自己的客户记录。注解用于标记需要特定权限才能访问的方法。
2024-10-15 14:25:38
916
原创 Redis数据持久化详解:从RDB到AOF再到混合持久化
RDB是Redis默认的持久化方式,它会在指定的时间间隔内生成数据集的快照,并将其保存到磁盘上。RDB文件是一个紧凑的二进制文件,适合备份和灾难恢复。AOF是另一种持久化方式,它记录每个写操作并将其追加到日志文件中。AOF文件可以重放日志中的命令来重建数据集。
2024-10-15 14:25:02
500
原创 分布式定时任务XXL-Job源码阅读
分布式:把一个大业务拆分成多个子业务,每个子业务都是一套独立的系统,子业务之间相互协作最终完成整体的大业务。集群:把处理同一个业务的系统部署多个节点。部署在不同服务器上的相同系统必然要做负载均衡。集群主要是简单加机器解决问题,对于问题本身不做任何分解。集群和分布式都是由多个节点组成,但集群中各节点间基本不需要通信协调,而分布式中各个节点的通信协调是必不可少的比如我们一个用户服务集群之间都没啥通信,但是用户服务和订单服务构成一个分布式系统经常要相互调用但其实往往说。
2024-10-14 14:17:34
1060
原创 深入浅出Java多线程
线程同步队列使用实现,它能够自动处理线程间的同步问题,适合生产者-消费者模型。双向队列使用Deque接口及其实现类,提供线程安全的双向队列操作。单向队列(也称为FIFO 队列,First In First Out)是一种只能从一端插入元素,从另一端移除元素的数据结构。队列遵循先进先出(FIFO)原则,首先加入队列的元素会首先被取出。在 Java 中,可以使用Queue接口及其常见实现类(如LinkedList或ArrayDeque)来实现单向队列。
2024-10-14 14:15:34
958
原创 一种失传已久的 SQL 多表连接查询,你从来没有见过的独门写法
使用 Hibernate 的代价就是你的心智负担很大。除了要学习很多注解以外,还有很多夸张的概念需要深入理解,才能够写出能正常运行的代码。这样的结果是无法返回给客户端直接使用的。那么,有没有一种简单的方法,可以通过 SQL 的方式,直接查询出这种嵌套的结果集, 然后扔给客户端进行处理呢?这是显而易见的,因为这是一个 "Flatten" 的结果。不幸的是这样的处理非常麻烦,你 join 的表越多这个代码越不好写,不相信你可以试试。假设你有这样一个 n2n 的关系表,代表用户和角色之间的关系。
2024-10-14 14:10:52
402
原创 CyclicBarrier,CountDownLatch,Semaphore的实现原理,以及使用场景
适合多线程协调的阶段性同步,所有线程需要同时达到某个状态才继续执行,且可以重用。适合一次性等待其他线程完成某些操作,倒计时计数器达到 0 后,阻塞的线程才会被唤醒。Semaphore用于控制并发线程的数量,限制访问共享资源的线程数,适合限流或资源保护场景。
2024-10-11 16:17:29
440
原创 通过Java请求使用API获取商品数据:解锁电商洞察
在电子商务的快速变化中,获取实时商品数据是企业做出快速决策的关键。Java,作为一种成熟且广泛使用的编程语言,提供了强大的工具和库来发送HTTP请求和处理API响应。本文将向您展示如何使用Java请求使用API获取商品数据,以及如何利用这些数据来增强您的业务洞察力。
2024-10-11 16:14:53
412
原创 【JVM系列】内存布局详解
熟悉 Java 语言特性的同学都知道,相比 C、C++ 等编程语言,Java 无需通过手动方式回收内存,内存中所有的对象都可以交给 Java 虚拟机来帮助自动回收;而像 C、C++ 等编程语言,需要开发者通过代码手动释放内存资源,否则会导致内存溢出。尽管如此,如果编程不当,Java 应用程序也可能会出现内存溢出的现象,例如下面这个异常!java代码解读复制代码它表示当前服务已出现内存溢出,简单的说就是当服务出现了内存不足时,就会抛异常。这种异常是怎么出现的呢?该如何解决呢?
2024-10-11 16:08:19
399
原创 Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
2024-10-10 14:53:16
654
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人