自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题

本文讨论了ArrayList的线程安全问题及其解决方案。通过多线程并发测试验证了ArrayList的非线程安全性,指出了可能出现的null值、索引越界和size计数错误问题。提供了三种线程安全解决方案:Collections.synchronizedList()、CopyOnWriteArrayList和使用Vector。重点分析了CopyOnWriteArrayList的实现原理,包括volatile修饰数组、写操作加锁及写时复制机制。还解析了ArrayList的扩容机制(默认容量10,扩容1.5倍)。文

2025-11-04 13:53:51 1021

原创 《深入浅出RabbitMQ:从零基础到面试通关》

本文介绍了消息队列的核心概念及其在分布式系统中的应用。消息队列采用FIFO结构实现进程间通信,主要解决系统耦合、提高性能、保证数据可靠性等问题。RabbitMQ作为主流消息队列,其核心组件包括生产者、消费者、队列、交换机等。文章详细解析了RabbitMQ的延迟消息实现(死信队列和插件)、死信队列机制及防止重复消费的方案(幂等性、消息确认、持久化等)。这些知识点不仅是实际开发中的重要工具,也是后端开发岗位的高频面试题,理解这些概念对设计高可用分布式系统至关重要。

2025-08-03 23:16:42 1856

原创 《秋招在即!Redis缓存三大坑:穿透、击穿、雪崩详解与实战解决方案

本文介绍了三种常见的缓存问题及解决方案。缓存击穿指热点key失效导致请求直接访问数据库,可通过互斥锁、逻辑过期或京东hotkey中间件解决;缓存穿透是查询不存在的数据导致数据库压力过大,建议采用参数校验、缓存空值结合布隆过滤器;缓存雪崩是大量key同时失效或Redis宕机,可通过随机过期时间、多级缓存、预热和集群高可用预防。这些方案在实际开发中常需组合使用,是保障系统稳定性的重要技术手段。

2025-07-30 21:04:07 1275

原创 蓝桥杯Python算法竞赛常用的函数库

most_common(x):返回出现频率最高的 x 个元素及其出现次数,以元组列表的形式返回。使用dict时,当访问一个不存在的key,就会抛出KeyError。如果希望这个key不存在时,会使用提供的默认工厂函数创建一个默认值。在字典中获益key有两种方式,第一种是get,第二种通过[]获取。2.repeat:表示这些可迭代序列重复的次数。elements():返回一个迭代器,每个元素重复对应次数。用于计数,他可以统计列表中每个元素出现的次数。2.操作序列和集合方面的函数。clear():清空。

2024-07-20 12:23:55 2806

原创 Go和Java的语言特性对比

摘要:Go和Java在语言设计、并发模型、性能指标等方面存在显著差异。Go以简洁高效著称,采用轻量级goroutine和channel实现并发,适合云原生、高并发场景;Java强调面向对象和可移植性,线程模型较重量级,适用于企业级复杂系统。性能上Go在编译速度、内存占用和启动时间占优,而Java在JIT优化后性能接近Go。语法方面Go更简洁,Java更完整但复杂。未来Go将完善泛型支持,Java则聚焦低延迟和值类型优化。两者各有优势,需根据具体场景选择。

2025-11-24 21:25:54 371

原创 《后端开发者快速上手:Vue3 + Element Plus 前端开发概念映射与实战技巧》

本文总结了前端Vue与后端概念的对应关系,主要包括数据绑定、组件、属性、数据流和函数调用的映射。介绍了常见模式如搜索表单、下拉选择和表格列的写法,并提炼了5个记忆口诀。还涉及高级概念如模板插槽、组件导入和字典系统的使用。全文通过前后端类比,帮助开发者理解Vue的核心概念和Element UI组件的应用场景。

2025-11-19 23:23:01 861 2

原创 Java并发常用的工具以及常见面试题

本文介绍了Java中常见的并发工具类及其应用。CountDownLatch通过计数器实现线程协调,当计数器归零时唤醒等待线程;CyclicBarrier让一组线程相互等待至公共屏障点,可重复使用;Semaphore通过许可证机制控制并发线程数;Callable接口支持有返回值的任务执行;Future用于获取异步任务结果。文中对每个工具都提供了示例代码和核心原理说明,并包含CountDownLatch的面试题解答,强调其通过计数器递减实现线程同步的特性。

2025-11-15 00:04:06 723

原创 Java并发实战:ConcurrentHashMap原理与常见面试题续集

