自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何自创util工具包简化代码?以MyBatis为例,讲解简化代码流程

如何自创util工具包简化代码?以MyBatis为例,讲解简化代码流程

2025-12-16 18:15:52 809

原创 PostgreSQL CTE与临时表的概念与区别

PostgreSQL中CTE和临时表对比: CTE(公用表表达式)是SQL语句内部的临时结果集,语法清晰支持递归,适合一次性查询和层级数据处理。临时表则是会话级存储对象,支持索引和多次操作,适合跨语句复用大数据集。关键区别:CTE语句级有效、语法简洁但不能复用;临时表会话级有效、功能全面但需额外管理。选择依据:单次查询或递归用CTE,复杂多步处理用临时表。CTE注重可读性,临时表侧重功能性。

2025-11-05 08:55:05 625

原创 Java基础 泛型概念与入门案例

Java泛型是JDK5引入的重要特性,允许在类、接口和方法中使用类型参数,实现代码复用并增强类型安全。泛型通过类型参数化消除强制转换,提高代码可读性,但存在类型擦除、不能使用基本类型等限制。典型应用包括泛型类、泛型方法和通配符。类型擦除机制在编译时擦除泛型信息,确保向后兼容。泛型有效避免了运行时类型错误,是Java集合框架的重要基础。

2025-10-31 17:55:31 785

原创 PostgreSQL PostGIS中的元数据表

PostGIS的元数据表是管理空间数据的核心组件,主要包括:spatial_ref_sys存储坐标系定义;geometry_columns和geography_columns分别记录几何和地理空间表的元信息;raster_columns管理栅格数据;raster_overviews存储栅格概览信息。这些表自动维护空间数据的结构、坐标系和索引信息,帮助用户快速定位空间表、验证数据合法性并优化查询性能,是PostGIS实现高效空间数据管理的基础。

2025-10-27 10:16:13 838

原创 PostgreSQL ST_Intersects、ST_Crosses 和 ST_Overlaps的含义与区别

PostGIS中的ST_Intersects、ST_Crosses和ST_Overlaps函数用于判断空间对象关系。ST_Intersects最宽泛,判断是否有任何交集;ST_Crosses要求交集维度低于高维对象且不包含;ST_Overlaps仅适用于同维度对象的部分重叠。示例显示,当点完全包含在多边形内时,只有ST_Intersects返回真。三者的核心区别在于交集条件和维度要求。

2025-10-23 16:28:41 918

原创 PostgreSQL PostGIS安装与配置,现有数据库启用PostGIS扩展

PostGIS安装需通过StackBuilder工具,在PostgreSQL安装目录的bin文件夹中运行。安装时需选择适配版本,建议保持默认配置,可勾选自动创建空间数据库选项。对于现有数据库,需手动启用扩展:通过psql或pgAdmin连接目标库,依次执行CREATE EXTENSION命令安装核心、拓扑、栅格等组件,最后用SELECT postgis_version()验证。安装完成后即可使用空间数据处理功能。

2025-10-20 11:14:46 1022

原创 PostgreSQL 常见数组操作函数语法、功能

本文介绍了PostgreSQL中常用的数组操作函数,主要分为六类:1)数组创建类(如ARRAY[]、STRING_TO_ARRAY);2)数组聚合与拆分类(ARRAY_AGG、UNNEST);3)数组查询统计类(ARRAY_LENGTH、CARDINALITY);4)数组修改类(ARRAY_APPEND、ARRAY_REMOVE);5)数组排序与填充类(ARRAY_SORT、ARRAY_FILL);6)数组运算符(=、@>等)。这些函数支持数组的创建、转换、查询、修改和运算,可处理一维和多维数组,适用

2025-10-17 18:10:11 696

原创 PostgreSql COALESCE语法、用法详解

SQL的COALESCE函数用于返回参数列表中第一个非NULL值,若全为NULL则返回NULL。它常用于替换NULL为默认值(如显示"无昵称")或避免计算错误(如将NULL折扣设为1.0)。相比仅支持两个参数的IFNULL/NVL函数,COALESCE支持多参数且兼容性更好,通过顺序判断简化逻辑处理,是处理NULL值的实用工具。

2025-10-17 09:01:37 347

原创 PostgreSQL 函数ARRAY_AGG详解

