自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring

Spring Framework是一个用于解决企业级应用开发的开源框架。最早由Rod Johnson创建,并在《Expert One-on-One:J2EE Design and Development》中进行了介绍。使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情,并且在简单性、可测试性和松耦合等方面均能获得收益。Spring可以做的事情非常多,但最根本的使命是简化Java开发。

2026-10-25 16:19:46 220

原创 Maven

Maven是Apache旗下的一款开源的项目管理工具,使用了项目对象模型(POM-Project Object Model)的概念。在Maven中,用户仅通过一小段描述信息就可以实现项目的构建、报告、文档管理、导包、项目拆分等效果。在Maven中,每个项目都相当于一个对象,对象之间的关系囊括了依赖、继承还有聚合。核心配置文件为pom.xml,用户可以通过编写这个文件,来实现上述的各种操作。同时,Maven还提供了各类丰富的插件,包括但不限于项目打包、测试、资源拷贝及Tomcat等。

2026-09-16 23:22:51 264

原创 SpringDataJPA

SpringDataJPA是SpringData项目下的一个模块。提供了基于JPA标准操作数据库的简化方案,底层默认依赖的是HibernateJPA。其特点为:只需要定义接口并集成SpringDataJPA中提供的接口即可,无需编写接口的实现类。

2026-09-10 23:06:07 152

原创 Git相关

可以去Git官网进行下载点击Install for Windows根据自身电脑的系统选择对应的Tab并根据提示下载即可。

2026-08-26 22:31:50 212

原创 MySQL

关键字解释示例SQL备注CREATE创建新的数据库对象建表时建议明确指定存储引擎和字符集。TABLE指定操作的对象为表见上方CREATE示例常与CREATEALTERDROP连用。DATABASE指定操作的对象为数据库用于创建、切换或删除数据库。定义主键约束主键列的值不能为 NULL 且必须唯一。定义外键约束确保数据的引用完整性。REFERENCES指定外键关联的目标表和列见上方示例必须与配合使用。INDEX创建索引以优化查询性能为经常用于查询条件的列添加索引可显著提升速度。UNIQUE。

2026-07-21 08:58:23 176

原创 JAVA基础面试题

忽略无关细节,只关注核心特征。比如设计“学生管理系统”时,只关注学生的学号、姓名,而不需要关注他的身高、体重。抽象帮助开发者从更高层次进行系统建模。

2026-05-12 17:07:15 359

原创 中介者模式

使用场景1. 当系统中存在大量类与类之间相互引用的情况且结构混乱时.1. 使系统更易于维护和拓展(将对象间的关系从网状结构转换为星形结构, 简化了对象间的交互);2. 使各个同事类之间互相解耦(某一同事类修改后, 其他同事类无需修改, 只需修改对应的中介类即可, 更加符合开闭原则).1. 中介者类中包含了大量同事类间的交互细节, 可能使其维护变得困难.

2026-04-02 13:24:39 71

原创 解释器模式

使用场景1. 当表达式的语法并不复杂且不关心执行效率时;2. 当某场景频繁出现且可以用表达式归纳时.1. 可以快速实现一套自定义的迷你语言;2. 易于拓展(新增语法规则时直接增加新的表达式类即可, 无需修改原有代码, 符合开闭原则).1. 难以维护复杂语法(由于每条规则都需要定义表达式类, 复杂语法会使类的数量急剧增加使系统难以维护);2. 执行效率低(语法的解释过程用到了大量的循环或递归, 直接影响程序运行效率).

2026-04-01 17:53:45 105

原创 命令模式

使用场景1. 当存在调用方和执行方必须解耦的场景时.1. 降低系统耦合度(实现了调用方和执行方的解耦);2. 满足开闭原则(新增或删除命令不会对其他类产生影响);3. 可以实现宏命令(与组合模式相结合后, 可以将多个命令装配成一个组合命令).1. 需要执行的命令过多时, 会导致系统中存在数量庞大的具体命令类, 同时也会显得系统结构较为复杂.

2026-03-27 03:49:47 93

原创 备忘录模式

