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

Java 高性能与可维护性实战:从语言特性到工程化全链路

一、设计目标:为什么“快”和“稳”必须同时追

在真实业务里,“快”(吞吐、延迟)与“稳”(可维护、可演进)往往拉扯。高性能带来的复杂度不应成为维护负担,而可维护的抽象也不应牺牲关键路径。可落地的目标是:

  1. 可预测性能:接口在 SLA 下延迟稳定,P95/P99 可控。

  2. 渐进式优化:从数据结构到 JVM,可以按需“开盖”。

  3. 可演进架构:可复用、可替换、可灰度,避免一次性设计。

  4. 可观测闭环:度量—分析—优化—回归,形成循环。

接下来从语言细节到工程化,建立“从里到外”的实践路径。


二、语言层面:写出“易优化”的代码

2.1 不滥用语法糖,写给编译器“看得懂”的代码

  • 优先使用显式类型与清晰控制流,减少过度链式/流式造成的匿名类、捕获变量开销。

  • 谨慎使用 Stream 在热点路径;数据量小、可读性优先时用之;高吞吐循环内仍建议 for/foreach

 
// 热点路径:Stream 版本可能产生装箱/拆箱与 Lambda 捕获开销 long sum = list.stream().mapToLong(Item::value).sum();// 更适合高频循环: long sum = 0L; for (int i = 0, n = list.size(); i < n; i++) {sum += list.get(i).value(); }

2.2 避免不必要的装箱与临时对象

  • 基元类型优先(int/long/double 等);集合需要时考虑 TIntArrayList 等特化结构(或引入 fastutil)。

  • 避免在循环中频繁创建 String/BigDecimal 等临时对象;字符串拼接用 StringBuilder

 
StringBuilder sb = new StringBuilder(128); for (User u : users) {sb.append(u.getId()).append(',').append(u.getName()).append('\n'); }

2.3 Switch 表达式、Record、Sealed Class 的价值(JDK 17+)

  • Record 适合不可变 DTO,减少样板代码,天然利于缓存与并发安全。

  • Sealed Hierarchy 明确分支,结合 switch 表达式减少 if-else 链,提高可读性与 JIT 内联机会。

 
public sealed interface Payment permits WxPay, AliPay {} public record WxPay(String appId, long amount) implements Payment {} public record AliPay(String pid, long amount) implements Payment {}long fee(Payment p) {return switch (p) {case WxPay wx -> Math.round(wx.amount() * 0.006);case AliPay ali -> Math.round(ali.amount() * 0.005);}; }

三、集合与算法:用对数据结构,事半功倍

3.1 HashMap、ConcurrentHashMap 的典型误用

  • 容量规划:避免 resize 抖动。估算元素数 n,初始容量设为 n / 负载因子(默认 0.75),四舍五入为 2 的幂。

  • 只读场景可用 Collections.unmodifiableMap 或开源的 不可变 Map,减少并发风险。

 
Map<String, Book> map = new HashMap<>((int)(expected / 0.75f) + 1, 0.75f);

3.2 List vs LinkedList

  • 几乎总是用 ArrayListLinkedList 的链式存储带来更差的 CPU 缓存局部性与额外节点对象。

3.3 LRU/LFU 缓存

  • 本地缓存优先选 Caffeine:高命中、写入竞争优化、支持基于大小/时间的淘汰策略。

 
Cache<String, User> cache = Caffeine.newBuilder().maximumSize(100_000).expireAfterWrite(Duration.ofMinutes(10)).recordStats().build();

3.4 排序、去重与 TopK

  • 大数据 TopK 使用 最小堆Count-Min Sketch;避免先全量排序后截断造成的 O(n log n) 浪费。


四、并发与线程池:高吞吐不等于多线程泛滥

4.1 线程池的三大纪律

  1. 用途隔离:将阻塞 I/O、CPU 计算、第三方调用分池管理,避免资源争抢。

  2. 参数可观测可调:核心/最大线程数、队列长度、拒绝策略并暴露指标(Prometheus/Actuator)。

  3. 拒绝策略兜底:生产通常采用 CallerRunsPolicy 或自定义降级,避免静默丢弃。

 
