自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

月明长歌的博客

java比较两个值是否相等不要用== 用.equals()

  • 博客(90)
  • 收藏
  • 关注

原创 【码道初阶-Hot100】LeetCode 560. 和为 K 的子数组:从前缀和到哈希计数,彻底讲透为什么“统计前缀和”就等价于统计子数组个数

本文深入解析了LeetCode 560题"和为K的子数组"的解题思路。通过前缀和技巧,将子数组求和问题转化为前缀和差值的统计问题。核心思想是:对于每个右端点r,统计其左侧满足pre[l-1]=pre[r]-k的位置数量,这些位置即构成和为k的子数组。文章详细解释了为什么需要初始化hash.put(0,1),以及为何要先更新答案再更新哈希表这两个关键细节。最终给出时间复杂度O(n)的优化解法,通过哈希表记录前缀和出现次数,避免暴力枚举带来的高时间复杂度。该解法巧妙利用了数学关系转换,是前缀

2026-03-18 20:58:31 404

原创 【码道初阶-Hot100】LeetCode 438 + 567 对照详解:一套滑动窗口模板,彻底讲透“固定长度窗口 + 计数数组 + count维护”

本文通过对比LeetCode 438和567两道题,揭示它们本质都是固定长度滑动窗口问题,采用计数数组和count维护有效字符数的通用解法。重点阐明了count统计的是有效字符总数而非种类数,并详细解释了"进窗口先加后判,出窗口先判后减"的操作顺序原理。通过具体反例说明顺序错误会导致bug,最后给出适用于两题的万能口诀和438题的代码实现。全文帮助读者一次性掌握这类问题的核心思路与实现细节。

2026-03-17 23:07:50 987

原创 【码道初阶-Hot100】LeetCode 3. 无重复字符的最长子串:从错误直觉到滑动窗口,彻底讲透为什么必须判断 `map.get(c) >= left`

摘要 LeetCode第3题"无重复字符的最长子串"看似简单,但隐藏着关键理解难点。本文深入剖析了错误思路(遇到重复就整段重开)的缺陷,通过"dvdf"等反例说明其会漏掉正确答案。重点讲解了滑动窗口的正确解法,强调必须维护动态窗口而非静态分段。特别指出代码中map.get(c) >= left判断的关键性,通过"abba"案例演示缺少该判断会导致错误结果(输出3而非2)。文章详细拆解了标准解法,包括哈希表记录字符位置、窗口左右边界维护等核心要

2026-03-17 22:39:03 438

原创 【码道初阶-Hot100】LeetCode 128. 最长连续序列:从排序双指针扫描到 HashSet,一文讲透为什么 O(n) 解法要用哈希

本文详细解析了LeetCode 128题"最长连续序列"的两种解法。首先介绍了直观的排序+线性扫描方法,时间复杂度为O(n log n),虽能正确解题但不满足题目要求。重点阐述了哈希解法,通过HashSet去重并仅从序列起点扩展,实现O(n)时间复杂度。文章深入分析了为何必须从起点出发以避免重复计算,并提供了高质量注释代码,帮助读者理解两种解法的核心思路与优化关键。

2026-03-14 14:12:35 507

原创 【码道初阶-Hot100】 LeetCode 49. 字母异位词分组:从排序哈希到分组映射,彻底讲透为什么排序后可以作为同一组的标识

文章摘要 LeetCode 49题要求将字母异位词分组,关键在于为异位词构造统一标识。通过排序字符串,互为异位词的字符串会得到相同的排序结果,从而可作为哈希表的key。使用HashMap<String, List<String>>存储,key为排序后的字符串,value为对应的原字符串列表。该方法时间复杂度为O(N*KlogK),其中N是字符串数量,K是字符串平均长度。核心思想是通过特征值构造和哈希分组解决"本质相同、形式不同"的问题。

2026-03-13 21:15:49 608

原创 【码道初阶-Hot100】LeetCode 42. 接雨水:从按列计算到前后缀最大值,彻底讲透为什么这一列能接多少水

