当前位置: 首页 > news >正文

Java状态机

目录

1. 概念

2. 定义状态机

3. 生成一个状态机

4. 使用


1. 概念

        在Java的应用开发里面,应该会有不少的人接触到一个业务场景下,一个数据的状态会发生多种变化,最经典的例子例如订单,当然还有像用户的状态变化(冻结,销户等),文章的状态变化(已发布,草稿等)。像这些具有多种状态的事物,如果我们不进行一些措施来进行维护和扩展的话,那么将会导致状态越难越难以管理,而且对状态的转变也会越来越难以定义。

        那么讲出了它现在存在的问题,也就能大概知道本文要讲的是主要内容是什么了。没错,状态机就是用来规范使用状态的各种变化的一种产物。

        可能大家还不清楚这个玩意为什么产生,我给大家一个场景,如果没有一种严格的状态机控制,那么像订单这种,我们是不是可以直接从已下单的状态直接推进到已发货的状态,而越过中间的支付等等的中间状态。这显然是有问题的。

        在状态机当中,具有四个概念,用来控制状态的变化。一种状态需要迁移到下一种状态,一定是经过某种行为或者事件转化到下一个状态。所以这也就成为了状态机的核心概念。​​​​​​

  1. 状态(States):代表系统可能处于的各种状态,例如 "已下单"、"已支付"、"已发货" 等。

  2. 事件(Events):触发状态转换的事件,例如 "下单"、"支付"、"发货" 等。

  3. 动作(Actions):在状态转换发生时执行的操作或行为。

  4. 转换(Transitions):定义状态之间的转换规则,即在某个事件发生时,系统从一个状态转换到另一个状态的规则

2. 定义状态机

我们可以定义一个状态机,并声明两个变量,一个用来记录状态变化的记录,一个用来记录要经过下一个状态需要的源状态与事件。在生成一个状态机的过程,我们将记录他需要变化的所有的状态,事件以及转换。

public class StateMachine {private Map<String,String> translatedTransitionsMap = new HashMap<>();private Set<String> translatedTransitions = new HashSet<>();private static final String DEFAULT_DELIMITER = "->";public StateMachine(Transition[] transitions){for (Transition transition : transitions) {translatedTransitions.add(transition.getFrom() + DEFAULT_DELIMITER +transition.getEvent() + DEFAULT_DELIMITER+ transition.getTo());if(translatedTransitionsMap.containsKey(transition.getFrom() + DEFAULT_DELIMITER + transition.getEvent())){throw new RuntimeException("Duplicate transition found: " +transition.getFrom() +DEFAULT_DELIMITER +transition.getAction());}translatedTransitionsMap.put(transition.getFrom() + DEFAULT_DELIMITER + transition.getEvent(),transition.getTo());}}public String getNextState(String from, String event){return translatedTransitionsMap.get(from + DEFAULT_DELIMITER + event);}public boolean checkTransitions(String from, String even){return translatedTransitions.contains(from + DEFAULT_DELIMITER + event);}}

过渡类的内容为

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Transition {/*** 起始状态*/private String from;/*** 动作*/private String even;/*** 目标状态*/private String to;}

3. 生成一个状态机

我们此次以订单举例,生成一个订单的状态机

public class OrderStatusModel {private static StateMachine ORDEER_STATEMACHINE;static {ORDEER_STATEMACHINE = new StateMachine(new Transition[]{new Transition(TradeStatusEnum.NEW.getStatus(), TradeEventEnum.CONFIRM.name(), TradeStatusEnum.WAIT_PAY.getStatus()),new Transition(TradeStatusEnum.NEW.getStatus(), TradeEventEnum.CANCEL.name(), TradeStatusEnum.CLOSED.getStatus()),new Transition(TradeStatusEnum.WAIT_PAY.getStatus(), TradeEventEnum.PAY.name(), TradeStatusEnum.PAY_SUCCESS.getStatus()),new Transition(TradeStatusEnum.WAIT_PAY.getStatus(), TradeEventEnum.PAY_CANCEL.name(), TradeStatusEnum.CANCELLED.getStatus()),new Transition(TradeStatusEnum.PAY_SUCCESS.getStatus(), TradeEventEnum.CONFIRM_SUCCESS.name(), TradeStatusEnum.COMPLETED.getStatus())});}public static String getTargetStatus(TradeStatusEnum currentStatus, TradeEventEnum tradeEventEnum) {return ORDEER_STATEMACHINE.getNextState(currentStatus.getStatus(), tradeEventEnum.name());}}