ThreadFactory tf = new ThreadFactoryBuilder().setNameFormat("io-pool-%d").build(); BlockingQueue<Runnable> q = new ArrayBlockingQueue<>(2000); ExecutorService ioPool = new ThreadPoolExecutor(64, 128, 60, TimeUnit.SECONDS, q, tf, new ThreadPoolExecutor.CallerRunsPolicy());

4.2 CompletableFuture 的“对与错”

  • 正确:组合/编排、并行汇聚、异常管道化,避免同步 get()

  • 误区:默认 ForkJoinPool 竞争严重;建议显式指定线程池

 
CompletableFuture<User> uf = supplyAsync(() -> loadUser(id), ioPool); CompletableFuture<Order> of = supplyAsync(() -> loadOrder(id), ioPool); CompletableFuture<Result> rf = uf.thenCombine(of, Result::merge).exceptionally(ex -> Result.fallback());

4.3 锁的策略:避免“无脑 synchronized”

  • 读多写少用 StampedLock 的乐观读,或 ReadWriteLock

  • 尽量缩小临界区、避免锁内调用外部方法。

  • 对热点数据采用 分段锁/分桶(striping)。


五、JVM 与 GC:把“看不见”的调快

5.1 分代调优基础

  • 新生代越大,Minor GC 越少;但过大可能拖慢 Minor 时间。

  • 对象存活期短的应用(电商下单、风控)适当增大 Eden。

  • -Xms = -Xmx 减少伸缩抖动;压测后再定比例。

5.2 垃圾收集器的选择(JDK 11/17)

  • G1:大多数服务可选,暂停时间可控,分区回收。

  • ZGC / Shenandoah:超低暂停(< 10ms),适合大堆/低延迟;权衡是吞吐与可用性需求。

常用参数示例:

 
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+ParallelRefProcEnabled -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dumps -XX:+ExitOnOutOfMemoryError

5.3 逃逸分析与标量替换

  • JIT 会将仅在方法内使用的短生命周期对象“标量化”,避免堆分配与同步开销。

  • 建议:热点路径多用局部变量,减少共享状态。


六、I/O 与序列化:吞吐的“隐形天花板”

6.1 BIO、NIO 与异步

  • 高并发网络服务建议使用 NettySpring WebFlux 实现非阻塞 I/O。

  • 文件 I/O:批量/顺序写优于随机写;零拷贝(sendfile) 技术适合大文件传输。

6.2 序列化选择

  • JSON 便捷但体积与 CPU 开销高;内部服务优先选择 Protobuf/FlatBuffers/Kryo

  • 千万级 QPS 的链路严禁频繁 JSON 解析——预热对象映射器、复用 ObjectMapper


七、响应式与背压:应对流量不均的利器

7.1 Project Reactor 背压模型

  • 通过 Flux/Mono 链式处理,天然支持背压,避免上游“淹没”下游。

  • onBackpressureBuffer/drop/latest 根据业务选型;请求-响应服务可在入口做速率转换。

 
Flux.range(1, 1_000_000).onBackpressureBuffer(10_000).publishOn(Schedulers.boundedElastic()).flatMap(this::process, 64) // 控制并行度.subscribe();

7.2 何时不建议响应式

  • 计算密集且无 I/O 等待时,响应式收益有限;命令式更简单可读。


八、数据库与缓存:把最“贵”的路径变最“短”

8.1 SQL 层面的硬性规则

  • 必须命中索引(EXPLAIN 走起);避免模糊前缀 %xx 导致全表扫。

  • 批量写入、合并小事务;短事务避免长时间锁等待。

  • 分页优化:深分页用“延续标记(seek)”代替 OFFSET

 
-- 深分页替代方案:基于上次最大主键 SELECT * FROM orders WHERE id > :lastId ORDER BY id ASC LIMIT 100;

8.2 缓存策略三连

  1. Key 设计可控:带版本号/业务前缀,方便回收。

  2. 过期与淘汰:热点分散过期时间(随机抖动),避免缓存雪崩。

  3. 回源与兜底:缓存穿透时 BloomFilter/短期空值缓存。


