自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Elasticsearch常用DSL快速查询指南

本文将快速回顾Elasticsearch的核心操作,包括索引库管理、文档CRUD、查询技巧和结果处理。索引库部分详解了常见属性、创建查询修改方法;文档操作涵盖增删改查;查询部分介绍了全文检索、精确查询、地理位置查询及复合查询;结果处理包括排序、分页和高亮显示;最后简要提及聚合功能。本文适合已学习ES的同学快速查阅参考。

2025-09-02 17:45:19 742

原创 一篇博客带你学会Lambda(Stream + Optional、后端必知必会)

本文介绍java8中的lambda表达式的用法。包含Stream、Optional、匿名内部类等,同时包含例子让你更容易理解。但本文适合java基础扎实的人,说明性内容较少,主要是帮助大家快速上手。

2024-11-24 09:00:00 772

原创 一篇博客带你学会JUC并发编程(后端必会、五万字笔记)

包含并发编程各种知识,大量代码和样例,同时也有我个人自己的理解。

2024-06-06 00:06:05 1274

原创 一篇博客带你学会Rabbitmq(后端必知必会)

本文介绍Rabbitmq,包含简单案例,多种交换机的使用,以及消息序列化等,一篇博客让你学会Rabbitmq,有多种案例,代码和运行结果。

2024-06-04 15:13:50 1052

原创 一篇博客带你了解JVM(后端必会、七千字精简笔记)

本篇为个人jvm笔记,较为精简,适合已经学习过的人复习,包含场景垃圾回收算法,场景垃圾回收器等知识。

2024-05-08 17:12:03 1375

原创 一篇博客带你学会JavaScript(前后端必会、二万字笔记)

主要包含script 标签、基本语法、DOM 操作、事件传播、定时器等。包含代码和动图,让你直观的了解javascript,一篇就够,一看就懂。

2024-04-11 08:57:33 1087

原创 一篇博客带你学会CSS(前后端必会、三万字笔记)

用一篇博客带你学会CSS,里面包含大量的样例和展示效果,各种动图让你更好的理解。三万字的笔记,让你全方位细致学会。

2024-04-10 15:33:11 1534

原创 一篇博客带你学会HTML(前后端必会、万字笔记)

html的核心就是标签,所以里面包含了大量的样例代码和演示效果,包教包会。

2024-04-09 08:00:00 1386

原创 Redis的前世今生(内存管理、持久化、高可用、集群 详解)一看就懂

redis的诞生和mysql脱不了关系,在redis还未出现时,用户的每次请求都是直接访问mysql,渐渐的人们发现,请求大部分都是读操作,而且很多都是重复的数据,磁盘的i/o是很慢的,所以人们就想,能不能学学cpu建立的缓存机制,mysql也搞一个缓存,就这样一个。在判断一个元素是否存在时,就会用多个相同哈希函数映射,然后判断映射的位置上是否都为1,若都为1说明可能存在,因为可能有其他的一些元素映射会将这些位置正好都置为了1,所以可能会发生很小概率的误判,当然如果不都为1,那么一定是不存在的。

2024-04-06 17:17:33 1228 2

原创 Java:七万字java基础笔记(内含代码和样例)

本文为自己学习java时记录的万字笔记。

2024-03-10 23:48:43 1662

原创 一篇博客带你学会MyBatis-Plus(后端必会)

本文章介绍MyBatis-Plus笔记梳理,基本的使用和拓展。

2024-03-02 17:05:34 1335

原创 一篇博客带你学会MyBatis(后端必会)

本文介绍mybatis如何配置,以及如何使用,sql语句的抒写方法,最后还要缓存的介绍和使用。

2024-02-02 19:22:11 1559

原创 SQL:增、删、改、查 基本语句 Navicat建库(后端必知必会 用法 + 例子)

本文详细介绍数据库sql的增、删、改、查语句,并含义用法与例子,让你更容易使用和理解。

2023-09-28 14:37:53 3969

原创 《Effective Java》解读第28条:列表优于数组