订单状态枚举

@Getter
public enum TradeStatusEnum {/*** 新建订单*/NEW("NEW", "新建订单"),/*** 锁单成功-待支付状态*/WAIT_PAY("WAIT_PAY", "待支付"),/*** 支付成功*/PAY_SUCCESS("PAY_SUCCESS", "支付成功"),/*** 已完成*/COMPLETED("COMPLETED","已完成"),/*** 已取消*/CANCELLED("CANCELLED","已取消"),/*** 订单关闭*/CLOSED("CLOSED","订单关闭");private String status;private String desc;TradeStatusEnum(String status, String desc) {this.status = status;this.desc = desc;}
}

订单事件

public enum TradeEventEnum {/*** 订单确认*/CONFIRM,/*** 取消订单*/CANCEL,/*** 支付*/PAY,/*** 支付取消*/PAY_CANCEL,/*** 订单确认成功*/CONFIRM_SUCCESS,/*** 订单完成*/FINISH
}

4. 使用

@Data
public class TradeOrder {private String orderId;private String status;private double price;public TradeOrder confirm(TradeCreateRequest request) {this.setStatus(OrderStatusModel.getTargetStatus(request.getTradeStatus(), TradeEventEnum.CONFIRM));return this;}public TradeOrder pay(TradeWaitPayRequest request) {this.setStatus(OrderStatusModel.getTargetStatus(request.getTradeStatus(), TradeEventEnum.CANCEL));return this;}
}

传参为

public class TradeCreateRequest extends BaseResquest{@Overridepublic TradeStatusEnum getTradeStatus(){return TradeStatusEnum.NEW;}
}
public abstract class BaseResquest {abstract TradeStatusEnum getTradeStatus();
}

相关文章:

Java状态机

目录 1. 概念 2. 定义状态机 3. 生成一个状态机 4. 使用 1. 概念 在Java的应用开发里面&#xff0c;应该会有不少的人接触到一个业务场景下&#xff0c;一个数据的状态会发生多种变化&#xff0c;最经典的例子例如订单&#xff0c;当然还有像用户的状态变化&#xff08;冻结…...

3.1 Hugging Face Transformers快速入门:零基础到企业级开发的实战指南

Hugging Face Transformers快速入门:零基础到企业级开发的实战指南 一、Transformers库:NLP领域的"瑞士军刀" 1.1 核心能力全景 预训练模型库:支持150,000+模型(BERT、GPT、T5等)统一API设计:3行代码完成文本分类、生成、翻译等任务多模态支持:文本、图像、音…...