本文系统讲解了LeetCode 42题"接雨水"的解题思路。核心思想是将总雨水量拆解为计算每一列上方能接的水量,其关键在于确定每列左右两侧的最高挡板高度。水位高度由两侧较矮的挡板决定(min(左最高,右最高)),减去当前柱子高度即为该列可接水量。文章详细阐述了如何通过预处理前后缀最大值数组来优化计算,将复杂度从O(n²)降至O(n),并提供了清晰的Java代码实现,帮助读者深入理解这一经典问题的解决思路。

2026-03-13 00:09:45 633

原创 【码道初阶-Hot100】LeetCode 11. 盛最多水的容器:从暴力枚举到双指针,彻底讲透为什么一定要移动短板

摘要 LeetCode 11题"盛最多水的容器"通过双指针法将O(n²)暴力解法优化至O(n)。核心在于理解必须移动短板的原因:当height[left]<height[right]时,移动右指针只会使宽度减小而高度不变,必然导致面积减小;只有移动短板才可能通过提升高度来获得更大面积。算法初始化左右指针于数组两端,每次计算当前面积后移动较短边的指针,直至两指针相遇。这种策略确保了不会错过任何可能的更大容积情况,是双指针应用的经典范例。

2026-03-12 21:44:50 425

原创 【码道初阶-Hot100】LeetCode 15. 三数之和:从暴力枚举到双指针,彻底讲透去重、剪枝与边界控制

本文系统讲解了LeetCode 15. 三数之和的解题思路,从暴力枚举到双指针优化。暴力解法使用三层循环和HashSet去重,时间复杂度为O(n^3)。优化解法通过排序数组、双指针和剪枝将复杂度降至O(n^2)。关键点包括:排序固定顺序、双指针移动策略、i和左右指针的去重处理,以及边界控制。文章详细分析了去重的三种类型和剪枝原理,帮助读者深入理解这道经典题目。

2026-03-12 20:29:11 525

原创 Java 网络编程套接字入门:从“发一段数据”到“写一个可并发的服务器”

本文介绍了Java网络编程的核心概念与基础实现。首先明确了网络编程的本质是不同主机或进程间的数据传输,解释了客户端/服务端、请求/响应等基本概念。重点讲解了Socket套接字作为网络通信的基本单元,包括流套接字(TCP)和数据报套接字(UDP)的特性差异。文章详细展示了UDP编程模型,通过DatagramSocket和DatagramPacket类实现数据收发,并提供了一个完整的UDP回显(Echo)示例,包含服务端和客户端的代码实现。该示例演示了从请求接收、处理到响应返回的完整流程,是理解网络编程基础的理

2026-02-17 14:57:00 1047

原创 网络原理初识:从“几台电脑各干各的”到“数据包跨网段飞奔”的一整套思维模型

本文系统介绍了计算机网络的基本原理和分层模型。主要内容包括:网络互连从独立模式发展到LAN/WAN的过程;IP地址、端口号和协议三要素如何实现进程间通信;五元组标识网络连接;OSI七层与TCP/IP五层模型的对比;各层功能及典型设备(主机、路由器、交换机等);数据封装与分用机制。文章通过快递系统类比,形象地解释了网络通信中地址定位、数据传输等核心概念,为理解网络工作原理提供了清晰的思维框架。

2026-02-17 13:41:39 1350

原创 全栈测试修炼指南:从接口策略到 Python+Pytest+Allure 企业级架构

《全栈测试修炼指南》摘要:本文系统讲解接口测试策略与Python自动化实践。首先剖析接口测试价值,包括安全性验证、测试前移等优势,并提出五维用例设计法。随后深入Python Requests库实战,详解GET/POST请求差异及鉴权处理。在框架层面,重点解析Pytest核心特性(Fixture作用域、数据驱动)和企业级架构设计(分层目录、PO模式)。最终结合Allure生成专业测试报告,形成从策略到落地的完整解决方案,适用于中高级测试工程师提升自动化能力。

2026-01-31 23:00:50 1317 2

原创 从零构建高并发测试体系:JMeter 接口压测与全链路实战指南