摘要:本文探讨了线程安全HashMap的设计方案,对比了CAS+分段机制和Copy-on-Write两种实现方式的特点。同时解答了ConcurrentHashMap的锁策略问题,指出其同时使用CAS(乐观锁)和synchronized(悲观锁)的混合机制,并解释了不同场景下的选择依据,包括初始化阶段的无锁优化和桶操作时的锁机制应用。

2025-11-06 15:17:09 284

原创 Java并发实战:ConcurrentHashMap原理与常见面试题

摘要:本文探讨了Java中HashMap在多线程环境下的线程安全问题。通过代码示例展示了并发修改HashMap导致的ConcurrentModificationException异常,并提供了两种解决方案:使用synchronized同步代码块和采用ConcurrentHashMap。重点分析了JDK1.8中ConcurrentHashMap的put方法实现,结合CAS和synchronized实现高效并发控制,同时对比了1.7和1.8版本的设计差异。最后提出了关于线程安全HashMap设计的思考题

2025-11-06 14:44:29 1307

原创 Java并发Set集合实战:CopyOnWriteArraySet与常见Set集合面试题

本文探讨了Java并发环境下Set集合的安全性。通过模拟50个线程并发操作HashSet的实验,展示了线程不安全导致的ConcurrentModificationException异常。文章指出HashSet在并发状态下不是线程安全的,并给出了两种解决方案:使用Collections.synchronizedSet包装的同步Set或采用线程安全的CopyOnWriteArraySet。后者基于写时复制机制,特别适合读多写少的并发场景。通过实验验证,CopyOnWriteArraySet能有效避免并发异常

2025-11-05 00:23:07 669

原创 ArrayList常见面试题二

【摘要】本文是Java集合系列文章的续篇,主要对比ArrayList和LinkedList的区别。两者底层实现不同:ArrayList基于动态数组,支持快速随机访问;LinkedList基于双向链表,插入删除效率更高但随机访问较慢。文章分析了它们在数据结构、访问性能上的差异,适合作为面试准备和开发实践的参考。

2025-11-04 23:53:17 234 1

原创 基于Spring Boot的Dubbo微服务实践指南

本文介绍了Apache Dubbo框架在微服务架构中的应用。作为高性能RPC框架,Dubbo具备多协议支持、动态负载均衡和容错机制等优势,能与Spring Boot无缝集成。文章重点解析了核心注解@DubboService、@DubboReference和@EnableDubbo的使用方法,并提供了YAML配置示例。最后给出了版本控制、性能优化等实践建议,强调Dubbo与Spring Boot结合可快速构建高可用微服务系统,建议配合DubboAdmin进行可视化监控。

2025-08-31 00:48:59 546

原创 Java的四种优化资源密集型任务的策略

本文介绍了四种优化资源密集型任务的策略:1)每次创建新实例,适用于简单低频任务;2)连接池模式,适合高并发场景;3)ThreadLocal模式,实现多线程资源隔离;4)使用队列进行异步任务调度。针对每种策略,文章分析了适用场景、核心思想,并提供了Java代码示例,同时列举了各自的优缺点。通过对比不同优化方案,帮助开发者根据具体需求选择合适方法,提升系统性能和稳定性。

2025-08-25 23:29:36 863

原创 Selenium框架Java实践截图服务

本文介绍了Selenium框架的核心架构及WebDriverManager实践指南。首先解析了Selenium的WebDriver三层工作原理(命令抽象、协议转换、浏览器执行)和跨浏览器兼容实现。然后详细说明WebDriverManager如何解决驱动管理痛点,包括版本匹配、自动下载和缓存优化,并提供了初始化示例和Maven配置。接着讲解了截图服务的实现方案,包括本地截图生成和对象存储集成的代码实现。最后给出了驱动管理优化、异常处理策略、性能优化等最佳实践建议,以及版本兼容性参考和常见问题解决方案。

2025-08-25 23:16:14 847

原创 Flux流式编程:从原理到实践,对比Java Stream流的异同

摘要:Flux是响应式编程的核心工具,实现异步非阻塞数据流处理,支持背压机制防止数据溢出。与Java Stream相比,Flux更适合处理实时数据流(如AI对话、日志监控),而后者适用于批量数据处理。文章介绍了Flux的创建方式、核心操作符以及Spring WebFlux集成应用,通过对比分析帮助开发者根据场景选择合适的处理方案。Flux的声明式编程风格能显著提升异步代码的可读性和性能。

