跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

String 字符串的存储结构详解

详细解析了 Java 中 String 类的底层存储机制。主要涵盖字符串常量池与哈希表的结构设计,包括键值对象及链表处理冲突的方式。阐述了存储过程,如搜索字面量哈希值及创建新实例的流程。明确了存储位置在堆区,区分了常量池字符数组与堆上新建对象的内存分配差异。最后对比了 new 关键字创建对象与 intern 方法入池的操作区别,帮助理解 String 内存管理原理。

leon发布于 2026/3/26更新于 2026/7/2445 浏览
String 字符串的存储结构详解

文章配图

文章配图

一、存储结构

文章配图

1. 字符串常量池

字符串常量池配合着字符串哈希表,存储所有""引起来的字符串字面量。

2. 字符串哈希表

2.1 结构

字符串哈希表采用的是 HashMap 的存储结构,采用开散列处理哈希冲突。

2.2 基础存储单位

哈希数组里的基础存储单位是链表的节点,每个节点里存储键对象、值对象、冲突情况下一个节点引用,每个链表节点已包含了Map 的包装节点:

2.2.1 键对象

键对象是字符串字面量产生的哈希值,哈希值通过哈希函数得到其在哈希数组中的存储索引去存储。不同字符字面量产生的哈希值肯定是不同的,但是通过哈希函数计算转化得到的索引可能相同而发生哈希冲突,所以用链表将它们连起来存同一个索引里面。

2.2.2 值对象

值对象是管理此字符串的 String 类实例对象的引用。


二、存储过程

1. 搜索

任何一个""字符串字面量写出来存在时,都会前往字符串哈希表,根据其字符串字面量产生哈希值,经过哈希函数计算,得到索引位置,往数组索引位置里面的链表去搜索。

根据每一个节点里面存储的键值哈希值判断是否有此字面量常量内容的节点。

  • 如果搜索到已有此节点,就把它的值对象管理此字面量的 String 实例对象引用返回。

2. 创建

  • 如果搜索完发现并没有此哈希值的节点,说明常量池中还没有创建存储有此字符串字面量常量,于是将此字符串字面量及它的一套存储管理结构创建出来:
  1. 将此字面量内容的字符数组在常量池里创上;
  2. 将管理它的String 类实例对象创出:value 填上此数组引用能管理着此字面量字符数组、hash 里填上此字符串字面量的哈希值;
  3. 将存储在哈希表上连着的链表节点创出:键对象存此字面量哈希值、访问着连上、;
值对象存此 String 类实例对象引用
next 为 null
  • 最后将此链表节点连上此哈希表里。
  • 于是就搭建好了从哈希表链表节点到字符串常量池字面量字符数组的访问管理路径结构。


    三、存储位置

    • 字符串常量池、字符串哈希表都存储在堆区;
    • char[] ChArray = new char[]{'a','b','c'},创建出的字符数组存储在堆区中字符串常量池外的部分;
    • 当 new String(ChArray) 时,会把此在外部分堆区的字符数组拷贝再创一份在外堆指着管理它。

    四、存储操作

    1. new 新建

    String s = new String("hello");
    

    new String("hello"),""写出来时就已经创建存在有了在常量池的此字面量字符数组、管理此在常量池字符数组的String 类实例对象、在哈希表存储连着它 String 引用访问信息的链表节点这一套对象,但new 时是一定会执行创对象的,即在堆中 new 出再创出一个 String 类实例对象,它同样一起指着管理着此常量池字面量字符数组。

    2. intern 入池

    s.intern();
    

    s.intern(),将此字符串的字面量从字符串哈希表出发往字符串常量池检查是否在常量池存在,映射到索引对应的链表搜索完后,如果没有此哈希值的链表节点,说明常量池中不存在此字符串字面量,就在哈希表此位置中创建节点连它这个 String 实例对象,并将此在堆中的字符数组移到常量池中。

    就将此堆中的字符数组入池改造成了哈希表节点、String 实例对象、字符串常量池字符数组一套管理的字符串字面量常量。

    目录

    1. 一、存储结构
    2. 1. 字符串常量池
    3. 2. 字符串哈希表
    4. 2.1 结构
    5. 2.2 基础存储单位
    6. 2.2.1 键对象
    7. 2.2.2 值对象
    8. 二、存储过程
    9. 1. 搜索
    10. 2. 创建
    11. 三、存储位置
    12. 四、存储操作
    13. 1. new 新建
    14. 2. intern 入池
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • 从 Alpaca 到 Vicuna:用 Llama Factory 切换对话模板
    • C++ 仿函数详解:对象像函数一样调用
    • SQL Join 实战:WHERE 与 ON 条件的性能差异解析
    • Java 并发编程基石:深入理解 synchronized 与 volatile 关键字
    • C++ 实现 2048 小游戏核心逻辑与代码解析
    • 大模型应用开发极简入门:GPT-4 原理与 LangChain 实战
    • C++ 实现 Java 风格 Stream API 的思路与代码
    • 城市场景下无人机三维路径规划的多目标粒子群优化算法 NMOPSO
    • Git 项目远程源迁移与本地初始化指南
    • Neo4j Desktop 2.0 安装教程:自定义安装路径
    • OpenRouter 详解:全球 AI 模型聚合平台与免费资源指南
    • Java Swing 文本输入框交互与事件监听实战
    • 深入理解 Linux 系统文件 I/O:从 open 到重定向的底层逻辑
    • VS Code 远程连接服务器后 GitHub Copilot 无法使用的解决方案
    • LLaMA Factory 大模型微调实战指南
    • Web技术核心与安全风险(三)Web 后端安全
    • AI 与大模型的核心差异深度解析
    • 基于 OpenClaw 与飞书集成构建 AI 新闻推送机器人
    • 前端静态项目快速启动:python -m http.server 与 npx serve 对比
    • Git 安装流程与基础使用步骤

    相关免费在线工具

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online