自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java并发编程

Java并发编程摘要 Java并发编程中,进程是程序运行时实例,线程是CPU执行的最小单位。创建线程有4种方式:继承Thread类、实现Runnable接口、实现Callable接口和使用线程池。线程安全可通过synchronized关键字或ReentrantLock实现锁机制,两者主要区别在于实现原理、加锁范围和释放方式。线程通信使用wait()、notify()和notifyAll()方法,典型应用包括交替打印数字和生产者消费者问题。注意避免死锁,合理使用守护线程。sleep()和wait()都能使线程

2025-03-27 19:00:33 1093

原创 Linux下的java环境搭建

Linux操作系统下配置JAVA环境

2023-12-05 22:24:29 1331 2

原创 markdown用法

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + S

2026-07-12 17:34:46 229

原创 开发一个简易的RPC框架

本文介绍了一个简易RPC框架的开发实现,主要包含三部分内容:1)基础概念,包括负载均衡(将请求分摊到多台服务器)和容错机制(失败重试、降级调用等);2)框架结构设计,分为公共模块、服务提供者、消费者和RPC核心框架四个模块;3)核心代码实现,展示了请求处理器(使用Vert.x处理HTTP请求)、请求/响应类的设计,通过反射调用服务方法并返回响应结果。该框架实现了基本的远程服务调用功能,支持序列化和服务注册发现。

2026-05-28 20:56:33 246

原创 Java 异步回调

本文对比了Java中实现异步回调的两种方式。传统Callback接口方式虽然简单直接,但存在线程管理困难、回调嵌套等问题。而CompletableFuture提供了更优雅的链式调用、自动线程池管理和异常处理机制,是现代Java异步编程的推荐方案。文章通过"老板-员工"案例展示了两种实现的具体代码,并分析了各自的优缺点,最终建议在实际开发中优先使用CompletableFuture来实现异步回调功能。

2026-04-22 20:29:37 415

原创 使用Java实现Zip压缩多个文件

这段Java代码演示了如何将多个文件压缩为一个ZIP文件。通过ZipOutputStream实现,首先创建目标ZIP文件,然后逐个添加源文件(如abc.txt和1.html)到压缩包中。zipSingleFile方法处理单个文件的压缩过程,包括创建ZipEntry、读取文件内容并写入压缩包。代码使用了try-with-resources确保流正确关闭,并捕获可能的IO异常。最终将D盘下的两个文件打包生成total.zip压缩文件。

2026-01-13 10:21:44 358

原创 使用Java实现Zip压缩单个文件

该代码演示了Java实现单个文件压缩为ZIP格式的过程。通过创建FileInputStream读取源文件数据,使用ZipOutputStream将数据写入目标ZIP文件。关键步骤包括:创建ZipEntry条目、循环读取文件数据并写入压缩流、最后关闭所有流资源。该方法实现了基本的文件压缩功能,适用于将指定路径下的单个文件压缩为ZIP格式。

2026-01-13 09:40:44 408

原创 Java-Stream流

摘要:本文介绍了Java中不可变集合的创建方法和Stream流的基本使用。不可变集合通过List.of()、Set.of()、Map.of()等方法创建,具有不可修改特性,并详细说明了使用限制。Stream流部分包含获取流的多种方式、中间操作方法(如filter、map等)和终结操作方法(如forEach、collect等),重点讲解了将流数据收集到集合的方法,特别是转为Map时的键值处理规则。文章通过代码示例展示了各种操作的实际应用,强调链式编程和lambda表达式的使用优势。

2025-12-18 23:38:59 537

原创 Java爬虫入门(3/5)

HTTP(超文本传输协议):是一种用于网络传输超文本到本地浏览器的传输协议。定义了客户端和服务器之间请求和响应的格式。HTTP工作在TCP/IP模型之上,常用。区别于HTTPS(超文本传输安全协议):是HTTP的安全版本,HTTP下增加了SSL/TLS协议,提供了数据加密、完整性校验和身份验证。工作原理: 客户端发送请求▶️服务端处理请求▶️服务端返回响应▶️客户端渲染页面。

2025-12-14 22:56:49 263