使用场景1. 当需要保存某一对象的瞬时状态时.1. 提供了一种状态恢复机制, 使用户可以在需要的时候方便的恢复到某个特定的历史状态;2. 实现了对快照对象的信息封装, 使其在创建后不会被其他代码所修改.1. 当备忘录对象本身过大或使用集合方式频繁保存备忘录对象会对系统空间造成较大负担.

2026-03-26 15:18:07 86

原创 访问者模式

使用场景1. 当对象的数据结构相对稳定而操作经常变化时;2. 当需要将数据结构和不常用的操作分离时;3. 当需要在运行时动态决定使用哪些对象和方法时.1. 较好的拓展性(添加新功能无需修改元素对象结构);2. 较好的复用性(通过访问者定义元素对象的通用功能);3. 分离无关行为(每个访问者访问的都是相关行为, 功能单一明确).1. 违反开闭原则(增加一个具体元素就需要在每个具体访问者中增加相应的操作);2. 违反依赖倒置原则(访问者依赖的是具体类而非抽象类).

2026-03-25 01:58:05 56

原创 迭代器模式

使用场景1. 当需要减少程序中遍历集合的重复代码时;2. 当需要为集合对象提供一个统一的遍历接口时.1.更换对象的遍历方式相对简单, 只需定义一个迭代器的子类重写算法即可;2.简化了集合类的结构, 由于迭代器的存在, 集合类无需再自行提供遍历方法;3.由于抽象层的存在, 无论是增加新的集合类还是迭代器都非常方便, 无需修改原有代码, 符合开闭原则.1. 将数据存储和和遍历的职责分离必然导致类的个数增加, 一定程度上增加了系统复杂度;2. 迭代器抽象层设计难度较大, 需要充分考虑系统将来的拓展因素.

2026-03-24 23:57:02 62

原创 状态模式

使用场景1. 当对象需要根据不同状态来进行不同的行为时;2. 当对象状态改变需要用到大量if else语句时;3. 当业务需要动态的更换处理对象时.1.将某个状态的所有行为集中放置在一个类中可以更加灵活的对状态进行管理(只需改变对象的状态即可改变其行为);2.将状态对象与状态转换逻辑合为一体的方式可以使逻辑层级更为清晰, 避免出现巨大的条件语句块.1. 状态的增加必然造成类个数的增加, 增加了系统复杂度;2. 状态模式的结构与实现都较为复杂, 使用不当容易造成代码结构与逻辑混乱;

2026-03-23 16:39:47 101

原创 责任链模式

使用场景1. 当系统运行时需要多个关联对象来处理同一请求时;2. 当不希望请求者知道业务的具体处理流程和逻辑时;3. 当业务需要动态的更换处理对象时.1.降低了请求者与处理者之间的耦合度;2. 增加了系统的可拓展性(可以随时根据需要增加新的处理者, 符合开闭原则);3. 增加了系统的灵活性(当业务发生改变时可以动态的增加/删除或变更链上的处理者);4. 简化了对象简的引用(每个处理者只需要维护下一个处理者的引用);

2026-03-22 01:04:59 51

原创 策略模式

使用场景1. 当系统中存在多重if else逻辑时, 可以使用策略模式替换;2. 当某一功能可以有多种不同实现时, 可以使用策略模式封装每一种实现方式;3. 当我们希望隐藏某些业务的实现逻辑时, 可以使用策略模式对该算法进行封装.1.多个策略之间可以自由切换且易于拓展;2. 可以替代代码中的多重if else, 提现面向对象的思想.1. 客户端必须知道所有的策略类并自行决定使用哪个类;2. 如果算法过多则会产生非常多的策略类, 占用系统内存.

2026-03-21 00:00:19 96

原创 模板方法模式

使用场景1. 多个类有相同的逻辑和方法可以执行时;2. 业务逻辑/算法高度类似, 仅有部分差异需要定制时.1.父类定义执行步骤子类负责实现执行细节的模式可以让开发者避免编写冗余代码而更加专注于不同业务的逻辑;2. 可以通过子类重写父类方法的模式灵活的调整执行步骤, 达到无需修改父类代码即可实现反向控制的目的.3. 新增/更换子类实现方便, 符合单一职责和开闭原则.1. 针对不同实现需要编写不同子类, 导致子类个数增加, 系统更加庞大;