在Java中,应当优先使用泛型集合(如List)而不是数组,以提高类型安全性、灵活性和代码的可维护性。

2025-12-19 11:02:15 251

原创 《Effective Java》解读第27条:消除非受检的警告

本文强调应尽可能消除所有编译器非受检警告,确保代码类型安全。建议优先通过修改代码(如使用菱形操作符)消除警告,若无法消除但确定代码安全,可使@SuppressWarnings("unchecked")注解,并添加注释说明原因。注解应限制在最小作用范围,避免掩盖重要警告。文中提供了常见警告类型及示例代码,展示了如何在保证安全性的前提下合理抑制警告。

2025-12-17 16:39:29 185

原创 《Effective Java》解读第26条:请不要使用原生态类型

避免使用原生态类型(raw type),优先使用泛型(generic type)。

2025-12-17 15:25:38 387

原创 《Effective Java》解读第25条:限制源文件为单个顶级类

摘要: Java源文件应遵循"一个文件一个顶级类"原则,文件名与公共类名保持一致。该规则提升代码清晰度、可维护性和构建可靠性: 便于快速定位和理解代码结构 避免重构时产生副作用 防止编译顺序导致的不可预测行为 消除命名空间混乱风险 例外情况仅限紧密关联的辅助类或测试代码,但更推荐使用静态嵌套类。主流IDE默认支持此规范,违反规则带来的微小便利远不及潜在风险,应作为强制纪律遵守。

2025-12-03 16:49:48 876

原创 《Effective Java》解读第23条:类层次优于标签类

本文阐述了标签类的弊端及重构为类层次的方法。标签类通过枚举字段区分类型,导致代码臃肿、内存浪费且违反设计原则。重构步骤包括:抽取抽象根类、创建具体子类、迁移字段方法、用多态替代条件判断。类层次结构具有类型安全、易扩展等优势,符合单一职责和开闭原则。通过几何形状示例展示了标签类与层次类的差异,强调类层次是更优的面向对象设计选择。

2025-12-03 16:04:13 370

原创 《Effective Java》解读第24条:静态成员类优于非静态成员类

本文介绍了Java中四种嵌套类的特性及适用场景。静态成员类是最常用的形式,无需绑定外围实例,适合Builder模式等场景;非静态成员类(内部类)隐式持有外围实例引用,适合迭代器等需要访问外围实例成员的场景;匿名类用于一次性实现接口或抽象类,Java 8后可用Lambda替代;局部类则定义在方法内部,使用最少。建议优先使用静态成员类,除非需要访问外围实例才使用非静态成员类,以减少不必要的内存消耗。合理选择嵌套类类型有助于优化代码结构和性能。

2025-12-02 14:04:20 838

原创 《Effective Java》解读第22条:接口只用于定义类型

接口应仅用于定义类型行为,而非承载常量。常量接口存在破坏封装性、污染命名空间等问题。推荐使用工具类(私有构造器+静态常量)、枚举或嵌套类组织常量。工具类示例: public final class PhysicalConstants { private PhysicalConstants() {} public static final double AVOGADROS_NUMBER = 6.022e23; } 嵌套类可增强分类(如ErrorCodes.Http.OK)。避免接口常量。

2025-12-01 15:14:36 591

原创 《Effective Java》解读第21条:为后代设计接口

摘要: 接口设计需具备前瞻性,因其发布后难以修改。Java 8的默认方法虽缓解了接口演进的兼容性问题,但需谨慎使用:应作为后期修正工具而非初始设计手段,避免多重继承冲突。核心建议包括:优先通过抽象骨架类(如AbstractList)提供基础实现,减少实现负担;默认方法需确保安全、高效且逻辑合理;设计时假设接口不可更改,严格规划方法。最终目标是构建稳定且可扩展的接口,平衡灵活性与兼容性。

2025-12-01 11:37:36 989

原创 《Effective Java》解读第20条:接口优于抽象类