本文详细介绍了使用JMeter构建高并发测试体系的完整流程。首先从环境准备和登录接口参数化入手,通过CSV数据实现多用户模拟;接着讲解上下文关联技巧,包括Cookie管理器和JSON提取器的使用;然后构建完整业务链,实现从列表页到详情页的动态测试;在进阶部分介绍了梯度加压和瞬间并发的实现方法;最后展示了测试数据可视化与报告生成的关键技术。文章通过图文并茂的方式,系统性地讲解了从单接口测试到全链路压测的实战方法,为构建可靠的性能测试体系提供了完整指南。

2026-01-31 20:06:34 1110

原创 性能测试概念篇:从“能用”到“抗打”,把指标、拐点与测试类型一次讲透

性能测试是评估系统在特定负载下表现的关键方法,关注指标包括并发数、吞吐量、响应时间等。通过基准测试获取单用户数据,负载测试确定最大可用负载,压力测试找到系统极限容量,并发测试发现共享资源问题,稳定性测试验证长期运行可靠性。不同角色关注点各异:用户侧重响应速度,运维重视系统健康度,开发聚焦架构优化。性能测试的核心目标是找出系统性能拐点,为容量规划和性能调优提供依据,确保系统从"能用"到"抗打"的转变。

2026-01-29 23:38:12 1008

原创 个人测试项目:一个可跑、可扩、可复用的 Selenium UI 自动化博客系统全链路测试拆解

摘要: 本文介绍了一个基于Selenium的博客系统全链路自动化测试框架。采用页面对象模型(Page Object)设计模式,将UI操作封装为LoginPage、ListPage、DetailPage等独立类,通过Utils基类提供Driver管理、等待策略和截图等公共能力。框架特点包括:1)WebDriverManager自动管理浏览器驱动;2)隐式+显式等待混合策略;3)按日期归档的智能截图功能;4)可复用的页面操作封装。测试流程涵盖登录、列表页校验、详情页操作和博客发布等完整链路,结构清晰且易于扩展,

2026-01-29 19:14:09 1400

原创 Selenium中隐式等待(Implicit Wait)和显式等待(Explicit Wait)的区别

本文对比了Selenium中隐式等待和显式等待的核心区别。隐式等待作用于元素查找操作,是全局配置,只能等待元素存在但无法确保元素状态;显式等待则针对特定条件(如元素可见、可点击、alert出现等),是局部精确控制。关键差异在于:隐式等待无法处理alert等非DOM元素场景,而显式等待支持更丰富的条件判断。实际使用中建议以显式等待为主,避免混合使用导致的不可预测超时问题。显式等待提供了更细粒度的控制能力,是编写稳定测试脚本的首选工具。

2026-01-20 21:57:28 796

原创 Selenium Web 自动化测试脚本总结

本文总结了Selenium Web自动化测试的关键知识点。首先介绍了Selenium+浏览器驱动+浏览器的协作原理,建议使用WebDriverManager管理驱动版本。然后通过一个百度搜索的示例演示了基本测试流程,包括元素定位、输入点击等操作。重点讲解了元素定位方法(cssSelector和XPath)以及常见元素操作,强调了定位唯一性的重要性。文章还详细说明了窗口切换、等待策略(强制/隐式/显式)等关键技巧,并指出不要混合使用隐式与显式等待。最后介绍了浏览器导航操作。全文提供了实用的代码示例和工程实践建

2026-01-20 17:47:37 955

原创 测试用例篇:从“万能公式”到六大方法,搭一套可复用的用例设计体系

测试用例设计体系:从理论到实践 摘要:本文系统介绍了测试用例的设计方法与实施体系。测试用例作为可执行的验证说明书,需包含环境、步骤、数据和预期结果等要素,其核心价值在于实现测试覆盖可衡量、回归可重复。文章提出"万能公式"设计框架,涵盖功能、界面、性能、兼容性、易用性和安全六大测试维度,并针对移动端补充弱网和安装卸载测试。详细解析了五种实用设计方法:等价类分类法、边界值分析法、正交试验法、判定表法和场景法,帮助测试人员从少量样本覆盖最大范围。通过需求拆解、测试点提取到用例细化的完整流程,建