ARRAY_AGG函数用于将多行数据聚合为数组,支持在PostgreSQL等数据库中使用。其基本语法包含可选的ORDER BY子句控制数组元素排序。典型应用包括:简单聚合所有值、分组聚合(如按班级聚合学生成绩)、排序聚合(如成绩降序排列)以及对结果数组进行操作(如获取数组长度)。类似功能在MySQL中可通过JSON_ARRAYAGG实现。该函数在数据分析中常用于将分散记录整合为结构化数组形式。

2025-10-15 10:03:03 979

原创 PostgreSQL 模式(Schema)详解

摘要:PostgreSQL模式(Schema)是数据库对象的逻辑容器,用于组织管理表、视图等对象,避免命名冲突并提供权限隔离。核心功能包括:多用户共享数据库时通过不同模式区分同名对象;按业务模块分组管理;通过权限控制实现数据安全。常用操作涵盖创建、查询、修改和删除模式,以及权限管理(USAGE和CREATE权限)。最佳实践建议按业务拆分模式、遵循最小权限原则,并禁用public模式的默认创建权限。模式作为命名空间管理工具,与物理存储的表空间(Tablespace)互为补充,共同构建清晰的数据库架构。(150

2025-10-13 18:02:29 1654

原创 Java 通过源码了解CAS的原理与缺点

CAS(比较并交换)是一种无锁同步机制,通过比较内存值和预期值来原子性更新数据。Java通过Unsafe类实现CAS操作,原子类(如AtomicInteger)基于CAS实现线程安全。CAS存在ABA问题(可通过版本号解决)、高并发下自旋开销大、仅支持单变量原子操作等缺点。其核心是内存地址、预期值和新值三个参数,通过循环重试机制实现无锁并发。

2025-09-18 17:32:00 699

原创 Java ReentrantLock和synchronized的相同点与区别

Java中的synchronized和ReentrantLock都是实现线程同步的机制,但存在关键差异。synchronized是JVM层面的隐式锁,自动获取释放,使用简单但不支持超时、中断和公平锁;ReentrantLock是显式锁,需手动管理,支持超时获取、可中断、公平锁等高级特性,适合复杂场景。两者都支持可重入和线程互斥。选择依据:简单场景用synchronized,复杂需求用ReentrantLock。现代Java版本中性能差异不大,主要根据功能需求决定。

2025-09-11 10:42:57 745

原创 ConcurrentHashMap怎么实现的,1.8前后的变化

Java的ConcurrentHashMap通过不同机制实现线程安全:JDK1.7采用分段锁(Segment),每个Segment独立加锁,提高并发性但内存占用高;JDK1.8改用CAS+synchronized,锁粒度细化到单个哈希桶,结合无锁操作和同步机制,提升并发度和内存效率,并支持多线程协作扩容。整体演进方向是减小锁粒度、降低内存开销,从而优化多线程环境下的性能表现。

2025-09-04 11:22:36 909

原创 Java jdk1.8前后HashMap的变化与区别

JDK1.8对HashMap进行了显著优化,采用数组+链表+红黑树的混合结构,在链表长度超过8且数组容量≥64时转为红黑树,提升查询效率至O(logn)。通过简化哈希计算(高位异或)、尾插法避免死循环、优化扩容迁移逻辑(无需重算哈希)等措施,在保持非线程安全特性的同时大幅提升性能。相比JDK1.7,1.8版本在哈希冲突严重时优势明显,但红黑树节点会带来额外内存开销,体现了空间换时间的设计思想。

2025-09-01 17:36:45 682

原创 JavaEE Spring框架的概述与对比无框架下的优势

Spring框架是一个开源的轻量级企业级应用开发框架,通过IoC容器实现依赖注入管理对象生命周期,支持AOP实现横切关注点分离,提供声明式事务管理和MVC架构简化Web开发。其核心特性包括:依赖注入降低耦合度、面向切面编程分离日志/事务等公共逻辑、声明式事务简化数据库操作、MVC架构统一处理Web请求。相比传统开发方式,Spring通过注解和容器管理大幅减少重复代码,使开发者能专注于业务逻辑而非基础设施,显著提升开发效率和系统可维护性。框架还提供对JDBC、ORM、缓存等技术的无缝集成支持。

2025-07-23 15:08:32 922

原创 消息队列 2.RabbitMQ的基本概念与使用

RabbitMQ是基于AMQP协议的开源消息中间件,支持分布式系统的异步通信、系统解耦和流量削峰。其核心组件包括生产者、消费者、交换机、队列和绑定规则,通过RoutingKey实现消息路由。Java通过RabbitMQ客户端API实现消息发送和接收,Spring AMQP则进一步简化了集成过程。RabbitMQ支持多种交换机类型(Direct、Topic、Fanout)以满足不同场景需求,广泛用于异步通信、系统解耦和流量削峰等场景,是构建可扩展分布式系统的理想选择。

2025-07-18 18:12:04 1505

原创 消息队列 1.消息队列基本概念

消息队列是一种实现异步通信的中间件技术,采用生产者-消费者模型。核心组件包括生产者、消费者、消息队列和消息本身。主要模型有点对点(单消费者)和发布-订阅(多消费者)。优势体现在系统解耦、流量削峰和异步处理三大场景。主流产品各有特点:RabbitMQ功能全面但吞吐一般,Kafka适合大数据高吞吐,RocketMQ平衡性能与功能,ActiveMQ面向传统企业。选型需结合吞吐量、可靠性、功能需求和业务场景等维度综合考量,如大数据选Kafka,金融电商可选RocketMQ或RabbitMQ。

2025-07-18 09:09:22 1017

原创 JAVA 并发 ThreadLocal

是 Java 中实现线程隔离的重要工具,合理使用它可以简化多线程编程,但同时也需要注意其潜在的内存泄漏风险和适用场景。

2025-07-14 22:06:29 712

原创 JAVA 设计模式 代理

代理设计模式通过代理对象控制对目标对象的访问,提供额外功能而不修改原代码。它包括静态代理(编译时确定)和动态代理(运行时创建)。静态代理需手动编写代理类,动态代理利用Java反射机制动态生成。代理模式适用于AOP、远程调用、延迟加载等场景,核心优势是非侵入性和灵活性。动态代理通过Proxy类和InvocationHandler接口实现方法拦截和增强,是AOP和RPC等技术的基础。

2025-07-14 08:19:24 278

原创 JAVA 设计模式 适配器

适配器设计模式是一种结构型模式,用于解决接口不兼容问题。其主要包含三个角色:目标接口、需要适配的类以及适配器。实现方式分为类适配器(通过继承)和对象适配器(通过组合)。类适配器在Java中需继承一个类并实现目标接口,对象适配器则通过持有适配者实例实现转换。该模式适用于复用现有类、整合不相关类等场景。其优点包括提高复用性、灵活扩展,但过度使用可能导致系统混乱。由于Java单继承限制,类适配器只能适配一个类且目标必须是抽象类。

2025-07-14 08:16:56 311

原创 JAVA 设计模式 工厂

工厂设计模式是一种创建型设计模式,通过专门工厂类创建对象,实现创建与使用的分离。该模式包含产品接口(定义通用方法)、具体产品类(实现接口)和工厂类(负责实例化)。示例展示了Shape接口及其圆形、矩形等具体实现,通过ShapeFactory按需创建不同形状对象。优点包括降低耦合度、提高扩展性、符合开闭原则,适用于复杂对象创建或需要动态生成不同类型对象的场景。工厂模式将对象创建逻辑集中管理,使系统更易维护和扩展。

2025-07-14 08:15:33 342

原创 JAVA 设计模式 单例

单例模式是一种确保类只有一个实例的设计模式,提供全局访问点。适用于配置管理、数据库连接等场景。核心包括私有构造函数、静态实例和访问方法。实现方式主要有:饿汉式(简单但可能浪费资源)、懒汉式(延迟加载但性能较差)、静态内部类(延迟加载且线程安全)、枚举(最安全但灵活性差)。注意事项包括线程安全、序列化和反射问题。选择实现方式需权衡资源利用、性能和复杂度。

2025-07-14 08:13:34 392

原创 JAVA JVM虚拟线程

Java虚拟线程是Java 19引入并在Java 21正式标准化的轻量级线程实现,旨在提升高并发应用的性能和资源利用率。相比传统平台线程(直接映射OS线程),虚拟线程具有显著优势:轻量级(KB级内存)、高效资源利用(JVM调度)和同步编程简化。其核心原理是通过Continuation机制实现用户态协程,由ForkJoinPool调度器管理载体线程复用。虚拟线程特别适合IO密集型场景(如Web服务器),可支持百万级并发,但对CPU密集型任务效果有限。该技术通过降低上下文切换开销和栈内存优化,实现了用同步代码编

2025-07-13 17:22:00 769

原创 JAVA JVM垃圾收集

即使在可达性分析算法中判定为不可达的对象,也不是“非死不可”的,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。设计者一般至少会把Java堆划分为新生代(Young Generation)和老年代(Old Generation)两个区域,在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。

2025-07-11 17:40:06 1033

原创 JAVA JVM对象的实现

JVM对象内存分配与访问机制: JVM对象内存分配主要分为类加载检查、内存分配、初始化和对象头设置等步骤。分配方式包括指针碰撞(适用于规整内存)和空闲列表(适用于不规整内存)。为确保线程安全,JVM采用CAS或TLAB机制。对象内存布局由对象头(含MarkWord和类型指针)、实例数据和对齐填充组成。对象访问方式包括句柄访问(稳定但性能低)和直接指针访问(性能高但需修改引用)。HotSpot虚拟机默认采用直接指针访问方式以提高性能。

2025-07-10 16:22:55 1221

原创 JAVA JVM的内存区域划分

JVM内存区域分为线程私有和共享两部分。线程私有包括:程序计数器(记录字节码行号,不会OOM)、虚拟机栈(存储方法调用信息,可能栈溢出)和本地方法栈(支持native方法)。线程共享区域有堆(存放对象实例)和方法区(存储类信息等,Java8后改为Metaspace)。堆外内存指直接内存。程序计数器不会OOM因其占用固定极小空间,仅存储行号。栈溢出发生在深度过大时,而堆是JVM最大的内存区域,几乎所有对象实例都在此分配。(149字)

2025-07-10 16:16:28 428

原创 Java HashMap 的 get 和 put 方法的实现流程

HashMap的put方法流程包括:1)计算key的哈希值,通过高低位异或减少冲突;2)检查并初始化table数组;3)定位桶位置;4)处理空桶直接插入;5)非空桶则检查首节点匹配情况;6)树节点调用树操作,链表则遍历查找;7)存在则替换值,否则尾部插入;8)链表超长(8)时转为红黑树;9)最后检查扩容。get方法类似,通过哈希定位后,优先检查首节点,再区分树/链表结构查找。两种方法均使用(n-1)&hash定位桶,确保高效访问。

