当前位置: 首页 > news >正文

【数据结构】String字符串的存储

目录

一、存储结构

1.字符串常量池

2.字符串哈希表

2.1结构

2.2基础存储单位

2.2.1键对象

2.2.2值对象

二、存储过程

1.搜索

2.创建

三、存储位置

四、存储操作

1.new新建

2.intern入池


这是String类的详解: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
  4. 最后将此链表节点 连上此哈希表里

于是就搭建好了 哈希表 链表节点 到字符串常量池 字面量字符数组 的访问管理路径结构


三、存储位置

  • 字符串常量池字符串哈希表都存储在堆区
  • 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实例对象、字符串常量池字符数组 一套管理的 字符串字面量常量

相关文章:

  • React memo
  • C++八股--three day --设计模式之单例和工厂
  • 【数据结构】励志大厂版·初阶(复习+刷题):栈与队列
  • 系统架构设计师:设计模式——结构型设计模式
  • MCP智能体意图识别与工具路由:让AI自主决策调用链路
  • Oracle无法正常OPEN(三)
  • Webug4.0靶场通关笔记13- 第22关越权修改密码
  • 【Linux网络编程】http协议的状态码,常见请求方法以及cookie-session
  • AE脚本 关键帧缓入缓出曲线调节工具 Flow v1.5.0 Win/Mac
  • AI 生成内容的版权困境:法律、技术与伦理的三重挑战
  • 使用 Java 实现一个简单且高效的任务调度框架
  • Laravel Octane 项目加速与静态资源优化指南
  • Lebesgue测度和积分理论发展概观
  • 初学python的我开始Leetcode题8-3
  • 使用QtCreator创建项目(3)
  • C++异常处理
  • python多线程输入字符和写入文件
  • Centos7.9 安装mysql5.7
  • 【CV数据集】Visdrone2019无人机目标检测数据集(YOLO、VOC、COCO格式)
  • 今日行情明日机会——20250430
  • 谢震业领衔挑战世界顶尖高手,这场长三角田径钻石赛值得期待
  • 向左繁华都市,向右和美乡村,嘉兴如何打造城乡融合发展样本
  • 王毅谈金砖国家反恐和网络安全合作
  • 国台办:提醒相关人员不要假借去第三地名义绕道赴台
  • 徐徕任上海浦东新区副区长
  • 发布亮眼一季度报后,东阿阿胶股价跌停:现金流隐忧引发争议