Java+SpringBoot+数据可视化的家庭记账小程序(程序+论文+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当下这个科技日新月异、经济蓬勃向上的时代&#xff0c;中国经济正以令人瞩目的速度迅…...

Java-数据结构-(HashMap HashSet)

一、Tree和Hash的区别 在上一篇文章中&#xff0c;我们讲到了"TreeMap"和"TreeSet"&#xff0c;但当我们刷题的时候却会发现&#xff0c;实际应用Map和Set时&#xff0c;却常常都只会用"HashMap"和"HashSet"&#xff0c;这是为什么呢…...

【Prometheus】prometheus结合pushgateway实现脚本运行状态监控

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

python爬虫系列课程3:解决爬虫过程中遇到的编码问题

python爬虫系列课程3:解决爬虫过程中遇到的乱码问题 在爬取某些网站时,以4399小游戏网站为例,正常编写爬虫代码并执行之后会出现乱码,代码如下: import requestsheaders = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko…...

ocr智能票据识别系统|自动化票据识别集成方案

在企业日常运营中&#xff0c;对大量票据实现数字化管理是一项耗时且容易出错的任务。随着技术的进步&#xff0c;OCR&#xff08;光学字符识别&#xff09;智能票据识别系统的出现为企业提供了一个高效、准确的解决方案&#xff0c;不仅简化了财务流程&#xff0c;还大幅提升了…...

Go入门之map

map类型是引用类型&#xff0c;必须初始化才能使用&#xff0c;为key-value形式 var userinfo make(map[string]string)userinfo["username"] "zhangsan"var user map[string]string{"username": "张三","age": &qu…...

SpringBoot 中封装 Cors 自动配置

在现代 Web 开发中&#xff0c;跨域资源共享&#xff08;CORS&#xff09;是一个常见的问题。Spring Boot 提供了灵活的方式来处理 CORS 配置。本文将介绍如何通过自动配置的方式&#xff0c;在 Spring Boot 应用程序中全局配置 CORS。 背景 当浏览器从一个域名的网页去请求另…...

Github很慢/无法访问:简单两步搞定

第一步&#xff1a;获取github当前的DNS列表 第二步&#xff1a;把它们复制到自己本地的hosts文件中&#xff0c;保存 比大象装冰箱还少一步&#xff01;( 下面具体说怎么操作 ~&#xff09; 获取github当前的DNS列表 http://raw.hellogithub.com/hosts 把这个地址粘贴到浏…...

反射机制的简单示例

一个使用反射机制的简单示例&#xff0c;这个示例将展示如何使用反射来实现一个通用的数据导出功能。 首先&#xff0c;让我们创建必要的项目结构和文件&#xff1a; 首先修改 pom.xml 添加依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…...

DeepSeek在学术读写翻译中的独特优势

上下文理解能力 DeepSeek的核心优势之一在于其卓越的上下文理解能力。它能够根据前文内容准确理解和回应用户的提问或指令&#xff0c;确保对话的连贯性和相关性。这一能力在处理长篇对话和复杂文本时尤为重要&#xff0c;能够帮助用户更好地把握整体逻辑和细节。 2. 翻译专业…...

rust笔记4-属性derive

在 Rust 中,#[derive] 是一种属性(attribute),用于自动为类型实现某些 Trait。通过 #[derive],编译器可以自动生成这些 Trait 的默认实现,从而减少手动编写重复代码的工作量。 #[derive] 通常用于实现一些常见的 Trait,例如: Debug:为类型生成格式化输出的代码。Clon…...

前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传

* BootStrap弹框 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作 步骤&#xff1a; 1、引入bootstrap.css和bootstrap.js 2、准备弹框标签&#xff0c;确认结构 3、通过自定义属性&#xff0c;控制弹框的显示和隐藏 其中的bootstrap.css…...

跟李沐学AI:InstructGPT论文精读(SFT、RLHF)

原论文&#xff1a;[2203.02155] Training language models to follow instructions with human feedback 原视频&#xff1a;InstructGPT 论文精读【论文精读48】_哔哩哔哩_bilibili 简介 1. RLHF 的基本概念 RLHF 是一种结合强化学习和人类反馈的训练方法&#xff0c;旨在…...

RedisTemplate存储含有特殊字符解决

ERROR信息: 案发时间: 2025-02-18 01:01 案发现场: UserServiceImpl.java 嫌疑人: stringRedisTemplate.opsForValue().set(SystemConstants.LOGIN_CODE_PREFIX phone, code, Duration.ofMinutes(3L)); // 3分钟过期作案动机: stringRedisTemplate继承了Redistemplate 使用的…...

燧光 XimmerseMR SDK接入Unity

官网SDK文档连接&#xff1a; RhinoX Unity XR SDK 一&#xff1a;下载SDK 下载链接&#xff1a;RhinoX Unity XR SDK 二&#xff1a;打开Unity项目&#xff0c;添加Package 1、先添加XR Core Utilties包和XR Interaction Toolkit包 2、导 2、再导入下载好的燧光SDK 三&…...

Mycat中间件

一、概述 Mycat是开源的&#xff0c;活跃的、基于java语言编写的MySQL数据库中间件。可以像使用MySQL一样使用mycat&#xff0c;对于开发人员来说根本感觉不到mycat的存在&#xff1b; 二、安装 Mycat是采用java语言开发的开源数据库中间件&#xff0c;支持windows和linux运行环…...

【HBase】HBaseJMX 接口监控信息实现钉钉告警

目录 一、JMX 简介 二、JMX监控信息钉钉告警实现 一、JMX 简介 官网&#xff1a;Apache HBase ™ Reference Guide JMX &#xff08;Java管理扩展&#xff09;提供了内置的工具&#xff0c;使您能够监视和管理Java VM。要启用远程系统的监视和管理&#xff0c;需要在启动Java…...

OpenLayers总结3

一、 静态测距 1.原理 静态测距主要是针对地图上已有的矢量要素&#xff08;如线要素&#xff09;&#xff0c;利用 OpenLayers 提供的几何计算函数来获取其长度。在实际操作中&#xff0c;先加载包含几何要素的 GeoJSON 数据到矢量图层&#xff0c;当鼠标指针移动到要素上时…...

【OpenCV】在Liunx中配置OpenCV环境变量

将 /usr/local/include/opencv4 加入到环境变量中&#xff0c;可以帮助编译器找到 OpenCV 的头文件。这可以通过设置 CPLUS_INCLUDE_PATH 和 C_INCLUDE_PATH 环境变量来实现。以下是具体步骤&#xff1a; 方法一&#xff1a;临时设置环境变量 如果您希望临时设置这些环境变量…...

游戏引擎学习第109天

回顾目前进展 在这一期中&#xff0c;讨论了游戏开发中的一个重要问题——如何处理Z轴值的表示&#xff0c;尤其是在一个3D游戏中&#xff0c;如何更好地表示和存储这些值。上次的进展中&#xff0c;已经解决了透视投影的问题&#xff0c;意味着渲染部分的Z轴代码基本上已经完…...

npm、yarn、pnpm 的异同及为何推荐 pnpm

文章目录 一、引言二、npm 介绍&#xff08;一&#xff09;工作原理和特点&#xff08;二&#xff09;优势与不足 三、yarn 介绍&#xff08;一&#xff09;诞生背景和特性&#xff08;二&#xff09;与 npm 的主要区别 四、pnpm 介绍&#xff08;一&#xff09;核心优势和创新…...

基于遗传算法排课系统

一、遗传算法介绍&#xff1a; 遗传算法核心的任务是要通过编码体系&#xff0c;给出解决方案的染色体表现规则&#xff0c;首先需要随机初始化一定数量的种群&#xff08;population&#xff09;&#xff0c;而种群则由一定数目的个体(individual)构成。每个个体实际上是染色体…...

Windows 图形显示驱动开发-GpuMmu 示例方案

本文介绍常见使用方案以及实现这些方案所需的操作顺序。 更新进程的页表条目 下面是更新页表条目以将属于进程 (P) 的分配映射到物理内存的操作序列。 假定页表分配已驻留在图形处理单元中GPU)内存段。 视频内存管理器在分页进程上下文中为进程 P 的根页表分配分配虚拟地址范…...