2025-07-09 18:36:37 414

原创 JAVAEE Stream流

Java Stream流是一种以声明式处理集合数据的工具,具有不存储数据、函数式编程和延迟执行等特点。创建方式包括从集合、数组创建,或使用Stream.of()、无限流等。Stream操作分为中间操作(filter、map等)和终端操作(collect、forEach等),中间操作返回新流,终端操作触发执行并产生结果。典型应用如将List转为Map时,通过Collectors.toMap处理键冲突,保留先出现的元素。Stream使代码更简洁易读,适合数据批量处理场景。

2025-07-09 11:31:38 552

原创 JAVAEE 代理

摘要:Java代理模式分为静态代理和动态代理两种主要形式。静态代理需手动编写代理类,在编译时确定;动态代理(包括JDK动态代理和CGLIB动态代理)则通过反射在运行时生成。JDK动态代理基于接口实现,使用Proxy类和InvocationHandler接口;CGLIB动态代理通过继承目标类生成子类代理,适用于无接口的类。三种方式各有特点:静态代理性能高但维护成本高,JDK动态代理灵活但有接口限制,CGLIB动态代理功能强大但需第三方库支持。代理模式常用于日志记录、事务管理等场景,实现方法拦截和功能扩展。

2025-07-08 20:51:25 570