2026-01-18 23:59:23 914

原创 测试BUG 篇:从“怎么测”到“怎么提”,再到“怎么关”全流程

本文系统介绍了软件测试中Bug管理的全流程。从软件测试生命周期(需求分析到运行维护)切入,重点阐述了Bug的定义标准、规范化的描述方法(版本/环境/步骤/预期/实际五要素)、科学定级原则(崩溃/严重/一般/次要)以及完整的生命周期状态流转。针对测试与开发常见争执,提供了从自查描述、用户影响沟通、有理有据定级到召开Bug评审的递进解决方案。全文强调以标准化流程和客观证据为基础,实现Bug从发现到修复的可追踪闭环管理,最终提升团队协作效率与产品质量。

2026-01-18 17:21:46 1701

原创 软件测试基础概念:需求、开发模型、测试模型

本文系统梳理了软件测试中的核心概念:需求、开发模型和测试模型。首先区分用户需求与软件需求,强调需求分析的重要性,并以邮箱注册为例展示需求文档规范。其次介绍软件生命周期各阶段,类比建筑流程说明开发流程。最后详解四种开发模型:瀑布模型(线性推进)、螺旋模型(风险驱动)、增量/迭代模型(渐进式开发)和敏捷模型(快速响应变化),分析其特点、优缺点及适用场景。全文旨在帮助读者构建清晰的软件测试知识框架,理解不同开发模式下的测试策略差异。

2026-01-12 13:42:11 1046

原创 JavaJUC 并发工具箱:常见类、线程安全集合与死锁

JUC并发编程核心工具摘要 Java并发工具包(JUC)提供了高效的多线程开发组件,主要包括: Callable+FutureTask - 替代传统wait/notify模式,实现带返回值的异步任务处理 ReentrantLock - 比synchronized更灵活的互斥锁,支持超时、公平锁等特性 原子类 - 基于CAS实现无锁线程安全操作,如AtomicInteger的原子增减 线程池 - 通过ExecutorService管理线程生命周期,提高资源利用率 Semaphore - 控制并发访问数量的信号

2026-01-11 03:06:42 708

原创 Javasynchronized 原理拆解:锁升级链路 + JVM 优化 + CAS 与 ABA 问题(完整整合版)

本文深入解析了Java中synchronized关键字的底层原理和优化策略。首先指出synchronized是一套根据竞争强度自动调整的锁策略组合:初始采用乐观锁和轻量级锁,随着竞争加剧逐步升级为悲观锁和重量级锁。详细介绍了锁升级链路:无锁→偏向锁→轻量级锁(基于CAS和自旋)→重量级锁(依赖OS mutex)。还分析了JVM的优化手段包括锁消除和锁粗化,以及CAS机制的原理和引发的ABA问题。最后通过ATM扣款案例展示了ABA问题的实际危害,并提出了版本号等解决方案。全文系统性地阐述了synchroniz

2026-01-10 01:41:16 375

原创 Java多线程对常见锁总结(Synchronized和ReentrantLock)及锁策略

文章摘要: 本文系统介绍了Java并发编程中的锁策略体系,包括悲观锁与乐观锁的对比(synchronized vs CAS)、重量级锁与轻量级锁的选择依据、自旋锁的实现原理、公平锁与非公平锁的权衡、可重入锁特性分析,以及读写锁的应用场景。通过代码示例详细展示了各种锁策略的实现方式和使用场景,特别深入解析了synchronized的底层原理,并将其与ReentrantLock进行了对比。全文从策略选择到具体实现,为开发者提供了全面的锁机制知识框架和实践指导。

2026-01-09 02:05:32 1081

原创 Java多线程线程池ThreadPoolExecutor理解总结:6 个核心参数 + 4 种拒绝策略(附完整示例)

