- 博客(441)
- 资源 (1)
- 收藏
- 关注
原创 Redis 中 USED 和 RSS
Redis内存使用解析:USED与RSS的核心区别 摘要: USED内存是Redis内部统计的实际存储数据内存(键值对、字典结构等),反映业务数据占用,通过INFO memory的used_memory字段查看。RSS是操作系统统计的Redis进程总物理内存(USED+内存碎片+系统开销),通过used_memory_rss字段查看。关键区别:USED是"有效内存",用于maxmemory配置;RSS是"总占用内存",用于排查碎片/swap问题。健康状态应为RSS略大
2026-01-23 17:09:46
368
原创 java学习--Map遍历方式
本文介绍了Java中Map遍历的6种常用方法:1)遍历keySet仅获取键;2)keySet+get(key)获取键值(性能较差);3)entrySet高效获取键值对(推荐);4)values仅获取值;5)Java8+的Lambda表达式;6)迭代器遍历(支持边遍历边删除)。总结指出:日常开发推荐entrySet或Lambda表达式,特殊场景根据需要选择其他方式,避免使用keySet+get(key)遍历大数据量Map。
2026-01-19 09:34:06
382
原创 什么是召回(Recall)
摘要:召回(Recall)是检索系统(如RAG、搜索引擎)中的初始步骤,旨在从全量数据中尽可能多地筛选出与用户查询相关的候选结果(追求全面性而非精确性)。其核心特点包括:1)高召回率优先,通过简单算法(如向量/关键词/混合召回)快速处理海量数据;2)召回率=检索到的相关结果数/全量相关结果数×100%,需在效率与覆盖率间平衡。召回后需经粗排(快速过滤)和精排(精准排序)才能生成最终结果。实践中需合理设置召回数量(通常为最终结果的20-50倍)并选择适配策略(如Milvus向量召回)。召回是排序的基础,二者协
2026-01-16 09:42:56
300
原创 什么是粗排和精排
摘要: 在RAG、推荐系统等场景中,粗排(Coarse-grained Ranking)和精排(Fine-grained Ranking)通过“先海选、再精选”的两级策略平衡效率与精度。粗排快速筛选候选集(如ANN算法),侧重召回率;精排精细化排序(如交叉编码器),提升准确性。该策略尤其适用于海量数据场景,避免全局精排的低效问题。LangChain与Milvus结合可实现:粗排召回候选文档,精排重排输出Top结果,最终提升RAG效果。两级排序兼顾速度与精度,是优化检索系统的有效方案。
2026-01-15 16:35:12
853
原创 什么是置信度
置信度是AI技术中衡量检索结果与问题匹配度或模型决策可靠性的量化指标,范围通常为[0,1]或百分比。在RAG系统中,置信度通过向量相似度计算(如余弦相似度)实现,值越高表示相关性越强。其核心应用包括:过滤低质量检索结果、指导Agent决策流程(高置信度直接回答,低置信度补充检索或拒绝回答)以及提升系统可靠性。实际应用中需根据业务场景调整置信度阈值,不同向量数据库的计算方式也需注意差异。置信度机制有效降低了AI幻觉风险,提升了检索增强生成系统的准确性。
2026-01-15 16:06:05
349
原创 java学习--LinkedHashSet
摘要: LinkedHashSet是Java集合框架中的有序集合,继承自HashSet,底层通过哈希表(高效查询/去重)和双向链表(维护插入顺序)实现。其核心特性包括:严格保留元素插入顺序、不可重复(基于hashCode()和equals())、允许单个null值、非线程安全,操作时间复杂度为O(1)。与HashSet(无序高效)和TreeSet(排序但较慢)相比,LinkedHashSet适用于需保留插入顺序且去重的场景。使用时,自定义类需重写hashCode()和equals()以确保去重逻辑正确。示例
2026-01-14 23:15:25
568
原创 java学习--HashSet
摘要:HashSet是Java集合框架中基于HashMap实现的Set接口实现类,具有无序、不可重复、允许单个null值和非线程安全等特点。其去重机制通过hashCode()和equals()方法实现,自定义类需重写这两个方法。HashSet查询增删效率高(O(1)),适合无需有序的去重场景。文章详细介绍了HashSet的原理、常用操作示例,并与TreeSet、LinkedHashSet进行了对比分析,指出应根据有序性需求选择不同实现类:HashSet适用于无序场景,TreeSet适合排序需求,Linked
2026-01-14 23:03:21
1000
原创 java学习--LinkedList
摘要: LinkedList是Java中基于双向链表实现的List,支持高效的头尾增删(O(1)),但随机访问效率低(O(n))。它实现了Deque接口,可作队列、栈使用,适用于频繁增删场景。与ArrayList相比,LinkedList增删快但查询慢,内存占用较高。典型应用包括实现队列、栈或需要频繁插入/删除的操作。选择时,查询多用ArrayList,增删多用LinkedList。线程不安全,需额外同步处理。
2026-01-14 22:29:16
481
原创 java学习--什么是线程安全和不安全
摘要:本文通过代码示例对比了线程安全与线程不安全的区别。当多个线程同时操作共享数据时,线程不安全(如ArrayList)会导致数据错乱或丢失,而线程安全(如Vector)通过加锁机制保证数据一致性。线程不安全的本质是非原子操作缺乏同步控制,而线程安全以性能为代价实现数据正确性。实际应用中应根据场景选择:单线程/只读场景可使用不安全类提高性能,多线程写操作必须使用线程安全类或手动加锁。核心区别在于线程安全通过同步机制保证多线程操作的正确性,而线程不安全则无法保证。
2026-01-13 23:20:09
1342
原创 java学习--Vector
摘要:Vector是Java中线程安全的动态数组(JDK1.0),所有核心方法都加了synchronized关键字,性能低于ArrayList。其扩容机制默认2倍(可指定增量),支持Iterator和Enumeration遍历。与ArrayList相比,Vector线程安全但性能差,适用于低并发场景。实际开发中更推荐使用Collections.synchronizedList或CopyOnWriteArrayList实现线程安全。Vector与ArrayList的API兼容,但创建时应合理指定初始容量和扩容
2026-01-13 23:10:17
781
原创 java学习--ArrayList
ArrayList是Java中基于动态数组的List实现,支持快速随机访问(O(1))但增删效率较低(O(n))。核心特性包括:动态扩容(默认1.5倍)、允许null值和重复元素、有序存储。常用操作包括add/get/set/remove等,遍历时需注意使用迭代器删除元素避免异常。非线程安全,初始容量默认为10,建议预估容量优化性能。相比普通数组,ArrayList长度可变且提供丰富操作方法,但只能存储对象类型。使用时需注意索引越界和并发修改异常问题。
2026-01-13 23:00:18
357
原创 java学习--Collection的迭代器
Java迭代器(Iterator)是遍历Collection集合的标准工具,提供hasNext()、next()和remove()三个核心方法。迭代器通过指针移动逐个访问元素,支持遍历过程中安全删除元素。使用时需注意:必须先调用hasNext()判断,再调用next()获取元素;遍历中必须用迭代器的remove()方法而非集合的remove();增强for循环本质是迭代器的语法糖,同样不能直接修改集合。迭代器确保集合遍历的统一性和安全性,是Java集合操作的重要工具。
2026-01-12 23:31:58
516
原创 java学习--Collection
摘要: Collection是Java集合框架的根接口,定义单列集合的通用操作(如add/remove/contains)。核心子接口包括:List(有序可重复,如ArrayList、LinkedList)、Set(无序不可重复,如HashSet、TreeSet)和Queue(FIFO队列)。实现类通过不同数据结构(数组、链表、哈希表等)实现特性差异。使用时需注意泛型、遍历方式(迭代器/增强for)及Set去重原理(hashCode+equals)。示例展示了Collection的基本操作,如添加、删除和遍
2026-01-12 23:20:54
1086
原创 什么是RAG
RAG(检索增强生成)是一种将外部知识检索与大语言模型结合的AI架构,通过"检索-增强-生成"流程解决大模型知识滞后等问题。其核心价值在于降低幻觉、实时更新知识、适配专业领域并降低成本。主流架构包括基础RAG、多模态RAG、智能体RAG和图谱RAG,适用于客服、文档问答、行业知识库等场景。RAG技术无需频繁微调模型,通过检索外部知识库即可提升回答准确性,是大模型落地应用的关键技术。
2026-01-05 19:34:37
349
原创 java学习--第三代日期时间
Java 日期时间 API 发展历经 三代,java.time 包(JDK 1.8 推出)是官方最终的最优解,也被称为 JSR 310 规范,彻底解决了前两代 API 的所有痛点:
2025-12-29 22:19:48
1165
原创 java学习--Calendar
Java的Calendar类是用于日期时间操作和计算的工具类,作为Date类的替代方案。其核心特性包括:抽象类需通过getInstance()获取实例、字段索引化操作、存在月份从0开始等设计缺陷、线程不安全等。主要使用步骤为获取实例→操作字段→结果处理。核心操作包括获取/设置/增减日期字段,需注意月份和星期的修正。Calendar与Date可互相转换,但格式化需借助SimpleDateFormat等工具类。开发中应注意其高频坑点,如月份从0开始、线程不安全等。建议新项目优先使用JDK8的java.time新
2025-12-29 20:27:54
629
原创 java学习--Date
摘要:Java的java.util.Date类是基础日期处理类,表示精确到毫秒的时间瞬间(从1970年1月1日算起)。由于线程不安全、设计缺陷等问题,JDK1.1后大部分方法被废弃,仅保留getTime()等核心方法。JDK8推出的java.time新API(如LocalDateTime)是推荐替代方案。Date需配合SimpleDateFormat(线程不安全)或DateTimeFormatter(线程安全)进行格式化/解析。与新版API互转需通过Instant桥梁。开发中应避免使用废弃方法,并注意时间戳
2025-12-28 21:18:06
906
原创 java学习--BigInteger和BigDecimal
Java提供了java.math包中的BigInteger和BigDecimal类来处理超大数值。BigInteger用于任意长度的整数运算,突破long类型的限制;BigDecimal解决浮点数精度问题,适用于金融计算等场景。两者都是不可变类,运算需调用方法而非运算符。BigDecimal必须用字符串构造,除法需指定舍入模式,比较大小要用compareTo方法。虽然大数类功能强大,但性能低于基本类型,应合理选择使用。金融计算等需要高精度的场景必须使用BigDecimal,常规小数值仍建议使用基本数据类型。
2025-12-28 20:35:09
1314
原创 java学习--System
Java的System类是java.lang包下的核心系统类,提供静态方法和属性进行系统级操作。主要特性包括:1)标准输入输出流(in/out/err);2)系统控制方法(exit/gc);3)高效数组复制(arraycopy);4)时间获取(currentTimeMillis/nanoTime);5)环境变量和系统属性管理(getenv/getProperty)。System类为final类,无法实例化,所有功能通过静态方式调用。典型应用场景包括程序退出、内存管理、性能统计和系统信息获取等,是Java与系
2025-12-23 10:04:37
868
原创 java学习--Arrays
Java的Arrays类是java.util包中的数组操作工具类,提供多种静态方法简化数组操作。主要功能包括:排序(sort()支持基本类型和引用类型)、查找(binarySearch()需先排序)、转换字符串(toString()和deepToString())、填充(fill())、复制(copyOf()和copyOfRange())、比较(equals()和deepEquals())以及数组转集合(asList())。使用时需注意:二分查找前必须排序,多维数组要用deep方法,asList()返回的是
2025-12-23 09:31:03
684
原创 java学习--Math 类常用方法
Java Math类提供了丰富的数学运算功能,主要包括:基本算术运算(绝对值、取整、取余)、数值比较与极值(max/min/clamp)、幂运算与指数对数(pow/sqrt/log)、三角函数(sin/cos/tan)、随机数生成(random)以及常用数学常量(PI/E)。所有方法均为静态方法,可直接调用。适用于数值计算、几何运算和随机数生成等场景,是Java开发中必备的数学工具类。
2025-12-22 22:32:46
502
原创 java学习--String、StringBuilder、StringBuffer 的核心区别
摘要:Java中String、StringBuilder和StringBuffer的主要区别在于可变性、线程安全和性能。String是不可变字符序列,线程安全但性能最低;StringBuilder可变且性能最高,但非线程安全;StringBuffer可变且线程安全,性能中等。适用场景:字符串不变用String,单线程修改用StringBuilder,多线程修改用StringBuffer。特别要注意循环拼接时应使用StringBuilder而非String的"+"操作,以避免性能问题。
2025-12-22 22:13:37
864
原创 java学习--StringBuilder
摘要:Java中的StringBuilder是一个高效处理可变字符串的类,解决了String类不可变导致的拼接效率问题。其核心特性包括可变字符序列、非线程安全、高效性能和自动扩容机制。常用方法有append()拼接、reverse()反转、insert()插入、delete()删除等,支持链式调用。适用于单线程下大量字符串操作场景,但需注意线程安全问题。建议预估字符串长度指定初始容量,减少扩容损耗,完成操作后通过toString()转为String类型使用。相比StringBuffer,StringBuil
2025-12-22 20:43:06
797
原创 java学习--String和StringBuffer互转
摘要:本文介绍Java中String与StringBuffer的相互转换方法。String转StringBuffer可通过构造方法(推荐)或append()实现;StringBuffer转String建议使用toString(),也可通过String构造方法或substring()实现。关键注意事项:转换后对象相互独立,修改不影响原值;性能上推荐直接使用构造方法和toString();线程安全场景需使用StringBuffer,否则建议使用StringBuilder以提高效率。
2025-12-19 20:05:50
261
原创 java学习--String
本文全面解析Java中的String类,重点阐述其不可变性、字符串常量池机制和内存优化策略。String对象创建后不可修改,所有操作都会生成新对象;字符串常量池可复用相同字符串以减少内存占用。文章详细介绍了常用方法(如equals()、substring()等),并指出性能优化要点:避免循环中使用"+"拼接字符串,推荐使用StringBuilder/StringBuffer;合理运用intern()方法减少重复字符串内存消耗。同时提醒注意常见陷阱,包括"=="与equ
2025-12-17 09:51:47
635
原创 java学习--8个包装类
摘要:Java提供8个包装类(Byte、Short、Integer、Long、Float、Double、Character、Boolean)将基本数据类型转为对象,解决面向对象编程中的类型限制问题。核心特性包括:继承Number/Object类、不可变性、自动装箱拆箱(JDK1.5+)、部分类型的缓存机制(-128~127)。包装类支持集合操作、泛型使用和空值处理,但需注意NPE风险、equals比较和性能开销。这些类是连接基本类型与引用类型的关键桥梁。
2025-12-13 21:51:25
814
原创 java学习--异常之throws
摘要:Java中的throws关键字用于声明方法可能抛出的异常类型,将异常处理责任转移给调用者。它主要用于编译时异常(必须声明),而运行时异常可声明但不强制。语法为方法名() throws 异常类型。throws与throw不同,前者声明异常,后者抛出异常对象。子类重写方法时,throws声明的异常不能比父类更宽泛。最佳实践包括声明具体异常、避免滥用Exception、限制异常传递深度等。合理使用throws可提升代码可维护性。
2025-12-11 14:12:08
524
原创 java学习--异常
Java异常处理机制解析:体系分为Error(不可恢复)、编译时异常(强制处理)和运行时异常(建议预判)。核心语法包括try-catch捕获、throws声明和throw主动抛出。最佳实践强调:避免吞异常、保留异常链、finally资源释放、优先预判规避。自定义异常推荐继承RuntimeException,异常信息需包含业务上下文。正确处理异常可提升程序健壮性,关键要区分可恢复错误与程序缺陷。
2025-12-08 16:10:27
846
原创 java学习--注解之@SuppressWarnings
摘要: @SuppressWarnings是Java用于抑制编译警告的注解,通过指定警告类型(如unchecked、deprecation)精准关闭非关键警告,避免干扰。其核心特性包括:支持类/方法/变量等多层级作用范围(遵循就近原则),仅编译期生效,不影响运行时。常见警告类型涉及泛型转换、过时API、未使用变量等。使用时需遵循最小范围原则(优先标注方法/局部变量而非类),优先修复警告而非抑制,严禁滥用"all"。典型场景包括抑制泛型强制转换警告、过时方法调用等,建议配合注释说明原因。该
2025-12-05 09:47:21
567
原创 java学习--注解之@Deprecated
摘要: @Deprecated 是Java的标记型注解,用于标识已过时的类、方法等元素,提醒开发者存在缺陷或替代方案。其核心特性包括: 编译期警告:非强制,兼容旧代码; 文档说明:需搭配@deprecated注释说明废弃原因及替代方案; 多元素支持:可标注类、方法、字段等; JDK9+增强:新增since(废弃版本)和forRemoval(计划删除)属性。 使用原则:标记废弃→提供替代→逐步删除,避免滥用。反射可运行时检测废弃状态,适用于API迭代管理。
2025-12-04 20:31:22
1076
原创 java学习--注解之@Override
摘要:@Override是Java的标记型注解,用于显式声明方法重写,提升代码安全性和可读性。核心作用包括:1)编译期校验重写规则,避免伪重写错误;2)增强代码可读性。使用场景包括重写父类方法、实现接口方法和重写抽象类方法。常见误区包括误认为它是必要条件、用于static/final方法或签名不一致的情况。该注解仅作用于编译阶段,不会影响运行时性能,是Java编码推荐的最佳实践。
2025-12-04 20:20:18
860
原创 java学习--枚举(Enum)
Java枚举是一种类型安全的常量集合,相比传统常量具有更高可读性和安全性。枚举默认继承Enum类,支持属性、方法、构造器(必须private),可像普通类一样定义业务逻辑。常用方法包括values()遍历、valueOf()转换等,还支持switch语句。高级用法包括实现接口、单例模式以及专用集合类EnumSet/EnumMap。枚举适用于状态、类型等有限集合场景,是Java定义常量的首选方式,兼具安全性和扩展性优势。
2025-12-04 09:59:03
674
原创 java学习--内部类之静态内部类
静态内部类是用static修饰的内部类,不依赖外部类实例,可直接通过"外部类名.内部类名"创建对象。核心特点:仅能直接访问外部类静态成员,非静态成员需创建外部类实例;可定义静态/非静态成员;无外部类实例引用,内存占用更优。使用场景包括封装独立功能组件、实现构建器模式等。相比成员内部类,静态内部类耦合度更低,适合与外部类弱关联的场景。典型应用如HashMap的Entry类和构建器模式中的Builder类。
2025-12-02 09:53:26
572
原创 java学习--内部类之成员内部类
成员内部类是定义在外部类成员位置的内部类,属于外部类的非静态成员。核心特点包括:必须通过外部类实例创建,可直接访问外部类所有成员(包括私有成员);可通过"外部类名.this"访问外部类实例;支持public/private等访问修饰符控制访问权限。创建语法分三种情况:外部类内部直接new、外部类外部通过"外部实例.new"创建、静态方法中需先创建外部类实例。典型应用场景是与外部类强关联的辅助组件,如汽车与发动机的关系。与静态内部类相比,成员内部类能直接访问外部类非静态
2025-12-02 09:16:45
776
原创 java学习--内部类之匿名内部类
摘要:Java匿名内部类是一种无需显式命名的内部类,用于快速创建一次性使用的类实例。它可继承父类或实现接口,语法简洁但不可复用。特点包括:无类名、无构造方法、访问外部类成员、局部变量需为final。适用于事件监听、线程创建等场景。Java8后可用Lambda表达式替代,使代码更简洁。优点是代码精简,缺点是可读性差且不可复用。
2025-12-01 10:18:04
427
原创 java学习--内部类之局部内部类
Java局部内部类是定义在方法或代码块中的内部类,作用域仅限于所在代码块。它可直接访问外部类成员和final/有效final局部变量,但不能使用static修饰符或定义静态成员。局部内部类适用于封装方法内的辅助逻辑,相比匿名内部类更灵活,可多次实例化。其字节码文件名格式为"外部类名$数字内部类名.class",并隐式持有外部类引用。这种设计能有效隐藏类定义,提高代码封装性和可读性,特别适合处理局部复杂逻辑的场景。
2025-11-28 10:26:54
462
原创 clickhouse获取json中的数据
摘要:ClickHouse处理JSON数据主要通过JSONExtract系列函数实现:1)提取单层字段使用JSONExtract<Type>(json_str,'key');2)处理嵌套对象用点号分隔路径;3)针对JSON数组先用JSONExtractArrayRaw转换为数组,再配合arrayMap/arrayJoin处理。对于复杂场景可组合使用JSONHas、JSONKeys等辅助函数,根据JSON结构特点选择合适函数组合即可灵活提取任意数据。
2025-11-27 14:15:45
492
原创 java学习--Interface
Java接口是定义行为规范的重要机制,通过interface关键字声明,包含常量、抽象方法(Java8前)、默认方法和静态方法(Java8后)。类通过implements实现接口,必须重写抽象方法,且支持多接口实现。接口的核心作用包括定义契约、实现多态、扩展功能和标记用途。与抽象类相比,接口侧重行为规范,支持多继承,成员默认公有。作为Java多态设计和解耦的核心工具,接口广泛应用于框架设计和API定义。
2025-11-27 09:54:18
362
原创 java学习--abstract与final/static/private无法共存的根本原因
Java中abstract与final/static/private不能共存的原因在于它们语义上的根本冲突:abstract要求必须被继承和重写(类/方法),而final禁止继承/重写;abstract依赖实例多态,static属于类级别且不参与多态;abstract需要子类访问重写,private却限制访问。这些组合会破坏Java的抽象机制和继承体系逻辑,因此被语法明确禁止。
2025-11-26 09:43:03
1264
原创 java学习--abstract
Java中的abstract关键字用于定义抽象类和抽象方法。抽象类不能被实例化,只能作为父类被继承,可以包含抽象方法(无实现)和普通方法(有实现)。子类必须实现所有抽象方法,否则也需声明为抽象类。抽象方法只有方法签名,强制子类实现具体逻辑。核心规则包括:抽象类不能实例化、抽象方法必须在抽象类中、子类必须实现所有抽象方法等。与接口相比,抽象类支持单继承,体现"is-a"关系,而接口支持多实现,体现"has-a"能力。abstract通过强制行为约束和代码复用实现灵活的行
2025-11-26 09:33:53
523
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