原创 算法 堆与堆排序

堆是一种完全二叉树,分为大顶堆和小顶堆两种类型。堆具有结构性和有序性两大特性,可通过数组存储。堆的基本操作包括插入元素(上浮调整)和删除堆顶元素(下沉调整),时间复杂度均为O(logN)。堆排序通过构建初始堆、交换堆顶与末尾元素、调整堆结构三个步骤实现排序,优化后的构建方法时间复杂度为O(N)。相较于逐个插入的O(NlogN)方法,自底向上的堆调整更高效,因其充分利用堆结构特性,减少下沉操作次数。

2025-07-07 12:21:27 1122

原创 sql USING 简化 JOIN 操作

SQL中的USING子句是JOIN操作的简化语法,用于指定连接表的列名。相比ON子句,USING更简洁,并自动去除重复的连接列,在结果集中只显示一次。它支持多列连接(用逗号分隔),且与GROUP BY、ORDER BY配合使用时无需表名前缀。但需注意:连接列必须在两个表中存在且数据类型兼容,避免在子查询中对连接列使用别名。主要优势在于语法简化和自动去重,提高了查询可读性。

2025-07-03 12:14:42 601 1

原创 SpringBoot 常见问题 spring-boot-starter、spring-boot-starter-test、spring-boot-starter-web含义与作用