本文深入解析了Java线程池ThreadPoolExecutor的核心机制,重点阐述了6个关键参数和4种拒绝策略: 核心调度逻辑:提交任务时,线程池按"先扩核心线程→入队→扩非核心线程→拒绝"的流程处理任务。 6个核心参数: corePoolSize:常态线程数 maximumPoolSize:最大扩容上限 keepAliveTime:非核心线程空闲回收时间 workQueue:任务队列类型(有界/无界/Synchronous) threadFactory:线程创建方式 Rejected

2026-01-08 23:59:24 1570

原创 Java多线程设计模式案例:带代码的全景梳理(单例 / 阻塞队列 / 定时器 / 线程池)

本文梳理了四种多线程设计模式的实现方法:1)单例模式(饿汉/懒汉/双重检查),保证全局唯一实例;2)阻塞队列(生产者-消费者模型),实现线程安全与自动阻塞;3)定时器,支持到点执行任务;4)线程池(未展示代码)。重点分析了wait/sleep区别、单例模式的线程安全实现、阻塞队列的手写实现(循环数组+同步机制),并提供了各模式的典型应用场景和代码示例。这些模式通过同步控制、条件等待等机制,有效解决了多线程环境下的资源共享与协调问题。

2026-01-08 23:57:39 1060

原创 Java手写计时器是怎么跑起来的?优先队列 + 单工作线程 + wait/notify以及细节纠错

摘要 这段代码实现了一个简易定时器,核心机制是使用优先队列管理定时任务,并通过单工作线程监控执行时机。主要特点包括: 任务封装:MyTimerTask将Runnable任务与执行时间戳绑定 优先级调度:使用PriorityQueue确保最早到期的任务始终在队首 智能等待:工作线程通过wait(timeout)精确休眠到下一个任务的执行时间 线程安全:通过synchronized和wait/notify机制协调任务提交与执行 定时器能正确处理乱序提交的任务(如先提交2000ms任务再提交1000ms任务),并

2026-01-08 20:31:15 578

原创 Java自己手写阻塞队列的线程安全设计:这段 MyBlockingQueue到底在哪些地方体现了线程安全

这段代码实现了一个线程安全的阻塞队列 MyBlockingQueue,其线程安全设计主要体现在: 使用 synchronized 同步块确保对共享变量(data/head/tail/size)的原子操作 队列满/空时调用 wait() 阻塞并释放锁,避免死锁 使用 while 而非 if 检查条件,防止虚假唤醒导致状态不一致 状态变更后调用 notify() 唤醒等待线程 改进建议包括改用 notifyAll() 避免无效唤醒、置空已取元素槽位等。该实现通过互斥访问、条件同步和正确唤醒机制,确保了多线程环境

2026-01-08 13:21:44 988

原创 Java线程安全全景图:为什么会不安全、哪里不安全、怎么让它安全

线程安全全景摘要 线程安全的核心是确保多线程执行结果与单线程一致。三大关键问题: 调度随机性导致执行顺序不确定,需保证所有可能的交错顺序都正确 共享数据修改是主要风险点(如多线程同时写变量) 三大底层原因: 原子性:操作可能被中断(如count++实际分三步) 可见性:线程修改后其他线程未及时感知 有序性:指令重排破坏逻辑 解决方案: 减少共享:线程私有数据或不可变对象(如String) 同步互斥:synchronized保证原子性(需注意锁对象选择) 内存可见:volatile解决可见性(但不保证原子性)

2026-01-08 02:00:00 717

原创 JavaThread类详解核心属性、常用方法与实践

本文摘要: Thread类是Java中管理线程执行流的对象,核心要点包括: 必须通过start()方法启动新线程,直接调用run()只是普通方法调用 关键属性分为三类: 标识属性:ID(唯一)、Name(建议规范命名) 状态属性:State(观测用)、Alive(是否存活) 调度属性:Priority(调度提示)、Daemon(守护线程)、Interrupted(协作中断) 守护线程(demon)决定JVM退出行为,必须在start()前设置 常用方法三件套: currentThread()获取当前线程 s

2026-01-07 23:18:16 765

原创 Java进程与线程的区别以及线程状态总结