2025-08-24 19:51:37 997

原创 游标分页的原理与实战应用

文章摘要:游标分页是解决传统分页性能问题的新方案。相比基于偏移量的传统分页(如LIMIT 10 OFFSET 10),游标分页通过唯一标识符(主键/时间戳)标记位置,避免了大偏移量查询的性能下降和数据一致性问题。文章详解了游标分页的原理、SQL实现及适用场景(如社交媒体、电商评论、即时通讯),并指出其优势(性能稳定)与局限(无法跳页)。开发人员可根据业务需求,灵活选择游标字段和排序规则来优化分页体验。

2025-08-23 00:42:43 1022

原创 快速学会什么是gPRC

gRPC是一个由Google开发的高性能RPC框架,采用HTTP/2协议和Protobuf序列化技术,支持跨语言开发。其核心组件包括.proto接口定义文件和Protobuf序列化协议,能够实现高效的数据传输。在Java中使用gRPC需要先定义.proto文件,通过Maven插件生成代码,再实现业务逻辑。gRPC特别适合微服务架构、多语言系统和实时通信场景,通过统一的接口定义确保客户端和服务端的一致性,提供了一种高效、低延迟的远程调用解决方案。

2025-08-15 09:36:17 1227

原创 秋招备战:Java基础常考面试题(一)

Java、C++和Go语言的主要区别在于:Java是编译+解释型语言,具有自动内存管理;C++是纯编译型语言,需要手动内存管理;Go是编译型语言,支持自动垃圾回收。Java优势在跨平台和生态成熟,C++在性能和控制力上突出,Go以并发能力和简单语法见长。在编程范式上,面向对象强调类和对象封装,而面向过程侧重函数调用实现功能。各语言各有适用场景,需根据项目需求选择。

2025-08-11 19:39:37 171

原创 《四种姿势用Java玩转AI大模型:从原生HTTP到LangChain4j》

本文介绍了四种在Java项目中接入AI大模型的实用方法,重点以阿里云Qwen3模型为例进行演示。首先介绍了SDK接入方式,通过Maven依赖和API密钥实现快速集成;其次讲解了HTTP接入方案,适用于不支持SDK的语言环境;然后详细解析了SpringAI框架的核心价值与特性,包括跨供应商API、向量数据库支持等功能;最后探讨了LangChain4j框架的特点及其与SpringAI的对比。作者推荐使用SpringAI方案,因其与Spring生态的无缝集成和易用性,同时提供了完整的代码示例帮助开发者快速实现AI

2025-08-05 20:41:34 1126

原创 《秋招在即!GET和POST请求的区别,你真的懂吗?》

HTTP中的GET和POST方法有显著区别。GET用于获取资源,具有幂等性,参数通过URL传递且长度受限;POST用于提交数据,会改变服务器状态,参数放在请求体中无长度限制。GET适用于搜索等场景,POST适合表单提交等操作。理解二者区别对开发及面试都很重要。

2025-08-01 08:37:51 254

原创 《秋招在即!一文搞懂TCP和UDP区别,网络面试不再慌》

TCP和UDP是传输层两大核心协议。TCP面向连接,通过三次握手建立可靠传输,具有流量控制、拥塞控制机制,但开销较大,适用于网页、邮件等场景。UDP无连接、不保证可靠性,传输速度快、头部小,适合视频流、在线游戏等实时性要求高的应用。两者在连接方式、可靠性、传输速度等方面存在显著差异,适用于不同业务需求。

2025-08-01 07:49:35 169

原创 《秋招在即!大厂高频面试题:HTTP和HTTPS的区别》

HTTP与HTTPS的主要区别:1.安全性:HTTP明文传输,HTTPS通过SSL/TLS加密;2.URL前缀:HTTP以http://开头,HTTPS以https://开头;3.端口号:HTTP默认80,HTTPS默认443;4.证书要求:HTTPS需要备案证书;5.性能:HTTP更快,但HTTPS性能差距已缩小。TLS/SSL是加密协议,HTTPS从SSL演变为TLS,TLS性能更优且安全性更高。

2025-08-01 07:14:30 300

原创 《秋招在即!Redis数据类型面试题解析》