Spring Boot Starter是简化项目依赖管理的核心组件,通过模块化设计提供开箱即用的功能。主要作用包括:1)通过单一依赖替代多个分散依赖;2)自动管理版本兼容性;3)触发相关自动配置。常用Starter有:spring-boot-starter-web(整合Spring MVC+Tomcat)、spring-boot-starter-test(集成JUnit/Mockito等测试工具)、spring-boot-starter(基础核心功能)。各Starter形成层级依赖关系,如web start

2025-06-30 11:07:26 916

原创 算法 Arrays.sort()函数自定义排序(Comparator 接口)

/ 比较两个对象,返回值决定顺序// 默认方法(Java 8+新增)// 更多默认方法用于组合比较器compare 方法返回值负数:表示o1应排在o2前面0:表示o1和o2相等正数:表示o1应排在o2后面。

2025-05-28 11:56:06 598

原创 JavaEE MyBatis-Plus 入门案例

本文介绍了基于Spring Boot和MyBatis-Plus的开发环境搭建流程。使用IDEA 2019.2、JDK8+、Maven 3.5.4和MySQL 5.7作为开发环境,创建了名为mybatis_plus的数据库和user表。通过Spring Initializr初始化工程后,引入MyBatis-Plus、Lombok等核心依赖。配置文件中设置了数据源连接信息,启动类添加了@MapperScan注解。创建了User实体类,并继承BaseMapper接口实现基础CRUD功能。最后通过测试类验证查询功能

2025-03-25 16:28:26 563

原创 JavaEE MyBatis-Plus MyBatis-Plus介绍

提供了通用的Mapper和Service,可以在不编写任何SQL语句的前提下,快速的实现单表的增删改查(CURD),批量,逻辑删除,分页等操作。物理分页,开发者无需关心具体操作,配置好插件之后,写分页等。语句以及其执行时间,建议开发测试时启用该功能,能快速揪出。层代码,支持模板引擎,更有超多自定义配置等您来使用。操作,更有强大的条件构造器,满足各类使用需求。操作智能分析阻断,也可自定义拦截规则,预防。表达式,方便的编写各类查询条件,无需再。,性能基本无损耗,直接面向对象操作。配置,完美解决主键问题。

2025-03-25 16:06:45 382

原创 常见问题 i++与++i 的区别

在 Java 里,i++和++i都属于自增运算符,不过它们的执行顺序有所不同。

2025-03-19 11:41:48 588

原创 常见问题 java中Integer的128陷阱

在 Java 里,Integer存在一个 “128 陷阱”,这与 Java 对Integer对象的缓存机制有关。

2025-03-18 15:15:18 347

原创 常见问题 String类型和string builder类型以及string buffer。有什么共同点与区别?

2.Sting builder.和string buffer速度远远高于字符串。

2025-03-18 14:23:08 169

原创 算法 求中点方法的优化

右移一位相当于除2,右移n位相当于除以2的n次方。存在弊端:L+R可能溢出,导致计算错误。位移效率高,但是代码量大了。

2025-03-18 14:12:33 251

原创 算法 异或概要与利用异或实现交换

eor=a^b 意味着某一位上ab一定不一样(那一位=1)1)一种数出现奇数次 其他各个数出现偶数次 找奇数次的数。上方代码实现了数组元素的交换,如何使用异或简化代码?2)两种数出现奇数次 其他出现偶数次 找奇数次的数。其他数运算(可以理解为无进位相加)eor'只去异或第八位为1的数。找到那一位(假设为8)2.满足交换,结合律。

2025-03-15 00:58:32 149

空空如也

空空如也

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

TA关注的人

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