本文对比了进程和线程的核心区别:进程是资源分配单位,线程是执行流单位。重点讲解了Java线程的6种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED)及其转换条件。状态转换围绕三类等待展开:等调度、等锁、等通知/时间。理解这些状态机制对并发编程至关重要,能帮助开发者更好地控制线程行为,避免常见的并发问题。

2026-01-07 20:12:53 534

原创 【码道初阶】LeetCode283移动零:把数组当成三段区间,用双指针原地“分区+稳定”

本文介绍了一种使用双指针原地移动数组零元素的方法。通过将数组划分为三个区间(非零区、零区、待处理区),利用扫描指针cur和非零区边界指针dest,在遍历过程中将非零元素交换到非零区末尾。这种方法保证了非零元素的相对顺序稳定,时间复杂度为O(n),且交换次数等于非零元素个数。核心思想是维护区间不变量,通过交换操作实现原地稳定分区,适用于类似"将特定元素移动到一侧并保持顺序"的问题。

2026-01-05 23:59:28 314

原创 【码道初阶】双指针问题LeetCode1089 复写零:为什么必须从后往前写?cur/dest 双指针把“扩容数组”模拟出来

该文章讨论了原地复写数组零的算法问题。核心思路是使用双指针(cur和dest)从后往前处理数组,避免数据覆盖。首先,通过正向扫描确定每个元素在扩容后的位置,当dest指针达到数组末尾时停止。然后处理边界情况(如最后一个零只能写一次),最后从后往前回填数据。这种方法确保了在不丢失原始数据的前提下完成原地修改,适用于类似数组移动/扩展问题。关键技巧在于逆向操作和精确的边界控制。

2026-01-05 23:56:26 999

原创 MySQL 视图:把复杂查询封装成表,并且还能控权限、做解耦

MySQL视图是虚拟表,基于基础表查询结果生成,不存储数据但能简化复杂查询、控制权限和解耦应用。视图通过CREATE VIEW创建,支持别名或显式列名定义,将多表连接查询封装为简单接口(SELECT * FROM 视图名)。视图能隐藏敏感字段(如密码),仅暴露必要列,还可参与联表查询。但视图更新有限制:含聚合、GROUP BY等的视图不可更新。视图优势在于简化查询、提升安全性、解耦应用与底层表结构变化。使用DROP VIEW可删除视图。

2026-01-01 16:00:48 944

原创 MySQL 事务一口气讲透:ACID、提交/回滚、保存点、自动提交、隔离级别与并发异常复现

MySQL事务是一组SQL操作的执行单元,确保要么全部成功要么全部失败。文章深入讲解了事务的ACID特性(原子性、一致性、隔离性、持久性)、基本使用方式(COMMIT/ROLLBACK)以及保存点机制。重点分析了隔离级别(从READ UNCOMMITTED到SERIALIZABLE)及其引发的并发问题(脏读、不可重复读、幻读),并通过双会话场景复现问题。还介绍了自动提交模式、存储引擎要求以及隔离级别的查看设置方法,帮助开发者正确处理转账、下单等关键业务场景。

2026-01-01 15:55:31 1137

原创 MySQL 索引一口气讲透:从数据结构到 InnoDB 页,再到创建/查看/删除索引

MySQL索引本质是有序数据结构,通过牺牲存储空间和写入性能来提升查询效率。文章系统讲解了索引原理:从目录式查询优化,到B+树作为主流结构的原因(低树高减少I/O、叶子链表优化范围查询),再到InnoDB页机制(16KB页、页目录二分查找)。详细分析了主键/普通/唯一等索引类型,以及聚集索引与回表机制。通过数据结构选择、工程化设计(如分叉因子、页分裂)和典型查询场景(点查/范围)的适配,解释了MySQL索引如何实现高效稳定查询,并给出千万级数据仅需3次I/O的量化估算。

2025-12-31 23:19:42 983

原创 MySQL联合查询速通:从笛卡尔积到 JOIN、子查询、UNION,再到把结果写回表