【Linux AnolisOS】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。

AnolisOS 8中使用Docker部署&#xff08;全&#xff09;_anolis安装docker-CSDN博客 从在虚拟机安装龙蜥到安装docker上面这篇文章写的很清晰了&#xff0c;我重点讲述我解决文章里面问题一些的方法。 问题1&#xff1a; docker: Get https://registry-1.docker.io/v2/: net/h…...

策略+适配器模式详解

文章目录 1.策略模式1.目录结构2.Strategy.java 策略接口3.StrategyA.java 策略A4.StrategyB.java 策略B5.StrategyC.java 策略C6.Context.java 策略上下文7.Client.java 客户端8.小结 2.适配器模式1.目录结构2.CustomPaymentProcessor.java 自己的支付接口3.PayPalPaymentServ…...

Vue中事件名的命名规范

Vue中事件名的命名规范 起因&#xff1a; 本人之前不太写vue的项目&#xff0c;最近接触了vue的代码&#xff0c;在学习的过程中同时也会伴随着一点疑惑。比如一以下面的父子组件的事件传递为例&#xff1a; 父组件&#xff1a; 显然&#xff0c;父组件有个自定义事件refre…...

云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色

一、Ansible-playbook实战 1.Ansible-playbook安装软件 bash #编写yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #检查playbook的语法 [rootansible ansible]…...