原创 使用Java写一个爬虫小程序

摘要:这段Java代码演示了如何使用HttpURLConnection从优快云博客抓取数据。通过创建URL对象、建立HTTP连接、读取字符流并将结果保存到内存列表,实现了简单的网页内容抓取功能。代码包含基本的异常处理,展示了Java网络编程的基本流程。

2025-12-10 23:36:47 138

原创 windows安装ES(8.14.x版本)

本文介绍了在Windows系统快速安装ElasticSearch的步骤:1)从官网下载指定版本安装包并解压;2)配置自带JDK环境变量;3)修改配置文件,包括关闭安全认证、设置日志编码和基本参数;4)启动服务并验证9200端口访问。重点解决了安装过程中的安全认证和日志乱码问题,提供了完整的配置文件示例,使读者能够快速完成ElasticSearch的环境搭建。

2025-12-07 13:48:57 737

原创 对AtomicInteger的理解

本文通过两个测试案例比较了使用AtomicInteger和普通int变量在多线程环境下的线程安全问题。第一个测试使用AtomicInteger的原子操作方法实现了线程安全的库存扣减操作,能准确反映最终库存;第二个测试直接使用普通int变量进行自减操作,由于非原子性操作导致线程不安全,最终库存结果不准确。实验结果表明,在多线程环境下应使用原子类AtomicInteger来保证线程安全,避免出现数据不一致问题。

2025-11-13 13:58:42 141

原创 5. 原型模式

本文介绍了原型设计模式(Prototype Pattern)的核心概念与应用。原型模式通过克隆已有对象来创建新对象,避免了重复构造带来的性能损耗,特别适用于创建成本高、需要大量相似对象的场景。文章详细解析了原型模式的UML结构、Java实现方式(包括浅拷贝和深拷贝)、原型注册表等进阶用法,并分析了其优缺点。典型应用场景包括游戏开发、图形系统等需要频繁创建相似对象的领域。最后指出原型模式的本质是"以复制代替重新创建",是提升对象创建性能的有效设计模式。

2025-11-11 22:19:15 515

原创 两种阻塞的对比

阻塞类型对异步的影响取决于阻塞发生的环节:同步调用方阻塞(如future.get())会破坏异步性,使调用线程被动等待;而任务内部阻塞(如I/O操作)不会影响调用方的异步性,仅在执行线程中阻塞。关键区别在于是否强制调用方同步等待,前者将异步转为同步,后者保持调用方的异步特性。

2025-11-11 11:27:53 230

原创 Java中同步和异步的区别,以及阻塞和非阻塞的区别

本文系统讲解了同步/异步、阻塞/非阻塞概念的区别与组合。同步指调用者等待结果,异步则不等待;阻塞指线程被卡住等待,非阻塞则不会卡住。四种组合包括:同步阻塞(最常见)、同步非阻塞(轮询)、异步阻塞(极少用)和异步非阻塞(最优模式)。通过Java代码示例展示了每种场景的实现方式。关键区分点在于:同步/异步关注调用者是否等待结果,阻塞/非阻塞关注线程是否被卡住等待。理解这些概念对设计高效并发程序至关重要。

2025-11-09 23:16:57 483

原创 4. 抽象工厂模式

抽象工厂用于创建一系列相关的产品对象,保证产品族之间的一致性,客户端只依赖抽象工厂,不依赖具体产品。BeanFactory 的“产品”是 各种 Bean(Controller、Service、Dao 等)。每一种数据库驱动(MySQL、Oracle、PostgreSQL)都是一个 工厂。抽象工厂模式是创建型设计模式,提供一个接口可以创建一系列产品相关对象。抽象工厂让你不用直接 new,创建逻辑被封装隔离。以生产服装为例,不同的工厂生产出不同颜色的服装。抽象工厂保证同一工厂创建出的产品风格统一。

2025-11-09 16:39:01 959

原创 3. 建造者模式