九、领域建模与分层:让“可维护”不拖慢“性能”

9.1 分层清晰但不教条

  • Controller 只做 鉴权/入参校验/编排

  • Service 聚焦 业务规则

  • Repository 只处理 持久化

  • DTO/DO/VO 分离使演进成本最小化。

9.2 领域对象不可变

  • 聚合根尽量不可变(或最小可变),减少并发条件下的共享状态问题;更利于缓存与重构。


十、异常与日志:少写 try-catch,多写结构化日志

10.1 异常分层

  • 业务可预期异常(如参数错误)使用自定义受检异常/错误码

  • 非预期异常转化为统一错误响应并记录上下文。

10.2 日志策略

  • 统一 traceIdspanId 贯穿调用链;

  • 避免字符串拼接日志参数,使用占位符;

  • 按级别采样:高 QPS 接口对 INFO/DEBUG 做采样,异常全量。

 
log.info("pay request uid={}, order={}, amount={}", uid, orderId, amount);

十一、测试与质量:让性能优化有“安全网”

11.1 单测策略

  • 避免“只测 getter/setter”;聚焦 复杂分支与边界

  • 快速失败:业务断言(assertThrows)、契约测试(接口兼容)。

11.2 基准测试(JMH)

  • 避免微基准陷阱:预热避免逃逸消除无用代码

  • 关注 p95/p99,而非平均值。

 
@BenchmarkMode(Mode.Throughput) @Warmup(iterations = 5) @Measurement(iterations = 10) @OutputTimeUnit(TimeUnit.MICROSECONDS) public class MapBench {private static final Map<String, Integer> MAP = new HashMap<>();static { /* init data */ }@Benchmarkpublic int getHit() {return MAP.get("key-100");} }

十二、可观测性:度量—分析—优化的闭环

12.1 度量四象限

  • 指标(Metrics):QPS、延迟、错误率、线程池利用率、JVM 内存/GC。

  • 日志(Logs):结构化、可检索、带上下文。

  • 链路(Trace):跨服务调用可视化。

  • 事件(Events):发布、扩容、配置变更与告警。

12.2 关键看板

  • 接口延迟分位(P50/P95/P99),线程池拥塞度,GC 暂停时间直方图;

  • 热点 SQL 排行与慢查询明细;

  • 缓存命中率/穿透/回源比。


十三、部署与回滚:性能优化的“保险丝”

13.1 蓝绿/灰度与特性开关

  • 灰度 + 熔断:新版本先在小流量验证性能并观测趋势。

  • 特性开关:性能优化代码尽量以开关控制,可快速关闭回退。

13.2 容器与 JVM 亲和

  • 容器内请设置 堆/线程/FD 上限

  • JVM 感知容器资源(JDK 10+ 已默认支持 cgroup),但仍建议显式设置 -Xmx 与池大小,避免误判。


十四、典型“坑位”清单(生产事故高发)

  1. 默认线程池 + 无限队列 导致 OOM。

  2. 热点路径频繁创建对象BigDecimal/SimpleDateFormat 非线程安全)。

  3. JSON 反序列化缺省值 导致布尔/数值异常。

  4. ConcurrentHashMap 里复合操作不原子(先 getput 的竞态)。

  5. 缓存雪崩:同刻过期;解决:抖动、预热、双层缓存。

  6. 深分页 拖垮数据库;解决:seek 模式或游标。

  7. 默认 ForkJoinPool 争用 导致“看不见的阻塞”。

  8. 日志过量:高峰期 IO 占满,接口抖动。

  9. JIT 暖机期:压测未充分预热,线上前 10 分钟抖动。

  10. 限流算法实现错误:滑动窗口与漏桶实现不严谨,导致突发漏限。


十五、一个端到端样例:从慢接口到稳定低延迟

背景:支付聚合接口 P99 800ms,偶发超时。
定位路径

  1. 指标:线程池队列积压 → I/O 线程与业务线程混用。

  2. 链路:外部风控服务 200ms+,并发调用未隔离。

  3. SQL:账单表深分页,QPS 上来后 RT 抖动。