背包dp与数位dp

背包dp 介绍 动态规划实际上就是将复杂问题分解成若干个子问题&#xff0c;并通过子问题的解逐步发展成整体问题的解的算法思想。&#xff08;我感觉这个解释就跟递归的思想一样&#xff09; 背包问题分为01背包(物体只能使用一次)&#xff0c;完全背包(物体可以使用无数次)&…...

【linux】更换ollama的deepseek模型默认安装路径

【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…...

【紫光同创国产FPGA教程】——FPGA开发工具使用

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 一&#xff1a;实验简介 实验目的&#xff1a;了解PDS软件的使用&#xff0c;在线Debugger工具的使用请看第八章uart实…...

面试技术分享:MySQL死锁与事务等待超时的临时解决方案

&#x1f4dd; 面试技术分享&#xff1a;MySQL死锁与事务等待超时的临时解决方案 1. 问题背景 某电商系统在促销高峰期出现库存更新失败&#xff0c;日志报错&#xff1a; Lock wait timeout exceeded; try restarting transaction (errno 1213)现象&#xff1a;多个事务因争…...

6.3 k8s的事件event和kube-scheduler中的事件广播器

什么是k8s的events k8s的events是向您展示集群内部发生的事情的对象 例如调度程序做出了哪些决定或者为什么某些 Pod 从节点中被逐出 哪些组件可以产生events 所有核心组件和扩展&#xff08;操作符&#xff09;都可以通过 API Server 创建事件k8s 多个组件均会产生 event …...

OAI 平台 4G(LTE)基站 、终端、核心网 端到端部署实践(一)

本系列文章,基于OAI LTE代码搭建端到端运行环境,包含 eNB,EPC,UE三个网元。本小节先介绍系统总体架构,硬件平台及驱动安装方法。 1. Overview 系统总体架构如下图所示。 2 Machine setup 2.1 Machine specs Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS…...

t113修改串口

1 sys_config.fex [uart_para] uart_debug_port 0 uart_debug_tx port:PE02<6><1><default><default> uart_debug_rx port:PE03<6><1><default><default> 2 uboot修改启动参数 3 修改env.cfg启动地址和传输 #ear…...

「软件设计模式」桥接模式(Bridge Pattern)

深入解析桥接模式&#xff1a;解耦抽象与实现的艺术 一、模式思想&#xff1a;正交维度的优雅解耦 桥接模式&#xff08;Bridge Pattern&#xff09;通过分离抽象&#xff08;Abstraction&#xff09;与实现&#xff08;Implementation&#xff09;&#xff0c;使二者可以独立…...

“地质环境体检”辅助智慧地质,服务工程建设、城市用地规划

随着社会经济的高速发展&#xff0c;各类工程建设也在加快筹建中。在工程项目的快速推进中&#xff0c;如何保障工作安全和工程建设的质量&#xff0c;是国家和社会普遍关注的一个问题。地质环境条件是影响工程建设、城市用地规划的重要因素&#xff0c;加强地质风险系统性研究…...