摘要: 本文探讨了接口优于抽象类的设计原则。接口提供了更灵活的多态实现方式,允许构建非层级结构类型框架和混合类型。通过示例展示了如何用抽象类定义共性特征,用接口定义行为。文章分析了接口的四大优势:易扩展性、非层级结构、混合类型支持和包装类模式。同时指出接口的局限性,如无法提供Object方法默认实现。解决方案是结合接口和骨架实现类(Abstract[InterfaceName]),既保留接口灵活性又共享实现代码。这种"接口+骨架类"模式是构建健壮、可扩展组件的有效方式。

2025-11-28 18:02:16 731

原创 《Effective Java》解读第19条:要么设计继承并提供文档说明,要么禁止继承

摘要: 继承是强大但危险的机制,除非类专门为继承设计,否则应禁止继承。为继承设计的类需详细文档说明可重写方法的影响,提供protected方法供安全重写,并避免在构造器、clone和readObject中调用可重写方法。禁止继承的两种方式:声明类为final,或将构造器设为private/package-private并通过静态工厂提供实例。由于为继承设计需要大量工作且限制多,大多数普通类应禁止继承以保证安全。(149字)

2025-11-28 16:35:11 194

原创 《Effective Java》解读第18条:复合优先于继承

本文探讨了面向对象设计中复合优先于继承的原则。继承在跨包使用时存在风险,会破坏封装性(子类依赖父类实现细节)、可能破坏子类(父类更新导致冲突)、且并非所有情况都符合"is-a"关系。复合通过在新类中持有现有类的实例并转发方法调用,提供了更安全的复用方式。虽然复合存在"丢失身份"引用和轻微性能开销等缺点,但在大多数情况下仍是更好的选择。只有当子类真正是父类的子类型且愿意继承父类所有API缺陷时,才应考虑使用继承。

2025-11-28 14:45:00 563

原创 《Effective Java》解读第17条:使可变性最小化

摘要:文章探讨了不可变类的概念与实现方法。不可变类指实例化后状态不可修改的类,如String和基本包装类。实现要点包括:不提供修改方法、定义final类、声明final私有字段、防御性拷贝可变组件。优点包括线程安全、对象共享、构建其他对象等,缺点是每个不同值需单独对象。解决方案是提供可变配套类(如StringBuilder)。建议优先选择不可变类,必要时限制可变性,字段尽量设为private final。实际项目中虽少用final定义不可变类,但final常量很常见。

2025-11-27 15:19:48 241

原创 《Effectice Java》解读第16条:要在公有类而非公有域中使用访问方法

摘要: 面向对象编程强调封装性,直接暴露公有类的数据字段会破坏这一原则。公有字段导致失去对数据访问的控制,无法维护内部状态约束(不变式),且难以在修改时触发辅助操作或适应未来需求变化。应使用getter和setter方法封装字段,以保持灵活性并增强可控性。例外情况包括包级私有类、私有嵌套类以及公有不可变常量(如public static final),但即使对不可变字段,仍建议通过方法访问以保留演化空间。核心准则:始终通过访问方法封装公有类的可变状态。

2025-11-26 15:40:54 441

原创 《Effective Java》解读第15条:使类和成员的可访问性最小化

本文阐述了软件设计中"使类和成员可访问性最小化"的核心原则。建议从最严格的private访问级别开始,仅在必要时逐步放宽至package-private、protected或public。重点包括:1)顶层类应优先设为包级私有;2)实例字段决不应设为public;3)公有静态final常量需确保不可变性;4)Java9模块系统提供额外保护。这种最小化访问控制的做法能有效实现信息隐藏,带来解耦、可维护性提升、性能优化和并行开发等优势。通过严格封装内部实现细节,仅暴露必要API,可以构建更健

2025-11-20 16:09:43 356

原创 《Effective Java》解读第14条:考虑实现Comparable接口