建造者模式是一种创建型设计模式,它将复杂对象的构建过程分解为多个步骤,通过链式调用实现构建过程与最终表示的分离。该模式适用于解决构造函数参数过多、构建过程复杂多步骤、对象不可变时的灵活构建等问题。核心结构包括产品、抽象建造者、具体建造者和指挥者(可选)。典型应用场景包括大量可选参数的对象构建、多步骤顺序构建流程、不可变对象构造等。Java中常见的实现如StringBuilder、Lombok@Builder、OkHttp的Request.Builder等都采用了该模式,通过链式调用和build()方法实现清

2025-11-09 00:54:48 670 1

原创 2.单例模式

单例模式是一种创建型设计模式,保证一个类在整个应用生命周期中只有一个实例,并提供对该实例的全局访问点。统一资源入口:提供全局统一的调用点,避免对象分散创建。生命周期管理:由类自身控制对象的创建、初始化和销毁。✅ 方案 2:懒汉式 + 双重检查锁(DCL,推荐)节省资源:避免重复构造昂贵对象(如数据库连接器)。控制实例数量:限制系统中某个类只能有一个对象。✅ 方案 1:懒汉式(线程不安全,不推荐)✅ 方案 3:静态内部类(最推荐,优雅)如缓存对象在多个模块间需要统一访问。

2025-11-03 22:34:54 380

原创 1. 工厂方法模式

工厂方法模式是一种创建型设计模式,通过封装对象创建过程实现业务与构造逻辑的解耦。其核心价值在于隔离产品差异,确保系统可扩展性,适用于支付体系、通知系统等需要统一接口但实现差异大的场景。该模式由抽象工厂、具体工厂、抽象产品和具体产品组成,如Spring的BeanFactory就采用了这一模式。通过将复杂多变的构造过程从业务中剥离,工厂方法使系统具备可维护性和可扩展性,典型应用如不同品牌汽车的生产只需调用统一工厂接口。

2025-11-02 20:59:58 317

原创 设计模式的介绍

只和直接相关的类交流,尽量减少对外部对象内部细节的依赖。子类对象必须能够替换掉父类对象,并保持原有功能不变。对扩展开放,对修改关闭。(加新的功能不动老的代码)一个类只负责一个模块上的事情。高层模块不应该依赖低层模块,两者都应该依赖抽象。接口要小而精,不要大而全。

2025-11-02 16:01:35 390

原创 CompletableFuture实践

本文介绍了Java中Future和CompletableFuture两种异步编程方式。Future接口表示异步计算结果,通过FutureTask实现,但存在异常处理不便、无法链式调用等局限。CompletableFuture作为Future的增强版,支持任务编排、非阻塞回调、异常处理链等特性。其核心优势在于异步执行和回调的非阻塞性,而get()/join()的阻塞调用仅作为最终获取结果的业务需求,不影响其整体非阻塞模型。通过三种实现方式的对比,说明了CompletableFuture在异步编程中的灵活性和实

2025-11-02 00:08:51 483

原创 使用AOP+注解进行用户权限校验

本文介绍了基于注解和AOP的权限控制实现方法。首先定义自定义注解@AuthCheck,通过元注解指定其作用于方法且在运行时有效,包含requireRole属性用于设置所需角色。然后在需要权限控制的方法上添加该注解,如用户注册接口要求admin角色。接着通过AOP编程实现权限校验拦截器AuthInterceptor,使用@Around注解拦截带有@AuthCheck的方法,获取当前用户角色并与注解要求的角色进行比对,校验失败则抛出无权限异常。这种实现方式将权限控制与业务逻辑解耦,提高了代码的可维护性。

2025-09-07 00:48:53 221

原创 维护二叉搜索树的平衡

右旋。

2025-09-07 00:42:57 149

原创 使用Docker代码沙箱的内部代码编写

这段代码是一个 Java 代码沙箱的模板实现,旨在执行用户提交的 Java 代码,并提供错误处理、代码编译、执行、输出收集和文件清理等功能。方法能够处理代码执行的相关安全性和错误处理,那么这个控制器能够处理简单的代码执行请求。

2025-09-07 00:42:40 416

原创 Java调用Ollama(curl方式)

【代码】Java调用Ollama(curl方式)

2025-08-22 17:32:42 274

原创 从RAG到Agentic RAG