TMS320F28335二次bootloader在线IAP升级

F28335总共ABCDEFGH个区域&#xff0c;每个32K*16bits&#xff0c;即64K字节。 bootloader代码占用A区&#xff0c;地址0x338000~0x33FF7F&#xff0c;cmd文件中SECTIONS部分&#xff0c;需要添加Flash28_API相关信息&#xff0c;具体下载Flash28335_API_V210的demo&#xff0…...

java:用Guava的TypeToken优雅处理通配符类型(WildcardType): ? extends Number

在日常开发中我们经常会遇到泛型和通配符类型&#xff08;WildcardType&#xff09;&#xff0c;比如当我们需要处理List<? extends Number>这样的类型时&#xff0c;如何优雅地创建这样的类型表示&#xff1f;本文将重点介绍如何通过Guava的TypeToken来实现通配符类型的…...

ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测

文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw&#xff1a;原始的、未经处理的图像数据。 /camera/image_rect&#xff…...

Zabbix——Rocky9安装zabbix相关步骤记录

安装Zabbix 安装MariaDB 这里用MariaDB演示 https://mariadb.org/download/?trepo-config&dRedHatEnterpriseLinux9&v10.11&r_mneusoft 通过这个网址获得连接 选择对应的repo 根据系统版本和要安装的版本选择对应的repo 安装 新建一个repo文件&#xff0c;例…...

三轴云台之姿态测量篇

一、姿态测量的基本原理 三轴云台通过内置的传感器实时感知其姿态变化。这些传感器主要包括陀螺仪、加速度计和磁力计&#xff08;在某些高级系统中&#xff09;。 陀螺仪&#xff1a;用于检测云台的角速度变化&#xff0c;即绕三个轴的旋转速度。陀螺仪提供的数据是姿态测量的…...

Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变

out&#xff08;协变&#xff09; out 关键字用于实现泛型的协变。协变意味着如果 B 是 A 的子类型&#xff0c;那么 Producer<B> 可以被视为 Producer<A> 的子类型。这里的 Producer 是一个使用泛型类型参数的类或接口&#xff0c;并且该泛型类型参数被标记为 ou…...

VSCode 中使用 Snippets 设置常用代码块

背景 在开发中&#xff0c;有很多代码片段是重复的&#xff0c;例如&#xff1a;vue文件中的模版&#xff0c;react 中的模版&#xff0c;打印的 log 等等&#xff0c;很多很多。对于这些重复性的工作&#xff0c;vscode 官方提供了解决方案-Snippets in Visual Studio Code&a…...

在conda虚拟环境中安装jupyter lab-----deepseek问答记录

在 Conda 虚拟环境中安装 Jupyter Lab 的步骤如下&#xff1a; 1. 创建并激活 Conda 虚拟环境 如果你还没有创建虚拟环境&#xff0c;可以使用以下命令创建一个新的虚拟环境并激活它&#xff1a; conda create -n myenv python3.x # 将 myenv 替换为你的环境名称&#xff0…...

单元测试整理

在国外软件开发中&#xff0c;单元测试必不可少&#xff0c;但是国内并不太重视这一块&#xff0c;一个好的单元测试可以提前发现很多问题&#xff0c;也减去和测试battle的时间 Spring单元测试 JUnit4 RunWith 指明单元测试框架 e.g. RunWith(SpringJUnit4ClassRunner.cla…...

计算机毕业设计hadoop+spark旅游景点推荐 旅游推荐系统 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Java虚拟机面试题:内存管理(下)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【贝克街迷宫疑云:用侦探思维破解Java迷宫算法】

贝克街迷宫疑云&#xff1a;用侦探思维破解Java迷宫算法 "华生&#xff0c;把煤气灯调亮些。"福尔摩斯用放大镜仔细端详着桌上的羊皮纸&#xff0c;“这个案子比表面上看起来要复杂得多——它是个三维的思维迷宫。” 第一幕&#xff1a;离奇委托 1895年秋的伦敦笼…...