优化动作

  • 线程池隔离:I/O、外部调用、计算分池;拒绝策略改为 CallerRuns 并告警。

  • 并行编排CompletableFuture 并行拉取外部数据,显式自定义线程池。

  • 缓存与分页:账单分页改“seek”,同时缓存热门账单元数据。

  • 降级与兜底:外部风控超时走缓存/默认策略 5 分钟。

  • GC 调整:启用 G1,设置 MaxGCPauseMillis=100,观察暂停直方图。

结果:P99 从 800ms 降到 220ms,错误率 < 0.05%,线程池拥塞告警消失。


十六、团队落地清单(可直接纳入代码规范/CR 模板)

  • 热点路径禁止深层级 Stream/map/flatMap 链式;必要时改 for。

  • Map/List 初始容量按估算值设置,避免频繁扩容。

  • 线程池必须命名、隔离、可观测、可调整;禁止无限队列。

  • CompletableFuture 必须显式线程池,链路必须处理异常。

  • 每个接口必须暴露基础指标(QPS/RT/错误率);每个线程池暴露活跃/队列/拒绝计数。

  • 数据访问层必须有慢 SQL 监控与索引审计。

  • 深分页禁止;提供游标/seek 与导出任务。

  • 缓存 key 规范化、过期抖动、穿透/击穿/雪崩预案齐备。

  • 关键优化点具备 特性开关 与可回滚策略。

  • 基准测试与回归压测必须纳入 CI/CD,变更前后对比分位延迟。


结语

性能优化不是“某几条魔法参数”,而是一套可度量、可复用、可回滚的工程化方法。本文从代码层、数据结构、并发、JVM、I/O、响应式、数据库、缓存、观测、部署全链路展开,目的在于让团队把“快”与“稳”同时握在手里。

相关文章:

Java 高性能与可维护性实战:从语言特性到工程化全链路

一、设计目标:为什么“快”和“稳”必须同时追 在真实业务里,“快”(吞吐、延迟)与“稳”(可维护、可演进)往往拉扯。高性能带来的复杂度不应成为维护负担,而可维护的抽象也不应牺牲关键路径。可落地的目标是:可预测性能:接口在 SLA 下延迟稳定,P95/P99 可控。渐进式…...

二叉树的递归遍历

前中后序的递归遍历 递归算法的三要素确定递归函数的参数和返回值:要确定哪些参数是递归过程中需要处理的,需要处理的就在递归函数里面加上这个参数;然后确定每次返回的递归值是什么; 确定终止条件:必须写终止条件;如果不写终止条件就会栈溢出; 确定单层递归的逻辑: 确…...

我的大学成长与规划

大家好,我是李思慧,一名计算机科学与技术专业的大二学生。生活里,我是个爱折腾的人,喜欢在文字的世界里遨游,也热衷于用视频和图片记录生活、表达创意。 在信工分团委宣传部当干事到现在的部长,是我成长很快的一段时光。从最开始跟着学长学姐学习写各种活动和通知的推文,…...

【笔记】拉格朗日插值

拉格朗日插值的推导对于一个 \(n\) 次多项式 \(f(x) = \sum_{k = 0}^n a_kx^k\),我们只要知道它在 \(n+1\) 个不同点处的取值,就可以进一步解出它的系数 但使用高斯消元法的时间复杂度是 \({\cal O}(n^3)\) 的,如果我们只是想知道这个多项式在某一点 \(x\) 处的值,希望有复…...

自定义渲染管线(Unity Cocos)

参考链接: 团结引擎 - 手册: 在自定义渲染管线中创建简单渲染循环 可定制渲染管线(Deprecated) | Cocos Creator Custom SRP - Custom Render Pipeline | 三叔的数字花园 自定义渲染管线_Unity SRP从零搭建一套图形渲染管线_UWA学堂(翻译的Catlik,还收费) Unity Custom S…...

这是一个测试

这是一个测试...