RAG(检索增强生成)技术通过检索外部知识库增强生成模型的准确性和相关性。传统RAG包括数据准备(分片、索引)和回答(召回、重排、生成)两部分。Graph RAG引入知识图谱,提升语义理解能力。Agentic RAG结合智能代理,支持多步推理和任务拆解。Deep Search强调搜索、阅读、推理的循环迭代,Deep Research则在此基础上进行结构化分析和多代理协作,生成深度研究报告。这些技术共同提高了AI处理复杂查询和信息整合的能力。

2025-07-22 17:23:37 858

原创 Redis

Redis是一款非关系型数据库,将数据以键值对形式存储在内存中,读写速度快,支持多种数据类型,还支持数据持久化。

2025-04-02 17:09:38 1107

原创 Java进阶

Java中的注解也称标注,可以对类、方法、属性、参数、包等进行标注,然后让编译器或运行时其他类进行解析,完成某个功能。注解也可以编译到字节码文件中。为什么要克隆?new出来的对象的属性还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。将一个已经存在的对象以及对象数据克隆到另一个对象中。

2025-03-29 20:43:14 974

原创 MySQL进阶

索引是排好序的数据结构。(例如二叉树。)我们借助索引,索引类似一个目录,通过目录可以快速定位到数据位置,拿到物理地址。帮助MySQL提高查询效率的是数据结构。能实现快速定位数据的一种存储结构,其设计思想是以空间换取时间。本质:通过不断缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机事件变成顺序事件。

2025-03-24 20:48:42 917

原创 Java并发编程

程序由指令和数据组成,指令的运行,数据的读写需要将指令加载至CPU,数据运行至内存。当一个程序被运行,从磁盘加载这个程序代码至内存,这时就开启了一个进程。进程可以视为程序的一个实例。

2025-03-24 17:29:11 299

原创 Java虚拟机

Java Virtual Machine-java程序运行环境(java二进制字节码运行环境)一次编写,到处运行。自动内存管理,垃圾回收功能数组下标越界检查多态比较:JDK JRE JVMJVM内存结构:方法区、堆、虚拟机栈、程序计数器、本地方法栈1、程序计数器(寄存器):记住下一条jvm指令的执行地址。特点:线程私有的,每个线程都有自己的程序计数器。不会存在内存溢出2、虚拟机栈:线程运行时需要的内存空间。栈帧代表每个方法运行时需要的内存(参数、局部变量、返回地址)。

2025-03-21 20:18:30 1065

原创 Java基础面试知识路线

toString()方法hashCode() and equals()方法Getter and Setter 方法构造函数对于这种简单的类,这些方法通常是无聊的、重复的,而且是可以很容易地机械地生成的那种东西(ide通常提供这种功能)。throws是异常的申明,若方法中存在检查异常,如果不对其捕获,那必须在方法头中显式声明该异常,以便于告诉方法调用者此方法存在异常,需要处理。抽象类的设计是自下而上的,我们写了很多类,发现这些类有共性,有很多代码是重复的,因此我们将相同代码逻辑封装成抽象类,减少代码冗余。

2025-03-20 21:05:11 1062

原创 消息队列导致数据库数据读取不一致解决方案

具体问题:使用消息队列时,发送方给接收方发送消息,接收方修改了数据库的同时发送方查询数据库,由于是异步操作,会导致发送方读取的数据是修改前的数据,导致数据不一致的问题。我使用的是在数据库添加一个版本字段,记录版本,保证版本一致性,就能保证每次读取的是需要的内容。

2025-03-17 18:22:24 354

原创 微服务架构下前端如何配置 OpenAPI 接口

生成客户端代码:使用 OpenAPI 工具(如 `openapi-typescript-codegen` 或 `openapi-generator-cli`)生成前端可用的 API 客户端代码。OpenAPI 规范文件:通常是 `swagger.json` 或 `openapi.json`,可以通过后端服务的 `/v2/api-docs` 或 `/v3/api-docs` 路径获取。它定义了 API 的接口、参数、返回值等信息,并可以通过工具生成客户端代码。在项目中引入生成的客户端代码。