2026-03-20 23:39:20 70

原创 观察者模式

使用场景1. 当一个对象发生改变需要触发其他对象的改变时(如商品下单需要通知支付系统/库存系统/购物车系统等);2. 当一个对象发生改变时需要通知未知的接收者时(公众号订阅/微博关注等);3. 当需要构建一个链式的触发机制时(A影响B, B影响C, C影响D...);1. 实现了观察者与被观察者之间的解耦;2. 实现了一定范围内的广播能力(被观察者发送通知后所有观察者都能收到).1. 如果被观察者存在循环依赖, 循环通知会导致系统的崩溃.

2026-03-19 18:58:00 42

原创 享元模式

使用场景1. 当系统因为存在大量相同或相似对象而造成内存浪费时;2. 需要前瞻性的缓存一些经常使用的相同或相似对象时(如: java.lang.Integer.IntegerCache).1. 极大地减少了内存中相同或相似对象的数量, 节约系统资源, 提升系统性能;2. 享元对象的外部状态相对独立, 不会影响内部状态.1. 为了使对象可以共享, 享元对象需要将部分状态外部化, 区分内外部状态, 提高了复杂度.

2026-03-18 09:37:51 67

原创 组合模式

使用场景1. 能够以树形结构表示的场景(文件系统/XML/公司架构等).1. 可以清楚定义有层次区分的复杂对象, 方便对整个层次结构进行控制管理;2. 通过对管理方法的抽象使客户端无需关心操作对象是枝还是叶(透明组合).1. 要求业务场景必须能以树形结构表示, 使用场景有非常大的局限性.

2026-03-17 11:47:41 265

原创 外观模式

使用场景1. 需要简化复杂系统时(当某些业务需要对当前系统内多个子系统进行调用时, 就可以根据不同业务场景为调用方提供对应的门面);2. 需要隐藏内部实现细节时(如把大象装进冰箱总共需要3步, 当不希望调用方知道具体如何实现时, 就可以只对外提供一个装进冰箱的门面而非3步对应的3个接口).1. 由于客户端无需直接调用子系统, 所以会使客户端的代码更加简洁;2. 引入外观类的方式轻松实现了客户端与众多子系统之间的解耦.

2026-03-16 11:20:41 80

原创 适配器模式

使用场景1. 需要设计统一多个类的接口时(某功能依赖多个外部类时, 可以通过适配器将他们适配为统一的接口定义);2. 需要替换外部依赖时(可以减少代码的改动);3. 原有接口无法更改且必须兼容时(参照jdk中Iterator兼容Enumeration).1. 可以在重用现有适配者类的情况下使目标类和适配者类之间解耦, 更无需修改原有结构;2. 提高了透明性(对客户端而言, 兼容逻辑是透明的);3. 提高了复用性(适配者可以在多个系统中复用);3. 良好的灵活性(可以通过配置文件更换适配器);

2026-03-10 20:09:05 289

原创 装饰器模式

使用场景1. 需要快速拓展一个类的功能场景时;2. 需要对最终类进行功能拓展时;3. 需要对系统中的大量子类进行优化时.优缺点1. 当需要对某个类进行拓展时, 装饰者模式相较于继承方式更加灵活;2. 可以动态的选择如何拓展被装饰对象的行为(通过配置文件决定初始化的装饰者类);3. 可以通过对一个对象进行多次装饰来得到功能更加强大的对象;4. 无论构件与装饰者任何一方增加新的类都不会对原有类库产生影响, 符合开闭原则.1. 装饰者模式会导致系统中产生多个对象, 在一定程度上影响系统性能;

2026-03-09 12:26:06 65

原创 桥接模式

