文章列表

HashMap 是不是线程安全的?如果让你来实现一个线程安全的 HashMap 你要怎么设计?如果不用加锁你要怎么设计?

技术分享

📅 2026-01-13🏷️ 技术分享

HashMap 的线程安全性是多线程编程中的一个重要问题,下面我将为你详细解答,并探讨线程安全 HashMap 的设计方案。 # 🔒 HashMap 的线程安全性分析 ## HashMap 的非线程安全本质 HashMap 在设计上**不是线程安全**的。当多个线程同时访问和修改同一个 HashMap 实例时,会导致不可预知的行为。 ### 并发环境下的主要问题: - **数据竞争**:多个线程同时执行 put/remove 操作可能导致数据丢失或覆盖 - **死循环**:在扩容过程中,多线程可能导致链表形成环,引发 CPU 100% 问题 - **大小不一致**:size() 方法返回的结果可能不准确 ### 特例分析 需要注意的是,当 HashMap 作为**方法内的局部变量**,且每个线程拥有独立实例时,不存在线程安全问题。 # 🛠️ 实现线程安全 HashMap 的设计方案 #...

阅读更多

Trie树介绍

技术分享

📅 2026-01-13🏷️ 技术分享

### 🌲 Trie树的核心特性 Trie树有三个基本性质: 1. **根节点不包含字符**,它作为所有字符串的起点。 2. 从根节点到任意一个节点的路径上,经过的所有字符连接起来,就是该节点对应的字符串(或前缀)。 3. 每个节点的所有子节点所包含的字符都互不相同。 它的核心思想是 **空间换时间**,通过将字符串的公共前缀合并存储,避免了大量无谓的字符串比较,使得查询效率在很多情况下优于哈希表。 ### 🧱 结构与基本操作 一个典型的Trie树节点(TrieNode)通常包含两部分信息: * **子节点指针**:可以是固定大小的数组(如处理26个小写英文字母时使用长度为26的数组)或更灵活的映射(如`Map`),用于指向下一个字符节点。 * **结束标记**:一个布尔值(如`isEndOfWord`),标记从根节点到当前节点的路径是否构成了一个完整的单词(而不仅仅是前缀)。...

阅读更多

评论脏词过滤:基于DFA算法的高性能动态过滤方案

技术分享

📅 2026-01-13🏷️ 技术分享

评论系统是内容平台和社交应用的核心功能之一,而脏词过滤是保障内容安全、维护社区氛围的关键技术。本文将详细介绍如何在SpringBoot中实现一个**高性能、支持动态更新**的脏词过滤系统。 ## 一、背景与需求分析 随着Web应用的发展,用户生成内容(UGC)面临着严峻的内容安全挑战。脏词过滤系统需要满足以下核心需求: - **高性能**:处理海量用户评论时不能成为系统瓶颈 - **动态更新**:脏词库需要支持实时更新,无需重启服务 - **准确性**:准确识别敏感词,同时控制误判率 - **灵活性**:支持多种处理策略(替换、拒绝、审核) ## 二、核心技术选型:为何选择DFA算法? 在脏词过滤场景下,**DFA(确定有限状态自动机)算法**相比传统方法有显著优势。 ### 2.1 传统方法的瓶颈 - **暴力匹配**:遍历每个脏词检查文本是否包含,时间复杂度O(n*m),随脏词数量增加...

阅读更多

MySQL如何解决深度分页问题?

技术分享

📅 2026-01-08🏷️ 技术分享

在MySQL开发中,除了计数场景,深度分页(即`LIMIT offset, size`中`offset`值极大的分页查询)也是高频遇到的性能问题。比如“查询第1000页数据,每页10条”(`LIMIT 9990, 10`),常会出现查询缓慢的情况。下面详细讲解深度分页的问题根源及解决方案。 ### 1. 深度分页的问题根源 先明确常规分页的实现方式:使用`LIMIT offset, size`,其中`offset`表示跳过前N条数据,`size`表示取N条数据。 问题核心:当`offset`极大时(如9990),MySQL需要先扫描并跳过前9990条数据,再取10条数据。即使查询条件有索引,也需要遍历索引到第9990条位置,才能定位到目标数据,导致IO开销大、查询效率低。 示例(低效查询): ```sql -- 查询第1000页数据,每页10条,offset=9990 SELECT id,...

阅读更多

MySQL中count(*)、count(1)与count(字段名)的区别详解?

技术分享

📅 2026-01-08🏷️ 技术分享