Redis提供五种基础数据结构:String(字符串)、List(列表)、Hash(哈希)、Set(无序集合)和Zset(有序集合),每种都有特定应用场景。String适合缓存和计数器,Hash用于存储对象属性,List适用于日志和购物车,Set用于去重操作,Zset可实现排行榜。此外还支持四种高级类型:BitMap(签到系统)、HyperLogLog(基数统计)、GEO(地理位置)和Stream(消息流)。掌握这些数据类型及其应用对后端开发至关重要,是技术面试和实际工作中的核心技能。

2025-07-31 19:26:43 447

原创 《秋招在即!面试常考SQL调优?一文搞定高频面试题》

SQL调优是面试和实际工作中的重要技能,主要通过问题识别、索引优化、查询简化等手段提升性能。关键步骤包括:定位慢SQL、分析执行计划(EXPLAIN)、优化查询语句(避免select*、减少join)、合理设计索引和表结构。常见问题包括索引失效、连接数不足、锁竞争等,可通过缓存、分页优化等方式解决。掌握这些方法能有效提升数据库性能,是系统优化的核心环节。

2025-07-31 10:02:26 501

原创 SpringBoot3效率神器:lombok(持续更新)

Lombok是一个Java库,它通过注解的方式自动插入代码到你的编辑器和构建工具中,从而简化Java类的编写。它可以帮助开发者自动生成Getter和Setter方法、toString、equals和hashCode方法等,让Java代码更加简洁、美观。Lombok是一个强大的Java库,它通过注解的方式自动插入代码,极大地简化了Java类的编写。通过合理使用Lombok注解,我们可以显著提高开发效率,减少样板代码的编写。

2024-09-25 19:00:09 1139

原创 SpringBoot3中ymal配置文件(持续更新)

YAML,全称"YAML Ain't a Markup Language"(YAML不是一种标记语言),其初始含义为"Yet Another Markup Language"(另一种标记语言)。其设计初衷如下:application.properties配置:YAML配置(application.yaml):

2024-09-25 09:27:31 653

原创 SpringBoot3自动配置(持续更新)

SpringBootApplication:这是SpringBoot的主程序的注解,它包含了@SpringBootConfiguration这是一个配置类,@EnableAutoConfiguration开启自动配置,@ComponentScan自动扫描。在SpringBoot中,自动配置是一个核心的特性,在我们将SpringBoot的starter添加到自己的项目时,SpringBoot会自动配置starter所需的核心组件,会自动配置一些Servlet和Filter等。

2024-09-24 10:47:42 1263

原创 SpringBoot3快速入门(持续更新)

1.快速创建Spring应用:相较于传统的SSM框架(Spring+SpringMVC+Mybatis)架构有些繁琐的步骤(如导包,编写配置等),SpringBoot给我们提供了一些默认的配置,让我们可以快速的应用。3.提供Starter:我们可以直接在SpringBoot中引入starter:web,json,对象存储,异步,缓存等提供了配置的依赖,极大的简化了依赖管理和版本控制。4.自动配置:SpringBoot能够根据添加的依赖和配置自动配置Spring框架和第三方库。

2024-09-23 19:01:30 1459 1

原创 Mybatis快速入门

MyBatis是一款优秀的持久层框架,用于简化JDBC的开发 ,它支持定制化SQL、存储过程以及高级映射。MyBatis本是Apache的一个开源项目iBatis,2010年该项目由Apache Software Foundation迁移到了Google Code,并改名为MyBatis。2013年11月,MyBatis迁移到GitHub。

2024-08-06 14:44:58 1134

原创 Spring-Ioc,Di,Bean

在我们给大家讲解了三层架构和分层解耦,这次给大家注重的讲解一下控制反转和依赖注入,Bean对象等知识点如果我们要是实现一个案例比如:Service层及 Dao层的实现类,交给I0C容器管理,为Controller及Service注入运行时,依赖的对象。首先把Service层以及Dao层的实现类,交给IOC容器管理然后为Controller及Service注入运行时要依赖的对象。

2024-07-31 12:25:13 1253

原创 JavaWeb的三层架构和分层解耦

分层解耦是一种软件设计原则和架构方法,旨在将一个复杂的系统划分为不同的层次,并减少各层次之间的相互依赖和紧密耦合。

2024-07-30 14:02:03 433

原创 Element快速学习

如此,我们就可以去官网找我们需要的组件库,把代码粘贴到新建的vue文件中的<templat>中,然后后我们要在App.vue中<templat>中打出你新建的vue文件名称后vscdoe就会自动导入,如此就是完成了一个组件库的一个基本的使用了。其实Element的组件库非常简单,官网都把代码写好了,不需要大家打太多的代码,找到我们自己需要的组件库主打一个ctrl c+ctrl v(也算是程序员的一种快乐哈哈哈哈),然后记得在App.vue的文件中引用。接下来我们要在main.js中写入官网中给的代码。