本文介绍了MySQL联合查询的核心概念与实用技巧,主要内容包括: 联合查询的必要性:解决多表数据关联问题,通过笛卡尔积+过滤机制组合分散数据。 多表查询实现方法: 内连接的两种写法(逗号+WHERE和JOIN ON) 外连接(左/右连接)保留不匹配记录 自连接实现行间比较 高级查询技术: 子查询(单行、多行、多列) FROM子句嵌套查询 UNION合并结果集 实用技巧: 表别名简化SQL 结果写回表(INSERT SELECT) 常见错误处理(如列名歧义) 全文通过示例代码演示了从基础到进阶的联合查询应用场

2025-12-31 22:12:34 1127

原创 MySQL数据库约束:把“能插入”升级成“插入就对”

本文系统讲解了数据库约束的常见类型及其应用场景,包括NOT NULL(非空)、DEFAULT(默认值)、UNIQUE(唯一)、PRIMARY KEY(主键)、FOREIGN KEY(外键)和CHECK约束。通过具体SQL示例演示了各类约束的创建方式、违反规则时的处理机制,以及约束在保证数据完整性方面的作用。特别详细解析了主键自增、复合主键、外键关联等高级用法,帮助开发者从源头确保数据准确性、可靠性和一致性。

2025-12-31 21:58:38 768

原创 怎么把 SQL 的增删改查写成“稳、准、可维护”的

本文总结了编写稳健、准确且可维护SQL语句的核心要点。主要内容包括:1)INSERT插入数据时推荐指定列名;2)SELECT查询避免无脑使用*并注意NULL运算陷阱;3)WHERE条件过滤的安全写法与常见误区;4)UPDATE和DELETE必须包含WHERE条件防止误操作;5)聚合函数与GROUP BY分组统计的正确用法;6)常用日期、字符串等内置函数示例。特别强调SQL编写要防止NULL值问题、避免全表误操作,并确保查询结果可统计、可分页。通过规范的语法和明确的注意事项,可大幅提升SQL代码的质量和安全性

2025-12-31 18:31:23 713

原创 【码道初阶】HashSet牛客旧键盘 (20)坏键识别:用 Set 做成员判断 + 去重,顺序靠遍历保留

摘要 本文介绍了解决旧键盘坏键识别问题的算法思路。题目要求通过比较期望输入串和实际输入串,找出所有坏键并按特定规则输出。核心解决策略包括:1) 统一转为大写字母处理;2) 使用HashSet快速判断字符是否存在;3) 通过遍历期望串顺序输出首次出现的坏键。算法时间复杂度为O(n+m),空间复杂度为O(1)。文中还分析了代码优化点,如避免重复创建Scanner对象等。该方案通过合理使用集合和遍历顺序,高效满足了题目要求。

2025-12-26 14:43:48 881

原创 【码道初阶】Leetcode771 宝石与石头:Set 判成员 vs List 判成员(同题两种写法的差距)

摘要: 本文对比了两种解决「宝石与石头」问题的方法。题目要求统计 stones 中属于 jewels 的字符数量。 HashSet 解法(推荐): 时间复杂度:O(|jewels| + |stones|) 利用 HashSet.contains() 的 O(1) 成员判断特性,高效计数。 List 解法(不推荐): 时间复杂度:O(|stones| * |jewels|) ArrayList.contains() 需线性扫描,效率较低。 结论:HashSet 更优,因其时间复杂度更低、语义更贴切,且具备良好

2025-12-26 14:28:33 935

原创 【码道初阶】Leetcode138:随机链表的复制:用 HashMap 做深拷贝的标准解法

本文介绍了使用HashMap实现随机链表深拷贝的标准解法。关键在于建立原节点到新节点的映射关系,通过两趟遍历:第一趟创建所有新节点并存入HashMap,第二趟根据原链表结构设置新节点的next和random指针。这种方法保证了新链表完全独立于原链表,满足深拷贝要求。时间复杂度O(n),空间复杂度O(n)。文章还指出了常见错误,并提到存在更节省空间的解法,但HashMap方案更直观可靠。该解法适用于各种复杂指针结构的复制问题。

2025-12-26 12:35:25 925

空空如也

空空如也

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

TA关注的人

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