摘要: 实现Comparable接口可为类定义自然排序,支持泛型算法和有序集合。compareTo方法需满足自反性、对称性、传递性和一致性(建议与equals结果一致)。最佳实践:优先使用包装类的compare方法或Java 8+的Comparator构建方法(如comparingInt、thenComparingInt),避免直接相减导致的整数溢出,并按字段重要性分级比较。注意处理null值,并推荐将比较器声明为static final以避免重复创建。违反compareTo与equals一致性时需明确说明

2025-11-18 11:46:59 894

原创 《Effective Java》解读第13条:谨慎地覆盖clone

摘要:Java的clone方法存在诸多设计缺陷,不推荐直接使用。主要问题包括:语义不明确(深/浅拷贝)、绕过构造器、Cloneable接口异常机制不合理、与final域冲突等。若必须实现clone,应遵循规范:实现Cloneable接口,调用super.clone()进行浅拷贝,并递归处理可变对象字段。更推荐的替代方案是使用拷贝构造器或静态工厂方法,它们更灵活安全,能避免clone的固有缺陷,尤其适合处理含引用类型字段的对象复制需求。

2025-11-14 18:06:34 422

原创 《Effective Java》解读第12条:始终要覆盖toString

覆盖toString方法能显著提升类的可用性,建议所有子类都实现这个方法。默认的Object.toString()仅返回类名和散列码,几乎无实用价值。好的toString应包含关键字段信息,格式清晰且文档化,便于调试和日志记录。实现方式包括手动拼接字符串、String.format()或使用IDE/Lombok等工具生成。注意事项:避免泄露敏感信息,性能敏感场景需优化,静态工具类等特殊情况可不覆盖。

2025-11-13 17:55:03 377

原创 《Effective Java》解读第11条:覆盖equals时总要覆盖hashCode

摘要:本文强调了覆盖equals方法时必须同时覆盖hashCode方法的重要性。根据Object规范,两个逻辑相等的对象必须产生相同的哈希码,否则在使用HashMap、HashSet等集合时会出现问题。文章通过示例说明了不覆盖hashCode导致的错误行为,并详细介绍了如何正确实现hashCode方法,包括使用31作为合并因子、处理不同字段类型等。最后指出可以使用Objects.hash()简化实现,以及需要注意缓存哈希值、不省略关键字段等细节,确保哈希方法的正确性和性能。

2025-11-12 10:04:31 607

原创 《Effective Java》解读第10条:覆盖equals时请遵守通用约定

本文介绍了覆盖equals方法时应遵循的通用约定。在大多数情况下无需重写equals,但当类需要"逻辑相等"概念(如值类)时则需要覆盖。覆盖时必须满足五个特性:自反性、对称性、传递性、一致性和非空性。实现高质量equals方法的技巧包括:使用==检查自引用、instanceof验证类型、逐字段比较等,同时要注意处理null值和特殊类型。最后强调覆盖equals时必须同时覆盖hashCode,避免过度设计,并建议使用IDE工具生成后测试。

2025-11-11 15:07:53 881

原创 《Effective Java》解读第9条:try-with-resources 优先于 try-finally

摘要:Java应优先使用try-with-resources替代try-finally进行资源管理。优势包括:1)代码更简洁,自动关闭资源无需finally块;2)异常处理更完善,不会覆盖原始异常;3)支持多资源自动按逆序关闭;4)所有实现AutoCloseable接口的资源均可使用。相比try-finally,try-with-resources能减少代码量、避免资源泄漏、保留完整异常链,仅在处理非AutoCloseable资源时才考虑传统方式(但极少需要)。

2025-11-06 19:45:00 294

原创 《Effective Java》解读第8条:避免使用终结方法和清除方法

摘要:应避免使用终结方法(Finalizer)和清除方法(Cleaner),因其存在不可靠、性能差等缺陷。终结方法可能导致资源未及时释放或异常被忽略;清除方法虽稍好但仍不可预测。正确做法是实现AutoCloseable接口,通过try-with-resources确保资源及时关闭。Java的垃圾回收机制以内存管理为主,不应依赖其处理关键资源释放。

2025-11-06 19:00:00 231

原创 《Effective Java》解读第7条:消除过期的对象引用