2024-07-27 02:37:38 709

原创 前后端分离的开发模式+YAPI接口文档

前后端的开发模式和接口的讲解

2024-07-25 16:15:08 2441 2

原创 快速入门了解Ajax

上面是一个原生的Ajax的一个写法,但是原生的Ajax太繁琐甚至还有浏览器不兼容的问题,所以现在都是基于原生的Ajax的Axios。意义:AJAX(Asynchronous JavaScript and XML)即异步 JavaScript 和 XML。介绍:Axios是简化的Ajax,对传统的Ajax操作的简化和改进,也是一个更强大和便捷的http请求处理的工具。下边是两个来自官网的post的请求和get请求的代码。

2024-07-25 12:41:07 1183

原创 后端开发工程师vue2初识的学习

快速认识vue

2024-07-24 14:27:56 1254

原创 3096.力扣每日一题 Java(前缀和)

如果在某个分割点,Alice的得分严格大于Bob在此之后可能获得的最大分数(这通常意味着Alice的得分加上至少一个关卡的最低分数仍然大于剩余关卡的分数总和),我们就找到了答案,即Alice需要完成的最少关卡数。然而,需要注意的是,上述过程中的第3步在实际编码时可能并不需要显式计算Bob的得分,因为我们可以直接通过比较Alice的得分和剩余关卡中简单模式与困难模式的数量差(或前缀和数组中的某个值)来做出判断。数组(从第二个元素开始,因为第一个元素代表只有一个关卡时的分数,不满足题目要求),对于每个分割点。

2024-07-19 16:47:26 1031 1

原创 3112.力扣每日一题7/18 Java 迪杰斯特拉(Dijkstra)算法

迪杰斯特拉算法的时间复杂度通常为 O(N²),其中N是顶点的数量。如果使用二叉堆如果使用二堆(或斐波那契堆)来优化选择最小距离顶点的操作,时间复杂度可以优化到O((N+M)logN),其中M是边的数量。同时考虑每个节点的消失时间,如果在节点消失之前无法到达,则标记为不可达(-1)。它的基本思想是:从一个起始顶点出发,逐步向外扩展,每次选择距离起始顶点最近且未被处理过的顶点,然后更新该顶点相邻顶点的距离。的数组来存储每个节点的最少到达时间和一个优先级队列,空间复杂度主要取决于节点数量。,还使用了一个长度为。

2024-07-19 16:35:49 933

原创 2959.力扣每日一题7/17 Java(暴力枚举+Floyd算法)

通过枚举所有可能的节点集合状态,对于每个状态,复制相关节点的距离信息到一个临时矩阵,然后在这个子集上运行 Floyd 算法计算最短路,最后检查这个子集中任意两个节点的最短路是否都不超过给定的最大距离,统计满足条件的方案数。在上述提到的问题中,使用 Floyd 算法来计算各个顶点之间的最短路径,通过三重循环遍历所有可能的中转顶点 k,以及起点 i 和终点 j,根据状态转移方程不断更新距离矩阵 f,以得到最终的最短路径信息。其核心思路是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。

2024-07-19 16:14:50 1096

原创 2956.力扣每日一题7/16 Java

来检查是否存在相同元素,若存在则。进行相同的操作,若存在相同元素则。加 1 并结束内层循环。加 1 并结束内层循环。通过两层循环来分别处理。

2024-07-19 15:55:20 450

原创 721.力扣每日一题7/15 Java(并查集)

最后,我们遍历所有邮箱地址,根据并查集的结果将它们分组到对应的账户中。对于每个组(即每个并查集的根节点),我们收集其下所有的邮箱地址,并从任意一个邮箱地址中获取对应的账户名称(因为我们已经假设了每个账户内的邮箱地址都关联到同一个名称)。对于每个账户,我们将其中的第一个邮箱地址作为代表,并将其与账户中的其他邮箱地址进行合并操作。:对于每个分组,收集其下的邮箱地址,并从任意一个邮箱地址中获取账户名称,然后构建并添加到结果列表中。:遍历所有邮箱地址,根据并查集的结果将它们分组到对应的账户中。

2024-07-19 15:45:49 1109

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除