使用场景1. 统一协议下增加不同组件时, 如JDBC驱动(连接步骤相同, 不同数据库实现不同), 消息驱动(消息发送流程相同, 通信实现不同);2. 拆分复杂对象时(过于复杂的对象不方便维护和理解, 可以根据不同维度进行拆分);3. 对代码进行多维度拓展时,如功能/技术/业务维度等.优缺点1. 通过分离对象中实体和功能维度的方式解耦了其固有的绑定关系, 使得实体和抽象可以沿着各自的维度灵活的进行拓展;2. 提供了比多层继承更优的解决方案(多层继承复用性差, 子类数量庞大, 违背了单一职责原则);

2026-03-07 00:55:43 234

原创 代理模式

使用场景当需要对一个对象的访问提供一些额外操作时, 即可使用代理模式.

2026-03-03 18:17:47 304

原创 原型模式

1. 当需要对某一对象进行复制操作时, 可以简化对象的创建/赋值过程, 提高效率.1. 保存历史快照: 当某一对象的值或状态在业务流程中会不断发生变化, 且无法追溯其前一状态时. 可以通过原型模式复刻并保存该对象每个阶段的快照, 方便后续的回溯或撤销.

2026-03-02 16:01:56 193

原创 Java面试题

Java 类加载机制包含加载、验证、准备、解析、初始化五个阶段,遵循双亲委派模型(优先由父加载器加载,确保核心类安全)。ClassNotFoundException 出现在加载阶段。当代码显式调用 等方法时,若类加载器在路径下找不到对应的 文件,则抛出此异常。本质是“主动查找失败”。NoClassDefFoundError 出现在链接或使用阶段(通常是初始化时)。指编译时类存在,但运行时 JVM 尝试使用该类时,发现其定义丢失(常因依赖类加载失败、静态代码块报错或 Jar 包缺失导致)。本质是“被动使用

2026-03-01 12:09:09 1412

原创 建造者模式

建造者模式与工厂模式的功能类似, 但是存在一些区别。工厂模式主要用于创建类型相关的对象(同一继承/实现体系), 通过给定不同参数来决定实际创建的具体对象。建造者模式则是通过设置不同的参数来定制化的创建某一种类型的复杂对象。1. 可以有效的封装变化, 将主要的内部逻辑封装在指挥者类中从而取得较好的稳定性;2. 将建造对象本身和创建过程解耦, 使得相同创建过程也可以创建出不同的对象;3. 可以更精细的控制对象的创建过程;

2026-02-28 20:26:53 243

原创 抽象工厂模式

抽象工厂模式比工厂方法模式的抽象程度更高,在工厂方法模式中每个具体工厂仅需生产一种具体的产品。而抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品(产品族)。产品族中的每个产品都属于某个产品下的继承结构。产品等级结构:即产品的继承结构。如:有一个抽象产品为手机,其子类包含小米手机、华为手机、苹果手机等等。抽象手机为父类,小米手机、华为手机等为子类,从而构成了一个产品等级结构。产品族:即同一个工厂生产的不同产品等级结构的一组产品,如:小米工厂生产的不止有手机,还有电脑、手表等等。

2026-02-26 22:52:56 310

原创 工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象,使一个产品类的实例化延迟到其工厂的子类。

2026-02-25 23:41:00 274

原创 术语缩写

全称:Garbage Collection含义:垃圾收集、垃圾回收。

2026-02-23 21:01:07 310

原创 单例模式

单例模式(Singleton Pattern)是java最简单的设计模式之一,用于保证某个类在运行期间只有一个实例对外提供服务,我们称这种类型的类为单例类。

2025-09-01 13:35:10 218

原创 系统设计原则

一个类或者模块只负责完成一个职责或者功能。也就是说在类的设计中,我们不要设计大而全的类,而是要设计粒度小、功能单一的类。可以通过几个点来分析类的职责是否单一:1. 类中的代码行数、属性或方法是否过多;2. 类依赖的其他类是否过多;3. 类中的私有方法是否过多;4. 类中的大量方法是否只是频繁操作其中的某几个属性。单一职责的判断条件在不同业务或背景下会有所不同,举个例子,User类中包含了省市县相关的字段。

2025-08-28 15:36:01 334

原创 代码质量评价标准