摘要: 本文探讨了Java中内存泄漏问题及其解决方案。尽管Java有自动垃圾回收机制,但程序若保留过期对象引用仍会导致内存泄漏。重点分析了三种典型场景:1)类自行管理内存时(如栈实现),需手动置null释放无效引用;2)缓存场景建议使用WeakHashMap或缓存库自动清理;3)监听器需显式注销或使用弱引用。核心建议包括:警惕自管理内存的类、谨慎使用null、优先采用成熟工具库,并通过代码审查和静态分析预防泄漏。开发者应培养引用管理意识,而非过度依赖GC。

2025-11-04 20:30:00 654

原创 《Effective Java》解读第6条:避免创建不必要的对象

本文阐述了避免创建不必要对象的优化原则。核心思想是对功能相同的不可变对象应尽量重用,而非重复创建。示例包括:使用字符串字面量而非new String()、缓存昂贵的Pattern对象、警惕自动装箱导致的对象创建、优先使用静态工厂方法等。同时指出不应过度优化的情况:当对象创建成本低、或需要保护性拷贝保证安全性时,合理创建新对象是可接受的。特别强调,在需要防御性编程时,必须进行对象拷贝以确保不变性,此时不应重用对象。该原则能有效提升性能、减少内存占用和GC压力。

2025-11-04 11:59:36 298

原创 《Effective Java》解读第5条:优先考虑依赖注入来引用资源

摘要:本文探讨了依赖注入(DI)在Java开发中的重要性。通过对比静态工具类和单例模式,指出它们依赖硬编码、缺乏灵活性的缺陷。推荐使用依赖注入模式,通过构造函数或setter方法从外部注入依赖,从而提高代码的灵活性、可测试性和松耦合性。文章详细介绍了Spring Boot中三种依赖注入方式(构造器注入、setter注入和字段注入)及其优缺点,建议在大型项目中使用DI框架(如Spring)管理复杂依赖关系。依赖注入是现代Java开发中实现高质量代码的关键实践。

2025-10-31 16:55:44 568

原创 Effective Java第4条:通过私有构造器强化不可实例化的能力(精简与解析)

本文阐述了如何通过私有构造器确保工具类不可实例化的最佳实践。对于仅包含静态方法和字段的工具类(如StringUtils、MathUtils等),应显式添加私有构造器并抛出AssertionError,这既防止了编译器生成默认构造器,也避免了类的内部误调用构造器。该方法比抽象类更有效,同时会阻止类的子类化(子类无法访问父类私有构造器),是确保工具类纯粹性的推荐做法。

2025-10-27 16:53:11 231

原创 Effective Java解析与精简:用私有构造器或者枚举类型强化Singleton属性(第3条)

本文探讨了实现单例模式的多种方法。主要内容包括:1)通过私有构造器和静态final字段实现单例;2)使用静态工厂方法增强灵活性;3)推荐使用枚举类型实现单例,因其具有线程安全、防止反射攻击和自动处理序列化等优势。此外,文章还介绍了多线程环境下的单例实现方案,包括双重校验锁、静态内部类和即时初始化等方法。其中枚举方式最为推荐,能完美解决反射、序列化和线程安全问题,代码也最为简洁。其他方法各有优缺点,需要根据具体场景选择。

2025-10-27 15:07:07 378

原创 Effective Java解析与精简:遇到多个构造器参数时要考虑使用构建器(第2条)

文章摘要:本文介绍了三种处理多个构造器参数的方案。重叠构造方法通过层层调用来复用代码,但可读性较差;JavaBean模式使用setter方法赋值,清晰但可能导致状态不一致;建造者模式通过链式调用和必选/可选参数分离,既灵活又清晰,尤其适合复杂对象的构建。文中通过银行账户和披萨类的层次结构示例,展示了建造者模式在实际应用中的优势,包括代码可读性、参数灵活性和类型安全性。当构造参数较多时,建造者模式是最推荐的解决方案。

2025-10-22 18:16:31 257

空空如也

空空如也

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

TA关注的人

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