文献阅读 | Survey of Hallucination in Natural Language Generation

问题描述 本文主要讲了NLG中的幻觉现象 幻觉定义:模型生成不忠实于源内容或无意义的文本 幻觉分类:内在幻觉(矛盾、完全错误的)、外在幻觉(无法被验证) 幻觉危害:隐私泄露 成因:评估指标:统计 metric:基于 n-gram 重叠,如 PARENT(结合源和目标)、Knowledge F1(对…...

技术 | LLaMA Factory微调记录重修版

之前投的那篇教程我自己回看一遍都不太搞得明白,从新梳理一遍 1. 云服务器准备 恒源云 (gpushare.com) 配置建议:GPU: RTX 3090 (24GB) 或 RTX 4090 (24GB) 系统: Ubuntu 20.04/22.04 存储: 至少 50GB 空间2. 环境检查与初始化 # 检查GPU状态 nvidia-smi# 检查系统信息 df -h…...

支付中心的钱包类业务应该怎么设计

钱包类业务在支付行业里有一些比较固定的模式(无论是支付宝余额宝、微信零钱,还是 Stripe Balance / Paytm Wallet),基本设计目标是:余额和资金安全:必须有严格的账实一致、幂等和防篡改能力。高并发读写:充值/消费/退款频繁,要求快速的扣减和回滚能力。清晰的流水:任…...

MySQL索引浅析

NORMAL:普通索引,仅用于加速查询,允许字段值重复。 UNIQUE:唯一索引,不仅能加速查询,还会强制字段值的唯一性(即该字段下的值不能重复)。 FULLTEXT:全文索引,用于全文搜索场景(如文章内容的关键词检索)。 SPATIAL:空间索引,用于地理空间数据类型(如 GEOMETRY、P…...

WF 2025 游记

第一次出国旅行因为错误在 EC-Final 显神威成功出线,我得以以 RCDS 随队人员的身份作为 ICPC Guest 参与 2025 ICPC World Final Baku. Day -5 ​ 被然叔拉到苏州给软件杯打工。 ​ 出站时落雨大暴,翻书包发现没有雨伞,凌乱中就看到然叔开着辆绿色 SUV 过来接我,到了苏州大…...

17.时间处理

17.时间处理日期和时间是日常编程常用的功能之一。如果没有日期和时间,会导致很多功能无法实现,例如日志记录、定时任务、时间延迟等。Go标准库提供了操作日期和时间的方法。在提到时间,还需要注意不同地区的时间会不一样,所以这里还需要考虑到不同时区、不同历法等带来的影…...

[MCP][02]快速入门MCP开发

快速入门MCP Server和MCP Client 开发,以及Client集成LLM前言 很多文档和博客都只介绍如何开发MCP Server,然后集成到VS Code或者Cursor等程序,很少涉及如何开发MCP Host和MCP Client。如果你想要在自己的服务中集成完整的MCP功能,光看这些是远远不够的。所以本文及后续的M…...

numpy入门

numpy 基本属性 import numpy as np arr = np.arange(15).reshape((3,5)) print(arr) # [[ 0 1 2 3 4],[ 5 6 7 8 9],[10 11 12 13 14]] print(type(arr)) # 类型 <class numpy.ndarray> print(arr.shape) # 形状元组 (3, 5) print(arr.ndim) # 维度 2 print(arr…...

【simpleFOC】一个电机如何模拟不同旋钮的手感反馈?

原文链接:https://mp.weixin.qq.com/s?__biz=MzU1NjEwMTY0Mw==&mid=2247597033&idx=2&sn=e92f8f1dec8b363aa209788354f8fa64&chksm=fad1130bfafd0b9af53b0f110e354d8772f6c5a0d98735690d1c0c75d0c3c75785ea1041ea1a&scene=27概述simpleFOC可以实现对各种…...

第一周作业2

我叫陈俊杰,今年19岁,目前是一名计算机相关专业的学生。很高兴能在博客园与大家分享我的学习与生活经历。 兴趣爱好 我热爱运动,尤其是羽毛球、篮球、游泳和攀岩。这些运动不仅让我保持了健康的体魄,也培养了我的团队协作能力和坚持不懈的精神。此外,我也喜欢探索新技术,…...

第一次课堂作业

大家好!我是一名数据科学与大数据技术专业的大三学生。如果用一句话形容现在的自己,那就是 “正处在专业技能积累的爬坡期,一边为过去的基础不扎实查漏补缺,一边对未来的技术方向满怀期待”。这篇博客想和大家聊聊我的故事、我的技能现状,以及我为接下来的学习和未来发展制…...

[高可用/负载均衡] Ribbon LoadBalancer: 开源的客户端式负载均衡框架

0 序言某项目上,原先为自建的数据库集群提供了负载均衡IP服务器(简称: ELB IP Server),客户端的数据库请求URL都统一走ELB IP。但随着业务量的增长,识别到一个严峻的现实:其一,考虑到未来的业务增长情况,云厂商提供的 ELB IP Server 云服务的入网带宽必将完全无法满足本项…...

梦话周记

忘记是哪天了。 傍晚,暗蓝色的天空,水雾,朦胧的光晕。 此时的天空与以往理解的深邃可谓是一点关系都没有,它的深邃不再来自于天空,而是来自于大海。什么地方是深蓝色的,湿润的,广阔的?海洋。 其实气体与液体有很多相似之处,它们都有浮力,都是流体。我们是不是也生活在…...

【电机控制】无刷电机结构阐述---磁极数、槽数

一、磁极数P与槽数N 1.磁极数P 定义:转子上磁极的数量,既转子上磁钢的数量,磁钢均匀的排列在转子上磁铁必定是NS极成对使用,所以极数必然是偶数。 2.槽数N 定义:定子铁芯的槽数量,既定子上的电磁铁极数量,每一个槽上都饶有一组线圈,如上图有12个槽,所以是12N电机由于无…...

金刚怒目是我哭

金刚怒目是我哭是你们太不善良,还是我太不正常马喽马基米退圈了。我下载的its my cry没了,my mujuca也只有前三集 这个可以说是我的入坑作 确实有点刻意 反正不是日常向 即使现在看来也是无可厚非的 但还是爆了 我应该说戾气很重吗 杂食党,,,理中客,和稀泥 说不出话 雨...

nginx使用默认端口80作为服务端口

背景:http默认端口是80,配置nignx.conf,希望服务url直接输入ip不用输入端口 给server配置80以及加default_server ,老是报错,后面发现是因为 include /etc/nginx/sites-enabled/*; 这个配置的server段占用了80 解决办法:把默认配置/etc/nginx/sites-available/default 里…...

机器学习和推荐算法顶级会议和期刊

在机器学习(ML)与推荐系统(Recommender Systems)领域,CIKM 和 TKDE 是信息检索、数据挖掘及数据库领域的重要学术载体,二者分别以会议(CCF A 类)和期刊(CCF A 类)形式存在,覆盖 “推荐算法”“用户行为分析”“知识图谱与推荐融合” 等核心方向,是该领域研究者发表…...

java使用mysql

用jdbc操作mysqlhttps://www.runoob.com/java/java-mysql-connect.htmlmysql8之前和之后的连接配置有差异。实际使用时,一般还需要个功能,就是连接池。这个springboot自带了,是hikari。hikari初始化的时候,也需要配置mysql的连接参数,所以一般都是在这里设置的。https://w…...

2025年医疗行业API安全最佳实践与深度案例分析:从理论到全面落地

2025年医疗行业API安全最佳实践与深度案例分析:从理论到全面落地医疗API安全是保障患者隐私和医疗数据安全的关键环节。医疗机构、信息化服务商和安全厂商需遵循GB/T《数据接口安全风险监测方法》要求,建立覆盖"发现-监测-处置"的全生命周期防护体系。以金华市中心…...

2026 NOI 做题记录(二)

推荐阅读:D、N、W、Y、Z、AB、AC、AD、AE、AFContest Link \(\text{By DaiRuiChen007}\)A. [ARC194E] Swap 0^X and 1^Y (3) Problem Link 删掉所有的串 \(0^x\) 以及 \(1^y\),每次操作不会跨过里面的连续段,因此剩下的串必定相同。 取出每个连续段,任意两个 \(0\) 连续段在…...

lc1027-最长等差数列

难度:中等(后期)题目描述给定一个数组,计算最长等差数列的长度示例 输入:nums = [3,6,9,12] 输出:4 解释:3 6 9 12输入:nums = [9,4,7,2,10] 输出:3 解释:4 7 10输入:nums = [20,1,15,3,10,5,8] 输出:4 解释:20 15 10 5题解思路:DPf(i,j): 以 i 结尾,公差为 j 结…...

13

#include <math.h>int main() { int n; scanf("%d", &n); while (n--) {int l, r;scanf("%d %d", &l, &r); int y_max = (int)sqrt(r);//算l的平方根,然后向上取整并强制转换为整数, y >= lint y_min = (int)ceil(sqrt(l));int c…...

np.zeros函数

np.zeros 是 NumPy 库中的一个非常常用的函数,它的作用是创建一个指定形状和数据类型的新数组,并用 0 来填充所有元素。 np.zeros 的基本用法 函数的完整签名是 numpy.zeros(shape, dtype=float, order=C)。shape:你想要创建的数组的形状。可以是一个整数(用于一维数组)或…...

Langchain之让LLM拥有记忆

langchain的Memory 如果AI有记忆,我们就不需要手动维护一个储存消息历史的列表 让LLM拥有记忆的方法有很多,我更喜欢使用的方法是以下方案,其优点是灵活度比较高 from langchain.memory import ConversationBufferMemory from langchain_core.prompts import ChatPromptTemp…...

25.9.14

(今天的)...

.net PublishSingleFile 打包程序提取

.net PublishSingleFile 打包程序提取 目录.net PublishSingleFile 打包程序提取提取 Bundle 的常用方法分界线工具SingleFileExtractor (低版本)SelfContainedExtractor (.NET 5+)定位offset <PublishSingleFile>true</PublishSingleFile>该部分内容为AI…...

实用指南:Java类加载机制

实用指南:Java类加载机制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...

C 语言注释

C 语言有两种注释, 即 // 和 /* ... */. /* */ 被称为 C 风格的注释, 是 ANSI C 的注释. // 被称为 C++ 风格的注释, 是 C99 新增的注释, 只有支持 C99 和 C11 的编译器才能识别这种注释. 该风格的注释被广泛应用于 C++ 和 Java. 注释在预编译阶段会被替换为一个空格. 代码示例…...

扫描线

前题引入 扫描线是用来求给你n个矩阵求他们围起来的总面积。 问题分析 可能有一些弱智的小朋友说直接把所有的矩阵的面积加起来再减掉重复的不就可以啦。 如果,你这么想请问(1<=n<=1e5)请问你该如何应对,所以我们就引入了个新算法:扫描线(废话) 先在我们先画一张图:…...

C语言中的查找与排序算法整理

查找与排序算法整理 1 查找算法 1.1 顺序查找 1.1.1 算法原理 顺序查找又称线性查找,是一种基本的查找算法,其原理是:从头开始遍历:从数据集的起始位置开始,逐个检查每个元素。 比较目标:对于每个遍历到的元素,将其与目标元素进行比较。 查找成功:如果当前元素等于目标…...

k8s练习

k8s练习 1. 简述Kubernetes是什么? Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。 2. Kubernetes的组成有哪些? Kubernetes主要由以下几个组件组成:kube-apiserver:提供REST API服务,作为系统的控制入口。 kube-controller-manager:执…...

css-2

css正常布局流浮动弹性盒子a {//行内盒子,比如a如果给了flex布局,则可以直接设置宽高display: flex }淘宝京东多行伸缩布局 瀑布流百度图片综合案例...

AtCoder Beginner Contest 423 ABCDEF 题目解析

A - Scary Fee 题意 你的存折中有 \(X\) 元,从存折中取钱需要花手续费。 取钱必须以 \(1000\) 元为单位,并且每取 \(1000\) 元就需要额外支付 \(C\) 元的手续费。 问你最多可以取出多少钱? 思路 我们可以把 \(C\) 元手续费当作单次取钱的一部分,也就是每当我们想取 \(1000\…...

numpy中的shape属性

.shape 不是一个函数,而是numpy的一个属性(attribute),用于获取数组维度信息。它返回一个元组(tuple),元组中的每个元素代表对应维度的大小。 import numpy as np# 1D 数组 (向量) arr1d = np.array([1, 2, 3, 4, 5]) print(f"数组内容: {arr1d}") print(f&qu…...

mac 查看fat32磁盘

1.首先安装社区维护的ntfs工具。 brew tap gromgit/homebrew-fuse #### brew install ntfs-3g2.然后就是mount啦 这里的/dev/diskXsY 就是自己看啦,看到下面是没有externatl(外部拓展这一项的,或者使用磁盘工具,如果插上了u盘也是可以看到的)然后使用命令 mkdir /Volumes/…...

使用Smart-Doc为Java项目生成gRPC API文档

本文详细介绍了如何在Java微服务项目中利用Smart-Doc工具自动生成gRPC API文档,包括配置步骤、优势分析以及实际操作指南,帮助开发者高效管理API文档。Smart-Doc:在Java项目中生成gRPC API文档 在现代Java微服务中,gRPC通过其高效的二进制协议和多语言支持简化了服务间通信…...

数字时钟用的什么字体

下载字体 字体 DS-Digital放置字体 引入字体:<style scoped> /* 定义字体 */ @font-face {font-family: DS-Digital; /* 自定义字体名称 *//* 引入不同格式的字体文件,确保兼容性 */src: url(@/assets/fonts/DS-DIGI.TTF) format(truetype),url(@/assets/fonts/DS-DIG…...

Python数据分析零基础完整课程大纲(详细版)【202509第1版】 - 指南

Python数据分析零基础完整课程大纲(详细版)【202509第1版】 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

详细介绍:uni-app 根据用户不同身份显示不同的tabBar

详细介绍:uni-app 根据用户不同身份显示不同的tabBarpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...

VSTO QQ群 61840693 解散通知【新群193203228 】

由于各种原因,成立16年的VSTO交流群于近日停用,损失粉丝两千人。 感谢这么多年热爱我的粉丝,如果还要跟我学习VBA,请加新群193203228...

kettle从入门到精通 第107课 ETL之kettle json_input 一个点号引发的血案

场景:在一个kettle交流群内,有一个小伙伴求助:大致意思是json input的输入参数的key中存在点号,凡是带点号的key都无法正确获取。 今天一起来分析下使用多种方式来解决这个问题,希望后续有人遇到此类问题时可以秒杀它,而不是花费N根头发!!! 1、json数据构造{"id&…...

【2024-2025第二学期】助教工作学期总结

一、助教工作的具体职责和任务: 作为《人工智能导论》课程助教,我的主要职责包括协助课程老师完成教学支持工作,确保课程顺利运行。具体任务包括:前期负责对接课程老师对比赛进行组织,比如数字中国创新大赛的各赛道报名、统计第十六届视觉艺术设计赛省赛的报名、上课后课程…...

Clion 实现多个 main 函数执行互不影响

安装插件 C/C++ single File Execution。如果 Clion 中安装不上,可以在官网安装:安装成功后,源文件右键,会提示:点击后,Clion 的右下角会提示:reload 这个文件夹:选择刚刚 add 的源文件,即想要执行的源文件:在 main.c 和 Hello.c 两个源文件都包含 main() 函数时也可…...

腾讯终于对Claude code下手了?我拿它跑完一个真实项目,结果有点意外…

前几天看腾讯也发布和开源了他们的Claude code,名字是Codebuddy code。 就下载下来试了试效果(说实话,一开始是冲着它能免费用GPT-4o、Claude 3.5这些顶级模型去的)。 整体来看效果还不错,对于刚开始发布来说,我认为已经可以初步当做生产力工具了。 目前国内版本可以使用的…...