2025-03-16 14:19:32 887

原创 docker容器镜像拉取失败解决方案

docker容器镜像拉取失败解决方案。

2024-12-20 17:33:00 503

原创 Java原生实现代码沙箱的实现

代码沙箱:只负责接收代码和输入,返回编译运行的结果,不负责判题(可作为独立项目/服务,提供给其他需要执行代码的项目使用)新建一个新的SpringBoot项目并且成功运行(Java8、SpringBoot2.7)不同的编程语言对应领域和关键词都不同,成本太大。以Java语言为主,实现代码沙箱。4. 限制用户操作权限(文件、内存、CPU、网络、执行)新建目录,每个用户的代码都存放在独立的目录下,便于维护。目前为止,核心流程都已经实现,若真正上线,安全吗?(可扩展实现C、C++代码沙箱)

2024-12-19 22:41:48 1666

原创 判题机的开发(代码沙箱、三种模式、工厂模式、策略模式优化、代理模式)

如果所有的选择判题策略都写在判题服务代码中,代码会过于复杂,产生很多if-else,建议单独编写判断策略的方法。-->定义JudgeManager,尽量简化对判题功能的调用,

2024-12-18 20:40:37 1454

原创 工厂模式和普通的对象创建(使用多态)的区别

解耦直接创建对象:客户端代码直接与具体实现类(如Dog)绑定,缺乏解耦。工厂模式:通过工厂类来创建对象,客户端只关心如何获取对象,而不关心具体的实现类。工厂模式有助于解耦客户端代码和具体的实现类。灵活性和扩展性直接创建对象:如果以后需要增加新的对象类型,客户端代码需要修改来适应新类型(如添加new Cat()工厂模式:新增类型时,只需要扩展工厂类,不需要修改客户端代码。工厂模式支持更高的灵活性,特别是在对象的选择是动态的情况下(如配置驱动、条件驱动等)。多态的使用直接创建对象。

2024-12-18 16:19:06 1003

原创 工厂模式(根据代码沙箱拓展)

最近写一个关于代码沙箱的项目,用到了工厂模式,简单记个笔记,总结一下。实现了一个简单的,根据传入的字符串参数创建不同类型的代码沙箱实例。这种方式的好处是简洁、易于理解,而且适用于需求较简单的场景。不过,它的扩展性在面对大量沙箱类型时可能不如其他更复杂的工厂模式。: 这是工厂方法的核心,接收一个参数,根据该参数选择不同的沙箱类型并返回相应的实例。switchtypetype"example"type"remote"type: 该方法返回的是一个接口或抽象类,具体的实现类(如)应该实现了该接口或继承了该类。

2024-12-18 16:11:06 552

原创 MarkDown父子组件传参

使用MarkDown父子组件绑定。

2024-12-16 10:37:42 222

Gray码的分治构造算法

Gray码是一个长度为2ⁿ的序列,序列中无相同元素,且每个元素都是长度为n位的二进制位串,相邻元素恰好只有1位不同。例如长度为2³的格雷码为(000,001,011,010,110,111,101,100),设计分治算法对任意的n值构造相应的格雷码。 本文旨在设计一种使用分治算法对任意的n值构造相应的格雷码的程序。首先,简要介绍了格雷码的基本概念和生成方法。然后,提出了一种基于分治思想的算法,用于生成任意长度的格雷码。在算法的具体实现上,采用了递归的思路。首先,将待生成的格雷码分为两部分,分别计算它们的格雷码,然后再将这两个格雷码合并成一个完整的格雷码。 该程序采用Java作为设计语言,采用了分治算法来实现任意长度的Gray码,代码简明清晰,易于理解。 关键词:Java;Gray码;分治算法 Gray码,又称为格雷码,是一种二进制数列的排列方式。它的特点是任意两个连续的数值只有一个位数的差异。这种特性使得Gray码在误差检测和许多工程应用中具有优势,如模拟/数字转换、轴角编码、通信等。 本课题的研究目标是探讨和理解Gray码的分治构造算法。该算法应能处理不同长度的Gray码的生成问题。

2023-12-27

空空如也

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

TA关注的人

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