在MySQL开发中,计数是高频操作,而`count(*)`、`count(1)`和`count(字段名)`这三种常见的计数方式,常常让开发者混淆——它们的计数结果是否一致?执行效率有差异吗?该如何选择?本文将从核心逻辑、具体区别、效率对比、实践建议四个维度,彻底讲清三者的差异,帮你避开使用误区。 ## 一、先明确核心:count()函数的本质 首先要厘清一个基础认知:`count()`是MySQL的聚合函数,核心作用是**统计查询结果集中符合条件的行数**。三者的差异根源,在于「统计范围」和「MySQL对其的优化逻辑」不同,而非函数本身的功能差异。 ## 二、三者的具体区别:逻辑+示例验证 为了更直观地对比,我们先创建一张测试表并插入测试数据(包含NULL值,模拟真实业务场景): ```sql -- 创建测试表 CREATE TABLE test_count ( id INT COMMEN...

阅读更多

二分查找的两种核心类型:精准查找与近似查找(Java实现与场景分析)

技术分享

📅 2026-01-05🏷️ 技术分享

# 二分查找的两种核心类型:精准查找与近似查找(Java实现与场景分析) ## 前言 二分查找(Binary Search)作为有序数组的高效查找算法,其时间复杂度为O(log n),远优于线性查找的O(n)。根据查找需求的不同,二分查找可分为两大核心类型:**精准查找**与**近似查找**。精准查找是二分查找的原始形态,专注于判断目标值是否存在并返回其精确索引;近似查找则是精准查找的扩展,用于在目标值不存在时,找到与目标值最接近的元素,满足实际业务中的模糊匹配需求。本文将详细讲解这两种查找类型的原理、Java实现及适用场景。 ## 一、 精准查找(Exact Binary Search) ### 1.

阅读更多

Vue3 应用版本更新策略:实现浏览器自动加载最新内容

技术分享

📅 2026-01-05🏷️ 技术分享

本文将详细介绍如何在 Vue3 应用中实现版本更新后浏览器自动加载最新内容的完整方案,涵盖构建优化、缓存策略与版本控制的各个方面。 ## 1. 构建工具配置:静态资源哈希命名 在 Vue3 项目中,使用 Vite 或 Webpack 等构建工具为静态资源生成带哈希值的文件名是版本控制的基础。当文件内容变化时,哈希值会更新,浏览器会因 URL 不同而重新加载资源。 ### Vite 配置示例 ```js // vite.config.js export default defineConfig({ build: { rollupOptions: { output: { entryFileNames: `assets/[name]-[hash].js`, chunkFileNames: `assets/[name]-[hash].js`, assetFileNames:...

阅读更多

二分查找算法和实例介绍

技术分享

📅 2026-01-05🏷️ 技术分享

### **1. 核心思想** 二分算法是一种高效的搜索算法,适用于**有序数组**,通过**分治策略**逐步缩小搜索范围。其核心思想是: - 将数组分为两半,比较目标值与中间元素的大小关系; - 根据比较结果,决定继续在左半部分或右半部分搜索; - 重复此过程,直到找到目标值或确定其不存在。 --- ### **2. 使用前提** - **数组必须有序**(升序或降序)。 - 适用于静态数据(无需频繁插入/删除),因动态数据维护有序性成本较高。 --- ### **3. 算法步骤** 以升序数组为例,查找目标值 `target`: 1. **初始化**:定义两个指针 `low`(起始位置)和 `high`(结束位置)。 - 通常 `low = 0`,`high = 数组长度 - 1`。 2. **循环条件**:当 `low <= high` 时继续循环。 3.

阅读更多

场景面试题:如何避免用户重复下单(多次下单未支付,占用库存)

技术分享

📅 2025-12-29🏷️ 技术分享

# Spring Boot 如何避免用户重复下单(多次下单未支付,占用库存)?—— 面试题详解 在高并发电商系统中,一个常见的问题是:**用户短时间内多次点击“下单”按钮,生成多个未支付订单,导致库存被无效占用,影响其他用户购买**。这不仅浪费系统资源,还可能引发超卖或库存不足的问题。 本文将围绕 **Spring Boot 技术栈**,从原理、方案设计到代码实现,详细讲解如何有效防止用户重复下单,并形成一套可落地的解决方案。 --- ## 一、问题场景还原(面试题背景) > **面试官提问**: > “在我们的电商平台中,经常有用户在未支付的情况下多次点击下单按钮,造成多个待支付订单和库存锁定。请问你如何在 Spring Boot 项目中解决这个问题?” 这是一个典型的 **幂等性 + 库存管理 + 分布式锁** 综合问题。 --- ## 二、核心思路分析 要解决重复下单问题,需从以下维...

阅读更多
34 篇文章,第 1 / 4