可维护性强:在不去破坏原有代码设计且不引入新bug的前提下能够快速的修改或新增代码。可维护性差:在添加或修改一些功能逻辑的时候,存在极大的引入新bug的风险,且需要花费的时间也更长。

2025-08-14 13:35:02 302

原创 JDK8版本新增特性

在过去,当我们需要对集合进行操作时,需要不断地进行循环,其产生的代码看起来十分冗余且不直观。针对这一问题诞生了StreamAPI,其设计思想类似于工厂的流水线,将一个集合不断的进行加工直到最后生产出完整的商品。StreamAPI能让我们快速的完成一些复杂的操作,如:筛选、切片、映射、查找、去重、统计、匹配和规约等。

2025-08-11 14:44:20 743

原创 JDK17版本新增特性

本文只列举该版本中更新的比较常用的语法、API层面的正式特性,对于预览版本或实际开发场景中使用场景有限的特性暂时不做过多说明。对于一些底层相关的特性由于解释起来比较麻烦,后续会在专门的文章中做详细说明。

2025-08-05 15:03:48 327

原创 JDK16版本新增特性

本文只列举该版本中更新的比较常用的语法、API层面的正式特性,对于预览版本或实际开发场景中使用场景有限的特性暂时不做过多说明。对于一些底层相关的特性由于解释起来比较麻烦,后续会在专门的文章中做详细说明。

2025-08-05 13:00:05 260

原创 JDK15版本新增特性

在新特性相关的博文里,主要用于强调语法及API层面的变化。所以对于一些针对非语法及API层面且个人感觉实际开发中用处不大的特性,暂时只列举特性名称。2. 每行文本块的内容前会默认删除n个空格,删除数量 = 结束行3个双引号前的空格数量;由于解释起来比较麻烦,暂时先只列出来,后续在GC相关的博文里详细说明。由于解释起来比较麻烦,暂时先只列出来,后续在GC相关的博文里详细说明。对于非语法及API层面,重要但是偏底层的内容后续在其他博文中做详细说明。由于只是预览版本,暂时先列出来不做过多说明。

2025-07-08 22:28:03 316

原创 JDK14版本新增特性

2. 有两种返回结果的方式,一种是 ->,该方式 -> 后只能直接写出需要返回的内容;在新特性相关的博文里,主要用于强调语法及API层面的变化。3. 使用yield方式时,每个case中的变量名不允许重复,如果需要定义重名的变量,可以在 : 后添加 {} ,将逻辑在写 {} 中;由于解释起来比较麻烦,暂时先只列出来,后续在GC相关的博文里详细说明。对于非语法及API层面,重要但是偏底层的内容后续在其他博文中做详细说明。由于只是预览版本,暂时先列出来不做过多说明。1. switch可以作为表达式返回结果;

2025-07-06 22:41:00 413

原创 JDK13版本新增特性

此实现与nio实现共享相同的内部基础结构,并且与现有的缓存区高速缓存机制集成在一起,因此不需要使用线程堆栈。现在已有的java.net.Socket和java.net.ServerSocket以及他们的实现类已经可以追溯到jdk1.0时代了,由于存在下列问题,且未来的网络世界需要快速响应,不能阻塞本地方法线程,所以当前的实现已经不适合使用了。NioSocketImpl是jdk13中的默认实现,但是旧的实现并没有删除,可以通过设置系统属性jdk.net.usePlainSocketImpl来切换到旧版本。

2025-07-06 12:02:33 362

原创 JDK12版本新增特性

getCompactNumberInstance还有一个无参的重载方法,如果使用该方法,默认地区为当地,格式为NumberFormat.Style.SHORT。transform通过传入的Function对原本字符串进行特定的操作,通常与stream流的map方法一起使用。根据源码可知,其作用就是查找并返回两个文件内容中第一个不匹配字节的位置,如果全部匹配则返回-1L。根据源码可知,其作用就是根据n的值调整字符串每行的缩进,并规范行终止字符。如果n>0,则在每行的开头插入n个空格。

2025-07-06 09:07:23 386

空空如也

空空如也

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

TA关注的人

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